tx · DF1i5cugQt1rf6irM5stYXv2dUkWzfLNM4rCjQCYzdwv

3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us:  -0.13500000 Waves

2022.09.21 17:00 [2238990] smart account 3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us > SELF 0.00000000 Waves

{ "type": 13, "id": "DF1i5cugQt1rf6irM5stYXv2dUkWzfLNM4rCjQCYzdwv", "fee": 13500000, "feeAssetId": null, "timestamp": 1663768886759, "version": 2, "chainId": 84, "sender": "3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us", "senderPublicKey": "Fde5uhpJbFyNR686oXgTi64Bk9LBabxZiNKCncCk6vKz", "proofs": [ "56THZH2GQ8db2indkaP41JCMcfeR1Yb8iQf6XSxsdPBw9zycWC2Pr1ymZD7v3s9CUghG6hnt97K9JmBvcXesAoe1", "5t5SaaFtMkVL6ry9oVcVWdqT6g3N1MXi8xXz9MbC7wmHN5eUGEZuFTHToQkgCpRYevn4FqHdTHtF6vtDsw8kXZUm" ], "script": "base64:BgJlCAISBAoCEQESBQoDCAEBEgQKAgEEEgQKAhEIEgMKAQESBgoECAgBCBIECgIIARIDCgEREgQKAhEBEgUKAwEICBIECgIIARIFCgMIAQESABIAEgQKAhEEEgQKAgEBEgASABIAEgBUAAlQUkVDSVNJT04AwIQ9AAVNQVhfQQDAhD0ADE1BWF9BX0NIQU5HRQAKAAhERUNJTUFMUwAGAA1NSU5fUkFNUF9USU1FCQBpAgCAowUAPAAHdmVyc2lvbgIFMy4wLjAACGtWZXJzaW9uAgd2ZXJzaW9uAAdrQXNzZXRzAglhc3NldF9pZHMADWtBc3NldEJhbGFuY2UCCF9iYWxhbmNlAAdrQWN0aXZlAgZhY3RpdmUABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uABJrREFwcFRocmVzaG9sZENvZWYCEWRBcHBUaHJlc2hvbGRDb2VmAAxrVVNETkFkZHJlc3MCGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAKa0Rpc2NvdW50cwIJZGlzY291bnRzAA9rRGlzY291bnRWYWx1ZXMCD2Rpc2NvdW50X3ZhbHVlcwAOa1VzZXJTd29wSW5Hb3YCDF9TV09QX2Ftb3VudAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIFBHRoaXMIBQFpBmNhbGxlcgUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ABGJpZzIJALYCAQACAA5ibG9ja1RpbWVzdGFtcAUGaGVpZ2h0AQZhc3NlcnQBAWEDBQFhBwYBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQh1c2VyQWRkcgQEdXNlcgQHJG1hdGNoMAUIdXNlckFkZHIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBdQUHJG1hdGNoMAkApQgBBQF1AwkAAQIFByRtYXRjaDACBlN0cmluZwQBdQUHJG1hdGNoMAUBdQkAAgECGFVua25vdyB0eXBlIG9mIHVzZXIgQWRkcgQKc3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHVzZXIFDmtVc2VyU3dvcEluR292AAAEDmRpc2NvdW50VmFsdWVzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUPa0Rpc2NvdW50VmFsdWVzAgEsBAlkaXNjb3VudHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQprRGlzY291bnRzAgEsAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwACAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAEBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwADAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAECQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAQFCWZlZVNjYWxlNgECX0EABAJ0MQUNZnV0dXJlX0FfdGltZQQCQTEFCGZ1dHVyZV9BAwkAZgIFAnQxBQ5ibG9ja1RpbWVzdGFtcAQCQTAFCWluaXRpYWxfQQQCdDAFDmluaXRpYWxfQV90aW1lAwkAZgIFAkExBQJBMAkAZAIFAkEwCQBpAgkAaAIJAGUCBQJBMQUCQTAJAGUCBQ5ibG9ja1RpbWVzdGFtcAUCdDAJAGUCBQJ0MQUCdDAJAGUCBQJBMAkAaQIJAGgCCQBlAgUCQTAFAkExCQBlAgUOYmxvY2tUaW1lc3RhbXAFAnQwCQBlAgUCdDEFAnQwBQJBMQEDX3hwAAoBDWFzc2V0QmFsYW5jZXMCA2FjYwdhc3NldElkCQDNCAIFA2FjYwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB2Fzc2V0SWQFDWtBc3NldEJhbGFuY2UAAAoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENYXNzZXRCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBf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TkFkZHJlc3MJAJQKAgIOdW5sb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UEDSR0MDEwNjc4MTA3NDQJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDEwNjc4MTA3NDQCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTA2NzgxMDc0NAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQNJHQwMTA4MzAxMDg5NgkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTA4MzAxMDg5NgJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMDgzMDEwODk2Al8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQVzdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTEwODMxMTE4NQkBEWNhbGNTdGFraW5nUGFyYW1zAwYFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTEwODMxMTE4NQJfMQQEYWRkcggFDSR0MDExMDgzMTExODUCXzIEBnBhcmFtcwgFDSR0MDExMDgzMTExODUCXzMECHBheW1lbnRzCAUNJHQwMTEwODMxMTE4NQJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABB3Vuc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExMzcwMTE0NzMJARFjYWxjU3Rha2luZ1BhcmFtcwMHBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExMzcwMTE0NzMCXzEEBGFkZHIIBQ0kdDAxMTM3MDExNDczAl8yBAZwYXJhbXMIBQ0kdDAxMTM3MDExNDczAl8zBAhwYXltZW50cwgFDSR0MDExMzcwMTE0NzMCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQxzdGFrZWRBbW91bnQBB2Fzc2V0SWQEFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDYUlkBQckbWF0Y2gwAwkAAAIFA2FJZAUEVVNETgkAmggCBRJzdGFraW5nVVNETkFkZHJlc3MJAKwCAgkArAICCQCsAgICDHJwZF9iYWxhbmNlXwkA2AQBBQNhSWQCAV8JAKUIAQUEdGhpcwAAAwkAAQIFByRtYXRjaDACBFVuaXQAAAkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gwBRZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQAAAQ9jaGVja1N1c3BpY2lvdXMABBBjb250cmFjdEJhbGFuY2VzCQEDX3hwAAoBDGNoZWNrQmFsYW5jZQIDYWNjB2Fzc2V0SWQEDSR0MDEyMDg0MTIxMDkFA2FjYwQKc3VzcGljaW91cwgFDSR0MDEyMDg0MTIxMDkCXzEEAWkIBQ0kdDAxMjA4NDEyMTA5Al8yAwUKc3VzcGljaW91cwkAlAoCBQpzdXNwaWNpb3VzBQFpBAhhQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwkA2QQBBQdhc3NldElkCQEMc3Rha2VkQW1vdW50AQkA2QQBBQdhc3NldElkAwkAZgIJAJEDAgUQY29udHJhY3RCYWxhbmNlcwUBaQUIYUJhbGFuY2UJAJQKAgYFAWkJAJQKAgcJAGQCBQFpAAEKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIHAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGNoZWNrQmFsYW5jZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEXN1c3BlbmRTdXNwaWNpb3VzAQFpCQEHc3VzcGVuZAEJAKwCAgIdU3VzcGljaW91cyBzdGF0ZSB3aXRoIGFzc2V0OiAJAJEDAgUIYXNzZXRJZHMFAWkBDnJldHVyblBheW1lbnRzAgZjYWxsZXIIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHcGF5bWVudAkAzQgCBQNhY2MJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcggFB3BheW1lbnQGYW1vdW50CAUHcGF5bWVudAdhc3NldElkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwESY2hlY2tEQXBwVGhyZXNob2xkAQtuZXdCYWxhbmNlcwQRZEFwcFRocmVzaG9sZENvZWYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBRJrREFwcFRocmVzaG9sZENvZWYCGE5vIGRBcHBUaHJlc2hvbGRDb2VmIGtleQQOdGhyZXNob2xkU2NhbGUAkE4ECm1heEJhbGFuY2UJAJYDAQULbmV3QmFsYW5jZXMECm1pbkJhbGFuY2UJAJcDAQULbmV3QmFsYW5jZXMEBXJhdGlvCQBrAwUKbWF4QmFsYW5jZQUOdGhyZXNob2xkU2NhbGUFCm1pbkJhbGFuY2UDCQBmAgUFcmF0aW8JAGgCBRFkQXBwVGhyZXNob2xkQ29lZgUOdGhyZXNob2xkU2NhbGUJAAIBAjhOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZAcBCmNoZWNrQ29pbnMBCGFzc2V0SWRzBAVjb2lucwkAtQkCBQhhc3NldElkcwIBLAoBCWNoZWNrQ29pbgIFZXJyb3IHYXNzZXRJZAQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQdhc3NldElkCQCsAgICEmZyb21CYXNlNThTdHJpbmc6IAUHYXNzZXRJZAQIZGVjaW1hbHMICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUFYXNzZXQJAKwCAgILYXNzZXRJbmZvOiAFB2Fzc2V0SWQIZGVjaW1hbHMDCQECIT0CBQhkZWNpbWFscwUIREVDSU1BTFMJAAIBAg53cm9uZyBkZWNpbWFscwcKAAIkbAUFY29pbnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJY2hlY2tDb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADxQDbXNnAQFEAgJ4cANhbXAEAUQJAQ5nZXRfRF9pbnRlcm5hbAIFAnhwBQNhbXAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIBRAUBRAUDbmlsBQFEA21zZwEEaW5pdAMIYXNzZXRJZHMCX0ESX2RBcHBUaHJlc2hvbGRDb2VmAwkBASEBCQCeCAEFBHRoaXMJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkAwkAZwIAAAUCX0EJAAIBAhRBbXAgbXVzdCBiZSBtdXN0ID4gMAMJAGcCAAAFEl9kQXBwVGhyZXNob2xkQ29lZgkAAgECH2RBcHAgVGhyZXNob2xkIENvZWYgbXVzdCBiZSA+IDAECXNoYXJlTmFtZQILc19NdWx0aV9VU0QEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgJCU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIE11bHRpU3RhYmxlIFVTRCBwb29sIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMECmlzc3VlVG9rZW4JAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uAAAABgYEB3Rva2VuSWQJALgIAQUKaXNzdWVUb2tlbgMJAQpjaGVja0NvaW5zAQUIYXNzZXRJZHMJAQV0aHJvdwAJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgUHa0Fzc2V0cwUIYXNzZXRJZHMJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUEa0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAg1iYXNlX2ZlZV9mbGF0CQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa0RBcHBUaHJlc2hvbGRDb2VmBRJfZEFwcFRocmVzaG9sZENvZWYJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIFCmlzc3VlVG9rZW4FA25pbANtc2cBDGFkZExpcXVpZGl0eQINbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMAMJAAACBQtzaGFyZVN1cHBseQAAAAAJAQdnZXRETWVtAgUCeHAFA2FtcAQIcGF5bWVudHMIBQNtc2cIcGF5bWVudHMEDHBheW1lbnRzU2l6ZQkAkAMBBQhwYXltZW50cwoBDXZhbGlkUGF5bWVudHMBAW4DCQBmAgUMcGF5bWVudHNTaXplBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUMcGF5bWVudHNTaXplCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUMcGF5bWVudHNTaXplBwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMKAQxwYXltYW50VmFsaWQCA2FjYwdwYXltZW50AwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQGCQACAQIYSW52YWxpZCBhc3NldCBpbiBwYXltZW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBheW1hbnRWYWxpZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8DCQEBIQEJAQ12YWxpZFBheW1lbnRzAQUMcGF5bWVudHNTaXplCQEFdGhyb3cABApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcgUIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHYXNzZXRJZAQNJHQwMTYxMjUxNjE1NAUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDE2MTI1MTYxNTQCXzEEAWkIBQ0kdDAxNjEyNTE2MTU0Al8yBAFqCAUNJHQwMTYxMjUxNjE1NAJfMwMDCQBmAgUMcGF5bWVudHNTaXplBQFqCQAAAgkBDWdldFN0ckFzc2V0SWQBCAkAkQMCBQhwYXltZW50cwUBagdhc3NldElkBQdhc3NldElkBwkAlQoDCQDNCAIFC25ld0JhbGFuY2VzCQBkAgkAkQMCBQJ4cAUBaQgJAJEDAgUIcGF5bWVudHMFAWoGYW1vdW50CQBkAgUBaQABCQBkAgUBagABCQCVCgMJAM0IAgULbmV3QmFsYW5jZXMJAJEDAgUCeHAFAWkJAGQCBQFpAAEFAWoEDSR0MDE2Mzc0MTY0NjAKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXBhcnNlUGF5bWVudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDE2Mzc0MTY0NjACXzEEAWsIBQ0kdDAxNjM3NDE2NDYwAl8yBA5wYXJzZWRQYXltZW50cwgFDSR0MDE2Mzc0MTY0NjACXzMDCQBmAgUMcGF5bWVudHNTaXplBQ5wYXJzZWRQYXltZW50cwkAAgECF0luY29yZWN0IHBheW1lbnRzIG9yZGVyAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDE2ODYxMTY5MDIFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAxNjg2MTE2OTAyAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTY4NjExNjkwMgJfMgQBaQgFDSR0MDE2ODYxMTY5MDICXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYEDGZpbmFsQmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBANwbXQJAGUCBQpuZXdCYWxhbmNlCQCRAwIFAnhwBQFpBAZscEZlZXMJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwQDaW52AwkAZgIFA3BtdAAACQEFc3Rha2UCCQBlAgUDcG10BQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANpbnYJAQVzdGFrZQIFCm5ld0JhbGFuY2UJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxODYwNzE4Njk1CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC2ludkJhbGFuY2VzCAUNJHQwMTg2MDcxODY5NQJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDE4NjA3MTg2OTUCXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BQNuaWwDCQAAAgUBcwUBcwkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUMc2hhcmVBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAUDbmlsA21zZwEOY2FsY01pbnRBbW91bnQCC25ld0JhbGFuY2VzBHVzZXIEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkAAAIFC3NoYXJlU3VwcGx5AAAJAJQKAgUDbmlsBQJEMQQCRDAJAQdnZXRETWVtAgUCeHAFA2FtcAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEFBHVzZXIKAQ9jYWxjSW52QmFsYW5jZXMCA2FjYwpuZXdCYWxhbmNlBA0kdDAxOTg4NDE5OTEwBQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMTk4ODQxOTkxMAJfMQQBaQgFDSR0MDE5ODg0MTk5MTACXzIEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzCQCUCgIJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAGQCBQFpAAEEDSR0MDIwNTEyMjA1ODIKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjSW52QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtpbnZCYWxhbmNlcwgFDSR0MDIwNTEyMjA1ODICXzEEAWsIBQ0kdDAyMDUxMjIwNTgyAl8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAptaW50QW1vdW50CQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwCQCUCgIFA25pbAUKbWludEFtb3VudANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnBmNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMjYxNzIyNjQzBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjI2MTcyMjY0MwJfMQQBaQgFDSR0MDIyNjE3MjI2NDMCXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUDX2R5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjI4OTQyMjk1NQoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjI4OTQyMjk1NQJfMQQBaQgFDSR0MDIyODk0MjI5NTUCXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAXMJAQVzdGFrZQIIBQdwYXltZW50BmFtb3VudAkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkAwkAAAIFAXMFAXMEAnVzCQEHdW5zdGFrZQIFA19keQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzBAZscEZlZXMJAGUCBQRfZmVlBQ5nb3Zlcm5hbmNlRmVlcwQHYWlyZHJvcAMJAGYCBQZscEZlZXMAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3Rva2VuT3V0QjU4BQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUDX2R5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgFA25pbAkAzAgCBQJkeQkAzAgCBQt0b2tlbk91dEI1OAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEId2l0aGRyYXcBCm1pbkFtb3VudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECXBtdEFtb3VudAgJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzCgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwdiYWxhbmNlBA0kdDAyNDI0NjI0Mjc0BQNhY2MEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyNDI0NjI0Mjc0Al8xBAFpCAUNJHQwMjQyNDYyNDI3NAJfMgQHd0Ftb3VudAkAawMFB2JhbGFuY2UFCXBtdEFtb3VudAULc2hhcmVTdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjQ3NjQyNDgzMgoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQNc2NyaXB0QWN0aW9ucwgFDSR0MDI0NzY0MjQ4MzICXzEEAWkIBQ0kdDAyNDc2NDI0ODMyAl8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFCXBtdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUJcG10QW1vdW50BQNuaWwDbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50AwkAZgIJAJADAQgFA21zZwhwYXltZW50cwAAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbggJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAAABAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEA2ludgkA/AcEBQR0aGlzAgh3aXRoZHJhdwkAzAgCBQptaW5BbW91bnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgIIdG9rZW5PdXQJbWluQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnDG9yaWdpbkNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50CAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50BApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFCnBtdEFzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4ECG91dEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAnhwCQEDX3hwAAQNJHQwMjY3OTYyNjg3OAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFCXBtdEFtb3VudAUIb3V0SW5kZXgIBQNtc2cMb3JpZ2luQ2FsbGVyBAJkeQgFDSR0MDI2Nzk2MjY4NzgCXzEEBmR5X2ZlZQgFDSR0MDI2Nzk2MjY4NzgCXzIDCQEGYXNzZXJ0AQkAZwIFAmR5BQltaW5BbW91bnQJAAIBAhhOb3QgZW5vdWdoIGNvaW5zIHJlbW92ZWQEDmdvdmVybmFuY2VGZWVzCQBrAwUGZHlfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYECmR5X2FuZF9mZWUJAGQCBQJkeQUGZHlfZmVlCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyNzEzNjI3MTYyBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjcxMzYyNzE2MgJfMQQBaQgFDSR0MDI3MTM2MjcxNjICXzIDCQAAAgUBaQUIb3V0SW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUKZHlfYW5kX2ZlZQkAZAIFAWkAAQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQx0b2tlbkJhbGFuY2UJAGQCBQFpAAEEDSR0MDI3MzI5MjczOTAKAAIkbAUCeHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9tYWtlTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDI3MzI5MjczOTACXzEEAXYIBQ0kdDAyNzMyOTI3MzkwAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUJcG10QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCD3dpdGhkcmF3T25lQ29pbgkAzAgCBQh0b2tlbk91dAkAzAgCBQltaW5BbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMjk0MDcyOTQzMwUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI5NDA3Mjk0MzMCXzEEAWkIBQ0kdDAyOTQwNzI5NDMzAl8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIIBQNtc2cGY2FsbGVyBQ9tb25leUJveEFkZHJlc3MJAAIBAiZPbmx5IHRoZSB3YWxsZXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQIYmFsYW5jZXMJAQNfeHAACgEOdGFrZUV4dHJhRnVuZHMCA2FjYwdhc3NldElkBA0kdDAzMTc3NTMxNzkzBQNhY2MEA3N1bQgFDSR0MDMxNzc1MzE3OTMCXzEEAWkIBQ0kdDAzMTc3NTMxNzkzAl8yBAh0b2tlbkI1OAkA2QQBBQdhc3NldElkBAhyQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwUIdG9rZW5CNTgJAQxzdGFrZWRBbW91bnQBBQh0b2tlbkI1OAQMZW5yb2xsQW1vdW50CQBlAgUIckJhbGFuY2UJAJEDAgUIYmFsYW5jZXMFAWkDCQBmAgAABQxlbnJvbGxBbW91bnQJAQdzdXNwZW5kAQkArAICAiBFbnJvbGwgYW1vdW50IG5lZ2F0aXZlIGZvciBhc3NldAUHYXNzZXRJZAQHYWlyZHJvcAMJAGYCBQxlbnJvbGxBbW91bnQAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHRva2VuQjU4BQxlbnJvbGxBbW91bnQFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAZAIFA3N1bQUMZW5yb2xsQW1vdW50CQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAFrCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEOdGFrZUV4dHJhRnVuZHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPAwkAAAIIBQFrAl8xAAAJAAIBAhBObyBtb25leSB0byB0YWtlBQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluUHViS2V5SW52b2tlAwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluczWRrhM=", "height": 2238990, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2qx92co4SR1AudRP8jjYiG4t3DftPsgsLCwded8nqLzr Next: FEcUEJXhGwUGh83PFiPxhWprxuz74UYhMMkCCEK5E5Zw Diff:
OldNewDifferences
3838 let kDiscountValues = "discount_values"
3939
4040 let kUserSwopInGov = "_SWOP_amount"
41-
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"
5341
5442 let kAdminPubKey1 = "admin_pub_1"
5543
10290 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
10391
10492 let stakingAssets = [toBase58String(USDN)]
105-
106-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
107-
108-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
109-
110-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
111-
112-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
11393
11494 let active = getBooleanValue(this, kActive)
11595
299279 else $Tuple2(D, false)
300280 }
301281
302- let $t068406952 = {
282+ let $t061916303 = {
303283 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
304284 let $s = size($l)
305285 let $acc0 = $Tuple2(toBigInt(S), false)
313293
314294 $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)
315295 }
316- let D = $t068406952._1
317- let finished = $t068406952._2
296+ let D = $t061916303._1
297+ let finished = $t061916303._2
318298 if ((finished == false))
319299 then throw(("get_D() not finished with " + toString(D)))
320300 else toInt(D)
340320 let D = get_D(xp_, amp)
341321 let Ann = (amp * nCoins)
342322 func S_c (acc,i) = {
343- let $t075237540 = acc
344- let S_ = $t075237540._1
345- let c = $t075237540._2
323+ let $t068746891 = acc
324+ let S_ = $t068746891._1
325+ let c = $t068746891._2
346326 let x_ = if ((in == i))
347327 then x
348328 else xp_[i]
353333 else $Tuple2(S_, c)
354334 }
355335
356- let $t077487849 = {
336+ let $t070997200 = {
357337 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
358338 let $s = size($l)
359339 let $acc0 = $Tuple2(0, toBigInt(D))
367347
368348 $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)
369349 }
370- let S_ = $t077487849._1
371- let c_ = $t077487849._2
350+ let S_ = $t070997200._1
351+ let c_ = $t070997200._2
372352 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
373353 let bD = toBigInt(((S_ + (D / Ann)) - D))
374354 func y_proc (acc,_i) = if ((acc._2 == true))
385365 else $Tuple2(y, false)
386366 }
387367
388- let $t083318448 = {
368+ let $t076827799 = {
389369 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
390370 let $s = size($l)
391371 let $acc0 = $Tuple2(toBigInt(D), false)
399379
400380 $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)
401381 }
402- let y = $t083318448._1
403- let finished = $t083318448._2
382+ let y = $t076827799._1
383+ let finished = $t076827799._2
404384 if ((finished == false))
405385 then throw(("getY() not finished with " + toString(y)))
406386 else toInt(y)
414394 else {
415395 let Ann = (A_ * nCoins)
416396 func S_c (acc,i) = {
417- let $t088278844 = acc
418- let S_ = $t088278844._1
419- let c = $t088278844._2
397+ let $t081788195 = acc
398+ let S_ = $t081788195._1
399+ let c = $t081788195._2
420400 let x_ = if (if ((in != i))
421401 then (nCoins > i)
422402 else false)
429409 else $Tuple2(S_, c)
430410 }
431411
432- let $t090649165 = {
412+ let $t084158516 = {
433413 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
434414 let $s = size($l)
435415 let $acc0 = $Tuple2(0, toBigInt(D))
443423
444424 $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)
445425 }
446- let S_ = $t090649165._1
447- let c_ = $t090649165._2
426+ let S_ = $t084158516._1
427+ let c_ = $t084158516._2
448428 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
449429 let bD = toBigInt(((S_ + (D / Ann)) - D))
450430 func y_D_proc (acc,i) = if ((acc._2 == true))
461441 else $Tuple2(y, false)
462442 }
463443
464- let $t096489767 = {
444+ let $t089999118 = {
465445 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
466446 let $s = size($l)
467447 let $acc0 = $Tuple2(toBigInt(D), false)
475455
476456 $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)
477457 }
478- let y = $t096489767._1
479- let finished = $t096489767._2
458+ let y = $t089999118._1
459+ let finished = $t089999118._2
480460 if ((finished == false))
481461 then throw(("get_y_D() not finished with " + toString(y)))
482462 else toInt(y)
493473 let new_y = get_y_D(amp, i, xp, D1)
494474 let dy_0 = (xp[i] - new_y)
495475 func xp_reduced_proc (acc,xp_j) = {
496- let $t01040810437 = acc
497- let xp_reduced = $t01040810437._1
498- let index = $t01040810437._2
476+ let $t097599788 = acc
477+ let xp_reduced = $t097599788._1
478+ let index = $t097599788._2
499479 let dx_expected = if ((index == i))
500480 then (fraction(xp_j, D1, D0) - new_y)
501481 else (xp_j - fraction(xp_j, D1, D0))
502482 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
503483 }
504484
505- let $t01069910763 = {
485+ let $t01005010114 = {
506486 let $l = xp
507487 let $s = size($l)
508488 let $acc0 = $Tuple2(nil, 0)
516496
517497 $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)
518498 }
519- let xp_reduced = $t01069910763._1
520- let index = $t01069910763._2
499+ let xp_reduced = $t01005010114._1
500+ let index = $t01005010114._2
521501 let xp_reduced_i = xp_reduced[i]
522502 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
523503 $Tuple2(dy, (dy_0 - dy))
541521
542522 func calcStakingParams (stake,amount,assetId) = if (stake)
543523 then {
544- let $t01132711393 = calcStakingFuncAndAddres(stake, assetId)
545- let call = $t01132711393._1
546- let stakingAddr = $t01132711393._2
524+ let $t01067810744 = calcStakingFuncAndAddres(stake, assetId)
525+ let call = $t01067810744._1
526+ let stakingAddr = $t01067810744._2
547527 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
548528 }
549529 else {
550- let $t01147911545 = calcStakingFuncAndAddres(stake, assetId)
551- let call = $t01147911545._1
552- let stakingAddr = $t01147911545._2
530+ let $t01083010896 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01083010896._1
532+ let stakingAddr = $t01083010896._2
553533 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
554534 }
555535
556536
557537 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
558538 then {
559- let $t01173211834 = calcStakingParams(true, amount, fromBase58String(assetIdString))
560- let call = $t01173211834._1
561- let addr = $t01173211834._2
562- let params = $t01173211834._3
563- let payments = $t01173211834._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
564544 invoke(addr, call, params, payments)
565545 }
566546 else 0
568548
569549 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
570550 then {
571- let $t01201912122 = calcStakingParams(false, amount, fromBase58String(assetIdString))
572- let call = $t01201912122._1
573- let addr = $t01201912122._2
574- let params = $t01201912122._3
575- let payments = $t01201912122._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
576556 invoke(addr, call, params, payments)
577557 }
578558 else 0
601581 func checkSuspicious () = {
602582 let contractBalances = _xp()
603583 func checkBalance (acc,assetId) = {
604- let $t01273312758 = acc
605- let suspicious = $t01273312758._1
606- let i = $t01273312758._2
584+ let $t01208412109 = acc
585+ let suspicious = $t01208412109._1
586+ let i = $t01208412109._2
607587 if (suspicious)
608588 then $Tuple2(suspicious, i)
609589 else {
696676
697677
698678 @Callable(msg)
699-func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
679+func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
700680 then throw("Already initialized")
701681 else if ((0 >= _A))
702682 then throw("Amp must be must > 0")
709689 let tokenId = calculateAssetId(issueToken)
710690 if (checkCoins(assetIds))
711691 then throw()
712- else {
713- 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]
714- if (firstHarvest)
715- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
716- else baseEntry
717- }
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]
718693 }
719694
720695
763738 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
764739 else {
765740 func parsePayments (acc,assetId) = {
766- let $t01706617095 = acc
767- let newBalances = $t01706617095._1
768- let i = $t01706617095._2
769- let j = $t01706617095._3
741+ let $t01612516154 = acc
742+ let newBalances = $t01612516154._1
743+ let i = $t01612516154._2
744+ let j = $t01612516154._3
770745 if (if ((paymentsSize > j))
771746 then (getStrAssetId(payments[j].assetId) == assetId)
772747 else false)
774749 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
775750 }
776751
777- let $t01731517401 = {
752+ let $t01637416460 = {
778753 let $l = assetIds
779754 let $s = size($l)
780755 let $acc0 = $Tuple3(nil, 0, 0)
788763
789764 $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)
790765 }
791- let newBalances = $t01731517401._1
792- let k = $t01731517401._2
793- let parsedPayments = $t01731517401._3
766+ let newBalances = $t01637416460._1
767+ let k = $t01637416460._2
768+ let parsedPayments = $t01637416460._3
794769 if ((paymentsSize > parsedPayments))
795770 then throw("Incorect payments order")
796771 else if (checkDAppThreshold(newBalances))
802777 else {
803778 let feeDiscount = calculateFeeDiscount(msg.caller)
804779 func calcScriptActions (acc,newBalance) = {
805- let $t01780217843 = acc
806- let invBalances = $t01780217843._1
807- let scriptActions = $t01780217843._2
808- let i = $t01780217843._3
780+ let $t01686116902 = acc
781+ let invBalances = $t01686116902._1
782+ let scriptActions = $t01686116902._2
783+ let i = $t01686116902._3
809784 if ((shareSupply > 0))
810785 then {
811786 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
843818 }
844819 }
845820
846- let $t01954819636 = {
821+ let $t01860718695 = {
847822 let $l = newBalances
848823 let $s = size($l)
849824 let $acc0 = $Tuple3(nil, nil, 0)
857832
858833 $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)
859834 }
860- let invBalances = $t01954819636._1
861- let scriptActions = $t01954819636._2
835+ let invBalances = $t01860718695._1
836+ let scriptActions = $t01860718695._2
862837 let D2 = getDMem(invBalances, amp)
863838 let mint_amount = if ((shareSupply == 0))
864839 then D1
897872 let D0 = getDMem(xp, amp)
898873 let feeDiscount = calculateFeeDiscount(user)
899874 func calcInvBalances (acc,newBalance) = {
900- let $t02082520851 = acc
901- let invBalances = $t02082520851._1
902- let i = $t02082520851._2
875+ let $t01988419910 = acc
876+ let invBalances = $t01988419910._1
877+ let i = $t01988419910._2
903878 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
904879 let fees = {
905880 let idealBalance = fraction(D1, xp[i], D0)
912887 $Tuple2((invBalances :+ invariantBalance), (i + 1))
913888 }
914889
915- let $t02145321523 = {
890+ let $t02051220582 = {
916891 let $l = newBalances
917892 let $s = size($l)
918893 let $acc0 = $Tuple2(nil, 0)
926901
927902 $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)
928903 }
929- let invBalances = $t02145321523._1
930- let k = $t02145321523._2
904+ let invBalances = $t02051220582._1
905+ let k = $t02051220582._2
931906 let D2 = getDMem(invBalances, amp)
932907 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
933908 $Tuple2(nil, mintAmount)
982957 then throw("Exchange resulted in fewer coins than expected")
983958 else {
984959 func makeNewBalances (acc,tokenBalance) = {
985- let $t02355823584 = acc
986- let newBalances = $t02355823584._1
987- let i = $t02355823584._2
960+ let $t02261722643 = acc
961+ let newBalances = $t02261722643._1
962+ let i = $t02261722643._2
988963 if ((i == fromIndex))
989964 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
990965 else if ((i == toIndex))
992967 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
993968 }
994969
995- let $t02383523896 = {
970+ let $t02289422955 = {
996971 let $l = xp
997972 let $s = size($l)
998973 let $acc0 = $Tuple2(nil, 0)
1006981
1007982 $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)
1008983 }
1009- let newBalances = $t02383523896._1
1010- let i = $t02383523896._2
984+ let newBalances = $t02289422955._1
985+ let i = $t02289422955._2
1011986 if (checkDAppThreshold(newBalances))
1012987 then throw()
1013988 else {
10491024 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10501025 else {
10511026 func calcScriptActions (acc,balance) = {
1052- let $t02518725215 = acc
1053- let scriptActions = $t02518725215._1
1054- let i = $t02518725215._2
1027+ let $t02424624274 = acc
1028+ let scriptActions = $t02424624274._1
1029+ let i = $t02424624274._2
10551030 let wAmount = fraction(balance, pmtAmount, shareSupply)
10561031 if (assert((wAmount >= minAmounts[i])))
10571032 then throw("Withdrawal resulted in fewer coins than expected")
10631038 }
10641039 }
10651040
1066- let $t02570525773 = {
1041+ let $t02476424832 = {
10671042 let $l = _xp()
10681043 let $s = size($l)
10691044 let $acc0 = $Tuple2(nil, 0)
10771052
10781053 $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)
10791054 }
1080- let scriptActions = $t02570525773._1
1081- let i = $t02570525773._2
1055+ let scriptActions = $t02476424832._1
1056+ let i = $t02476424832._2
10821057 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10831058 }
10841059 }
11431118 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11441119 let tokenOutB58 = fromBase58String(tokenOut)
11451120 let xp = _xp()
1146- let $t02773727819 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147- let dy = $t02773727819._1
1148- let dy_fee = $t02773727819._2
1121+ let $t02679626878 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1122+ let dy = $t02679626878._1
1123+ let dy_fee = $t02679626878._2
11491124 if (assert((dy >= minAmount)))
11501125 then throw("Not enough coins removed")
11511126 else {
11521127 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11531128 let dy_and_fee = (dy + dy_fee)
11541129 func makeNewBalances (acc,tokenBalance) = {
1155- let $t02807728103 = acc
1156- let newBalances = $t02807728103._1
1157- let i = $t02807728103._2
1130+ let $t02713627162 = acc
1131+ let newBalances = $t02713627162._1
1132+ let i = $t02713627162._2
11581133 if ((i == outIndex))
11591134 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11601135 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11611136 }
11621137
1163- let $t02827028331 = {
1138+ let $t02732927390 = {
11641139 let $l = xp
11651140 let $s = size($l)
11661141 let $acc0 = $Tuple2(nil, 0)
11741149
11751150 $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)
11761151 }
1177- let newBalances = $t02827028331._1
1178- let v = $t02827028331._2
1152+ let newBalances = $t02732927390._1
1153+ let v = $t02732927390._2
11791154 if (checkDAppThreshold(newBalances))
11801155 then throw()
11811156 else {
12511226 let balances = _xp()
12521227 let D0 = getDMem(balances, amp)
12531228 func calcNewBalances (acc,balance) = {
1254- let $t03034830374 = acc
1255- let newBalances = $t03034830374._1
1256- let i = $t03034830374._2
1229+ let $t02940729433 = acc
1230+ let newBalances = $t02940729433._1
1231+ let i = $t02940729433._2
12571232 let newBalance = (balance + (if (deposit)
12581233 then amounts[i]
12591234 else -(amounts[i])))
13281303
13291304
13301305 @Callable(msg)
1331-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 $t03177531793 = acc
1312+ let sum = $t03177531793._1
1313+ let i = $t03177531793._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+ })
13321347
13331348
13341349 @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"
41-
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"
5341
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"
6957
7058 let kLPFarmingAddress = "lp_farming"
7159
7260 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7361
7462 func getBase58FromOracle (key) = match getString(oracle, key) {
7563 case string: String =>
7664 fromBase58String(string)
7765 case nothing =>
7866 throw((key + "is empty"))
7967 }
8068
8169
8270 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8371
8472 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8573
8674 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8775
8876 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8977
9078 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
9179
9280 let govAddress = Address(getBase58FromOracle(kGovAddress))
9381
9482 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9583
9684 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9785
9886 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9987
10088 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
10189
10290 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
10391
10492 let stakingAssets = [toBase58String(USDN)]
105-
106-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
107-
108-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
109-
110-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
111-
112-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
11393
11494 let active = getBooleanValue(this, kActive)
11595
11696 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
11797
11898 let shareSupply = getIntegerValue(this, kShareAssetSupply)
11999
120100 let feeScale6 = 1000000
121101
122102 let fee = getIntegerValue(this, kFee)
123103
124104 let feeGovernance = fraction(40, feeScale6, 100)
125105
126106 let initial_A = getIntegerValue(this, "initial_A")
127107
128108 let future_A = getIntegerValue(this, "future_A")
129109
130110 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
131111
132112 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
133113
134114 let assetIds = split(getStringValue(this, kAssets), ",")
135115
136116 let nCoins = size(assetIds)
137117
138118 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
139119
140120
141121 func throwIsActive () = throw("DApp is already active")
142122
143123
144124 func isActive () = if (active)
145125 then unit
146126 else throw("DApp is inactive at this moment")
147127
148128
149129 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
150130 then unit
151131 else throw("Only admin can call this function")
152132
153133
154134 func isSelfCall (i) = if ((this == i.caller))
155135 then unit
156136 else throw("Only contract itself can call this function")
157137
158138
159139 let big2 = toBigInt(2)
160140
161141 let blockTimestamp = height
162142
163143 func assert (a) = if (a)
164144 then false
165145 else true
166146
167147
168148 func calculateFeeDiscount (userAddr) = {
169149 let user = match userAddr {
170150 case u: Address =>
171151 toString(u)
172152 case u: String =>
173153 u
174154 case _ =>
175155 throw("Unknow type of user Addr")
176156 }
177157 let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
178158 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
179159 let discounts = split(getStringValue(oracle, kDiscounts), ",")
180160 if (if ((swopAmount >= parseIntValue(discountValues[0])))
181161 then (parseIntValue(discountValues[1]) > swopAmount)
182162 else false)
183163 then (feeScale6 - parseIntValue(discounts[0]))
184164 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
185165 then (parseIntValue(discountValues[2]) > swopAmount)
186166 else false)
187167 then (feeScale6 - parseIntValue(discounts[1]))
188168 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
189169 then (parseIntValue(discountValues[3]) > swopAmount)
190170 else false)
191171 then (feeScale6 - parseIntValue(discounts[2]))
192172 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
193173 then (parseIntValue(discountValues[4]) > swopAmount)
194174 else false)
195175 then (feeScale6 - parseIntValue(discounts[3]))
196176 else if ((swopAmount >= parseIntValue(discountValues[4])))
197177 then (feeScale6 - parseIntValue(discounts[4]))
198178 else feeScale6
199179 }
200180
201181
202182 func _A () = {
203183 let t1 = future_A_time
204184 let A1 = future_A
205185 if ((t1 > blockTimestamp))
206186 then {
207187 let A0 = initial_A
208188 let t0 = initial_A_time
209189 if ((A1 > A0))
210190 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
211191 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
212192 }
213193 else A1
214194 }
215195
216196
217197 func _xp () = {
218198 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
219199
220200 let $l = assetIds
221201 let $s = size($l)
222202 let $acc0 = nil
223203 func $f0_1 ($a,$i) = if (($i >= $s))
224204 then $a
225205 else assetBalances($a, $l[$i])
226206
227207 func $f0_2 ($a,$i) = if (($i >= $s))
228208 then $a
229209 else throw("List size exceeds 15")
230210
231211 $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)
232212 }
233213
234214
235215 func _xp_mem (xp) = xp
236216
237217
238218 func sumList (acc,element) = (acc + element)
239219
240220
241221 func get_D (xp,amp) = {
242222 let @ = invoke(this, "D", [xp, amp], nil)
243223 if ($isInstanceOf(@, "Int"))
244224 then @
245225 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
246226 }
247227
248228
249229 func get_D_internal (xp,amp) = {
250230 let S = {
251231 let $l = xp
252232 let $s = size($l)
253233 let $acc0 = 0
254234 func $f0_1 ($a,$i) = if (($i >= $s))
255235 then $a
256236 else sumList($a, $l[$i])
257237
258238 func $f0_2 ($a,$i) = if (($i >= $s))
259239 then $a
260240 else throw("List size exceeds 15")
261241
262242 $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)
263243 }
264244 if ((S == 0))
265245 then 0
266246 else {
267247 let Ann = (amp * nCoins)
268248 let AnnS = (toBigInt(Ann) * toBigInt(S))
269249 let Ann1 = toBigInt((Ann - 1))
270250 func Dproc (acc,i) = if ((acc._2 == true))
271251 then acc
272252 else {
273253 let Dprev = acc._1
274254 func D_PProc (D_P,i) = if ((nCoins > i))
275255 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
276256 else D_P
277257
278258 let D_P = {
279259 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
280260 let $s = size($l)
281261 let $acc0 = Dprev
282262 func $f1_1 ($a,$i) = if (($i >= $s))
283263 then $a
284264 else D_PProc($a, $l[$i])
285265
286266 func $f1_2 ($a,$i) = if (($i >= $s))
287267 then $a
288268 else throw("List size exceeds 15")
289269
290270 $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)
291271 }
292272 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
293273 if ((D > Dprev))
294274 then if ((1 >= toInt((D - Dprev))))
295275 then $Tuple2(D, true)
296276 else $Tuple2(D, false)
297277 else if ((1 >= toInt((Dprev - D))))
298278 then $Tuple2(D, true)
299279 else $Tuple2(D, false)
300280 }
301281
302- let $t068406952 = {
282+ let $t061916303 = {
303283 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
304284 let $s = size($l)
305285 let $acc0 = $Tuple2(toBigInt(S), false)
306286 func $f1_1 ($a,$i) = if (($i >= $s))
307287 then $a
308288 else Dproc($a, $l[$i])
309289
310290 func $f1_2 ($a,$i) = if (($i >= $s))
311291 then $a
312292 else throw("List size exceeds 15")
313293
314294 $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)
315295 }
316- let D = $t068406952._1
317- let finished = $t068406952._2
296+ let D = $t061916303._1
297+ let finished = $t061916303._2
318298 if ((finished == false))
319299 then throw(("get_D() not finished with " + toString(D)))
320300 else toInt(D)
321301 }
322302 }
323303
324304
325305 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
326306
327307
328308 func getY (in,out,x,xp_) = if (assert((in != out)))
329309 then throw("same coin")
330310 else if (assert(if ((out >= 0))
331311 then (in >= 0)
332312 else false))
333313 then throw("below zero")
334314 else if (assert(if ((nCoins > out))
335315 then (nCoins > in)
336316 else false))
337317 then throw("above N_COINS")
338318 else {
339319 let amp = _A()
340320 let D = get_D(xp_, amp)
341321 let Ann = (amp * nCoins)
342322 func S_c (acc,i) = {
343- let $t075237540 = acc
344- let S_ = $t075237540._1
345- let c = $t075237540._2
323+ let $t068746891 = acc
324+ let S_ = $t068746891._1
325+ let c = $t068746891._2
346326 let x_ = if ((in == i))
347327 then x
348328 else xp_[i]
349329 if (if ((i != out))
350330 then (nCoins > i)
351331 else false)
352332 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
353333 else $Tuple2(S_, c)
354334 }
355335
356- let $t077487849 = {
336+ let $t070997200 = {
357337 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
358338 let $s = size($l)
359339 let $acc0 = $Tuple2(0, toBigInt(D))
360340 func $f0_1 ($a,$i) = if (($i >= $s))
361341 then $a
362342 else S_c($a, $l[$i])
363343
364344 func $f0_2 ($a,$i) = if (($i >= $s))
365345 then $a
366346 else throw("List size exceeds 15")
367347
368348 $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)
369349 }
370- let S_ = $t077487849._1
371- let c_ = $t077487849._2
350+ let S_ = $t070997200._1
351+ let c_ = $t070997200._2
372352 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
373353 let bD = toBigInt(((S_ + (D / Ann)) - D))
374354 func y_proc (acc,_i) = if ((acc._2 == true))
375355 then acc
376356 else {
377357 let y_prev = acc._1
378358 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
379359 if ((y > y_prev))
380360 then if ((1 >= toInt((y - y_prev))))
381361 then $Tuple2(y, true)
382362 else $Tuple2(y, false)
383363 else if ((1 >= toInt((y_prev - y))))
384364 then $Tuple2(y, true)
385365 else $Tuple2(y, false)
386366 }
387367
388- let $t083318448 = {
368+ let $t076827799 = {
389369 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
390370 let $s = size($l)
391371 let $acc0 = $Tuple2(toBigInt(D), false)
392372 func $f1_1 ($a,$i) = if (($i >= $s))
393373 then $a
394374 else y_proc($a, $l[$i])
395375
396376 func $f1_2 ($a,$i) = if (($i >= $s))
397377 then $a
398378 else throw("List size exceeds 16")
399379
400380 $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)
401381 }
402- let y = $t083318448._1
403- let finished = $t083318448._2
382+ let y = $t076827799._1
383+ let finished = $t076827799._2
404384 if ((finished == false))
405385 then throw(("getY() not finished with " + toString(y)))
406386 else toInt(y)
407387 }
408388
409389
410390 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
411391 then throw("i below zero")
412392 else if (assert((nCoins > in)))
413393 then throw("i above N_COINS")
414394 else {
415395 let Ann = (A_ * nCoins)
416396 func S_c (acc,i) = {
417- let $t088278844 = acc
418- let S_ = $t088278844._1
419- let c = $t088278844._2
397+ let $t081788195 = acc
398+ let S_ = $t081788195._1
399+ let c = $t081788195._2
420400 let x_ = if (if ((in != i))
421401 then (nCoins > i)
422402 else false)
423403 then xp[i]
424404 else 0
425405 if (if ((nCoins > i))
426406 then (in != i)
427407 else false)
428408 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
429409 else $Tuple2(S_, c)
430410 }
431411
432- let $t090649165 = {
412+ let $t084158516 = {
433413 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
434414 let $s = size($l)
435415 let $acc0 = $Tuple2(0, toBigInt(D))
436416 func $f0_1 ($a,$i) = if (($i >= $s))
437417 then $a
438418 else S_c($a, $l[$i])
439419
440420 func $f0_2 ($a,$i) = if (($i >= $s))
441421 then $a
442422 else throw("List size exceeds 15")
443423
444424 $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)
445425 }
446- let S_ = $t090649165._1
447- let c_ = $t090649165._2
426+ let S_ = $t084158516._1
427+ let c_ = $t084158516._2
448428 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
449429 let bD = toBigInt(((S_ + (D / Ann)) - D))
450430 func y_D_proc (acc,i) = if ((acc._2 == true))
451431 then acc
452432 else {
453433 let y_prev = acc._1
454434 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
455435 if ((y > y_prev))
456436 then if ((1 >= toInt((y - y_prev))))
457437 then $Tuple2(y, true)
458438 else $Tuple2(y, false)
459439 else if ((1 >= toInt((y_prev - y))))
460440 then $Tuple2(y, true)
461441 else $Tuple2(y, false)
462442 }
463443
464- let $t096489767 = {
444+ let $t089999118 = {
465445 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
466446 let $s = size($l)
467447 let $acc0 = $Tuple2(toBigInt(D), false)
468448 func $f1_1 ($a,$i) = if (($i >= $s))
469449 then $a
470450 else y_D_proc($a, $l[$i])
471451
472452 func $f1_2 ($a,$i) = if (($i >= $s))
473453 then $a
474454 else throw("List size exceeds 16")
475455
476456 $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)
477457 }
478- let y = $t096489767._1
479- let finished = $t096489767._2
458+ let y = $t089999118._1
459+ let finished = $t089999118._2
480460 if ((finished == false))
481461 then throw(("get_y_D() not finished with " + toString(y)))
482462 else toInt(y)
483463 }
484464
485465
486466 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
487467 let feeDiscount = calculateFeeDiscount(caller)
488468 let amp = _A()
489469 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
490470 let total_supply = shareSupply
491471 let D0 = get_D(xp, amp)
492472 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
493473 let new_y = get_y_D(amp, i, xp, D1)
494474 let dy_0 = (xp[i] - new_y)
495475 func xp_reduced_proc (acc,xp_j) = {
496- let $t01040810437 = acc
497- let xp_reduced = $t01040810437._1
498- let index = $t01040810437._2
476+ let $t097599788 = acc
477+ let xp_reduced = $t097599788._1
478+ let index = $t097599788._2
499479 let dx_expected = if ((index == i))
500480 then (fraction(xp_j, D1, D0) - new_y)
501481 else (xp_j - fraction(xp_j, D1, D0))
502482 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
503483 }
504484
505- let $t01069910763 = {
485+ let $t01005010114 = {
506486 let $l = xp
507487 let $s = size($l)
508488 let $acc0 = $Tuple2(nil, 0)
509489 func $f0_1 ($a,$i) = if (($i >= $s))
510490 then $a
511491 else xp_reduced_proc($a, $l[$i])
512492
513493 func $f0_2 ($a,$i) = if (($i >= $s))
514494 then $a
515495 else throw("List size exceeds 15")
516496
517497 $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)
518498 }
519- let xp_reduced = $t01069910763._1
520- let index = $t01069910763._2
499+ let xp_reduced = $t01005010114._1
500+ let index = $t01005010114._2
521501 let xp_reduced_i = xp_reduced[i]
522502 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
523503 $Tuple2(dy, (dy_0 - dy))
524504 }
525505
526506
527507 func getStrAssetId (assetId) = match assetId {
528508 case id: ByteVector =>
529509 toBase58String(id)
530510 case waves: Unit =>
531511 "WAVES"
532512 case _ =>
533513 throw("Match error")
534514 }
535515
536516
537517 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
538518 then $Tuple2("lockNeutrino", stakingUSDNAddress)
539519 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
540520
541521
542522 func calcStakingParams (stake,amount,assetId) = if (stake)
543523 then {
544- let $t01132711393 = calcStakingFuncAndAddres(stake, assetId)
545- let call = $t01132711393._1
546- let stakingAddr = $t01132711393._2
524+ let $t01067810744 = calcStakingFuncAndAddres(stake, assetId)
525+ let call = $t01067810744._1
526+ let stakingAddr = $t01067810744._2
547527 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
548528 }
549529 else {
550- let $t01147911545 = calcStakingFuncAndAddres(stake, assetId)
551- let call = $t01147911545._1
552- let stakingAddr = $t01147911545._2
530+ let $t01083010896 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01083010896._1
532+ let stakingAddr = $t01083010896._2
553533 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
554534 }
555535
556536
557537 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
558538 then {
559- let $t01173211834 = calcStakingParams(true, amount, fromBase58String(assetIdString))
560- let call = $t01173211834._1
561- let addr = $t01173211834._2
562- let params = $t01173211834._3
563- let payments = $t01173211834._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
564544 invoke(addr, call, params, payments)
565545 }
566546 else 0
567547
568548
569549 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
570550 then {
571- let $t01201912122 = calcStakingParams(false, amount, fromBase58String(assetIdString))
572- let call = $t01201912122._1
573- let addr = $t01201912122._2
574- let params = $t01201912122._3
575- let payments = $t01201912122._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
576556 invoke(addr, call, params, payments)
577557 }
578558 else 0
579559
580560
581561 func stakedAmount (assetId) = {
582562 let stakedAmountCalculated = match assetId {
583563 case aId: ByteVector =>
584564 if ((aId == USDN))
585565 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
586566 else 0
587567 case _: Unit =>
588568 0
589569 case _ =>
590570 throw("Match error")
591571 }
592572 match stakedAmountCalculated {
593573 case i: Int =>
594574 i
595575 case _ =>
596576 0
597577 }
598578 }
599579
600580
601581 func checkSuspicious () = {
602582 let contractBalances = _xp()
603583 func checkBalance (acc,assetId) = {
604- let $t01273312758 = acc
605- let suspicious = $t01273312758._1
606- let i = $t01273312758._2
584+ let $t01208412109 = acc
585+ let suspicious = $t01208412109._1
586+ let i = $t01208412109._2
607587 if (suspicious)
608588 then $Tuple2(suspicious, i)
609589 else {
610590 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
611591 if ((contractBalances[i] > aBalance))
612592 then $Tuple2(true, i)
613593 else $Tuple2(false, (i + 1))
614594 }
615595 }
616596
617597 let $l = assetIds
618598 let $s = size($l)
619599 let $acc0 = $Tuple2(false, 0)
620600 func $f0_1 ($a,$i) = if (($i >= $s))
621601 then $a
622602 else checkBalance($a, $l[$i])
623603
624604 func $f0_2 ($a,$i) = if (($i >= $s))
625605 then $a
626606 else throw("List size exceeds 15")
627607
628608 $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)
629609 }
630610
631611
632612 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
633613
634614
635615 func returnPayments (caller,payments) = {
636616 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
637617
638618 let $l = payments
639619 let $s = size($l)
640620 let $acc0 = nil
641621 func $f0_1 ($a,$i) = if (($i >= $s))
642622 then $a
643623 else parsePayments($a, $l[$i])
644624
645625 func $f0_2 ($a,$i) = if (($i >= $s))
646626 then $a
647627 else throw("List size exceeds 15")
648628
649629 $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)
650630 }
651631
652632
653633 func checkDAppThreshold (newBalances) = {
654634 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
655635 let thresholdScale = 10000
656636 let maxBalance = max(newBalances)
657637 let minBalance = min(newBalances)
658638 let ratio = fraction(maxBalance, thresholdScale, minBalance)
659639 if ((ratio > (dAppThresholdCoef * thresholdScale)))
660640 then throw("New balance in assets of the DApp is less than threshold")
661641 else false
662642 }
663643
664644
665645 func checkCoins (assetIds) = {
666646 let coins = split(assetIds, ",")
667647 func checkCoin (error,assetId) = {
668648 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
669649 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
670650 if ((decimals != DECIMALS))
671651 then throw("wrong decimals")
672652 else false
673653 }
674654
675655 let $l = coins
676656 let $s = size($l)
677657 let $acc0 = false
678658 func $f0_1 ($a,$i) = if (($i >= $s))
679659 then $a
680660 else checkCoin($a, $l[$i])
681661
682662 func $f0_2 ($a,$i) = if (($i >= $s))
683663 then $a
684664 else throw("List size exceeds 15")
685665
686666 $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)
687667 }
688668
689669
690670 @Callable(msg)
691671 func D (xp,amp) = {
692672 let D = get_D_internal(xp, amp)
693673 $Tuple2([IntegerEntry("D", D)], D)
694674 }
695675
696676
697677
698678 @Callable(msg)
699-func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
679+func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
700680 then throw("Already initialized")
701681 else if ((0 >= _A))
702682 then throw("Amp must be must > 0")
703683 else if ((0 >= _dAppThresholdCoef))
704684 then throw("dApp Threshold Coef must be > 0")
705685 else {
706686 let shareName = "s_Multi_USD"
707687 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
708688 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
709689 let tokenId = calculateAssetId(issueToken)
710690 if (checkCoins(assetIds))
711691 then throw()
712- else {
713- 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]
714- if (firstHarvest)
715- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
716- else baseEntry
717- }
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]
718693 }
719694
720695
721696
722697 @Callable(msg)
723698 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
724699 let amp = _A()
725700 let xp = _xp()
726701 let D0 = if ((shareSupply == 0))
727702 then 0
728703 else getDMem(xp, amp)
729704 let payments = msg.payments
730705 let paymentsSize = size(payments)
731706 func validPayments (n) = if ((paymentsSize > nCoins))
732707 then throw(("payments size > " + toString(nCoins)))
733708 else if ((1 > paymentsSize))
734709 then throw("payments size < 1")
735710 else if (if ((shareSupply == 0))
736711 then (nCoins != paymentsSize)
737712 else false)
738713 then throw("initial deposit requires all coins")
739714 else {
740715 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
741716 then true
742717 else throw("Invalid asset in payment")
743718
744719 let $l = payments
745720 let $s = size($l)
746721 let $acc0 = false
747722 func $f0_1 ($a,$i) = if (($i >= $s))
748723 then $a
749724 else paymantValid($a, $l[$i])
750725
751726 func $f0_2 ($a,$i) = if (($i >= $s))
752727 then $a
753728 else throw("List size exceeds 15")
754729
755730 $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)
756731 }
757732
758733 if (!(validPayments(paymentsSize)))
759734 then throw()
760735 else {
761736 let suspicious = checkSuspicious()
762737 if (suspicious._1)
763738 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
764739 else {
765740 func parsePayments (acc,assetId) = {
766- let $t01706617095 = acc
767- let newBalances = $t01706617095._1
768- let i = $t01706617095._2
769- let j = $t01706617095._3
741+ let $t01612516154 = acc
742+ let newBalances = $t01612516154._1
743+ let i = $t01612516154._2
744+ let j = $t01612516154._3
770745 if (if ((paymentsSize > j))
771746 then (getStrAssetId(payments[j].assetId) == assetId)
772747 else false)
773748 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
774749 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
775750 }
776751
777- let $t01731517401 = {
752+ let $t01637416460 = {
778753 let $l = assetIds
779754 let $s = size($l)
780755 let $acc0 = $Tuple3(nil, 0, 0)
781756 func $f0_1 ($a,$i) = if (($i >= $s))
782757 then $a
783758 else parsePayments($a, $l[$i])
784759
785760 func $f0_2 ($a,$i) = if (($i >= $s))
786761 then $a
787762 else throw("List size exceeds 15")
788763
789764 $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)
790765 }
791- let newBalances = $t01731517401._1
792- let k = $t01731517401._2
793- let parsedPayments = $t01731517401._3
766+ let newBalances = $t01637416460._1
767+ let k = $t01637416460._2
768+ let parsedPayments = $t01637416460._3
794769 if ((paymentsSize > parsedPayments))
795770 then throw("Incorect payments order")
796771 else if (checkDAppThreshold(newBalances))
797772 then throw()
798773 else {
799774 let D1 = getDMem(newBalances, amp)
800775 if (assert((D1 > D0)))
801776 then throw("D1 > D0")
802777 else {
803778 let feeDiscount = calculateFeeDiscount(msg.caller)
804779 func calcScriptActions (acc,newBalance) = {
805- let $t01780217843 = acc
806- let invBalances = $t01780217843._1
807- let scriptActions = $t01780217843._2
808- let i = $t01780217843._3
780+ let $t01686116902 = acc
781+ let invBalances = $t01686116902._1
782+ let scriptActions = $t01686116902._2
783+ let i = $t01686116902._3
809784 if ((shareSupply > 0))
810785 then {
811786 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
812787 let fees = {
813788 let idealBalance = fraction(D1, xp[i], D0)
814789 let difference = if ((idealBalance > newBalance))
815790 then (idealBalance - newBalance)
816791 else (newBalance - idealBalance)
817792 fraction(_fee, difference, feeScale6)
818793 }
819794 let governanceFees = fraction(fees, feeGovernance, feeScale6)
820795 let finalBalance = (newBalance - fees)
821796 let invariantBalance = (newBalance - fees)
822797 let pmt = (newBalance - xp[i])
823798 let lpFees = (fees - governanceFees)
824799 let inv = if ((pmt > 0))
825800 then stake((pmt - fees), assetIds[i])
826801 else unstake(fees, assetIds[i])
827802 if ((inv == inv))
828803 then {
829804 let airdrop = if ((lpFees > 0))
830805 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
831806 else 0
832807 if ((airdrop == airdrop))
833808 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
834809 else throw("Strict value is not equal to itself.")
835810 }
836811 else throw("Strict value is not equal to itself.")
837812 }
838813 else {
839814 let inv = stake(newBalance, assetIds[i])
840815 if ((inv == inv))
841816 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
842817 else throw("Strict value is not equal to itself.")
843818 }
844819 }
845820
846- let $t01954819636 = {
821+ let $t01860718695 = {
847822 let $l = newBalances
848823 let $s = size($l)
849824 let $acc0 = $Tuple3(nil, nil, 0)
850825 func $f1_1 ($a,$i) = if (($i >= $s))
851826 then $a
852827 else calcScriptActions($a, $l[$i])
853828
854829 func $f1_2 ($a,$i) = if (($i >= $s))
855830 then $a
856831 else throw("List size exceeds 15")
857832
858833 $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)
859834 }
860- let invBalances = $t01954819636._1
861- let scriptActions = $t01954819636._2
835+ let invBalances = $t01860718695._1
836+ let scriptActions = $t01860718695._2
862837 let D2 = getDMem(invBalances, amp)
863838 let mint_amount = if ((shareSupply == 0))
864839 then D1
865840 else fraction(shareSupply, (D2 - D0), D0)
866841 if (assert((mint_amount >= minMintAmount)))
867842 then throw("Slippage screwed you")
868843 else if (stakeFarming)
869844 then {
870845 let re = invoke(this, "reissueShare", [mint_amount], nil)
871846 if ((re == re))
872847 then {
873848 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
874849 if ((s == s))
875850 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
876851 else throw("Strict value is not equal to itself.")
877852 }
878853 else throw("Strict value is not equal to itself.")
879854 }
880855 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
881856 }
882857 }
883858 }
884859 }
885860 })
886861
887862
888863
889864 @Callable(msg)
890865 func calcMintAmount (newBalances,user) = {
891866 let amp = _A()
892867 let xp = _xp()
893868 let D1 = getDMem(newBalances, amp)
894869 if ((shareSupply == 0))
895870 then $Tuple2(nil, D1)
896871 else {
897872 let D0 = getDMem(xp, amp)
898873 let feeDiscount = calculateFeeDiscount(user)
899874 func calcInvBalances (acc,newBalance) = {
900- let $t02082520851 = acc
901- let invBalances = $t02082520851._1
902- let i = $t02082520851._2
875+ let $t01988419910 = acc
876+ let invBalances = $t01988419910._1
877+ let i = $t01988419910._2
903878 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
904879 let fees = {
905880 let idealBalance = fraction(D1, xp[i], D0)
906881 let difference = if ((idealBalance > newBalance))
907882 then (idealBalance - newBalance)
908883 else (newBalance - idealBalance)
909884 fraction(_fee, difference, feeScale6)
910885 }
911886 let invariantBalance = (newBalance - fees)
912887 $Tuple2((invBalances :+ invariantBalance), (i + 1))
913888 }
914889
915- let $t02145321523 = {
890+ let $t02051220582 = {
916891 let $l = newBalances
917892 let $s = size($l)
918893 let $acc0 = $Tuple2(nil, 0)
919894 func $f0_1 ($a,$i) = if (($i >= $s))
920895 then $a
921896 else calcInvBalances($a, $l[$i])
922897
923898 func $f0_2 ($a,$i) = if (($i >= $s))
924899 then $a
925900 else throw("List size exceeds 15")
926901
927902 $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)
928903 }
929- let invBalances = $t02145321523._1
930- let k = $t02145321523._2
904+ let invBalances = $t02051220582._1
905+ let k = $t02051220582._2
931906 let D2 = getDMem(invBalances, amp)
932907 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
933908 $Tuple2(nil, mintAmount)
934909 }
935910 }
936911
937912
938913
939914 @Callable(msg)
940915 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
941916
942917
943918
944919 @Callable(msg)
945920 func getDy (assetFrom,assetTo,dx,userAddress) = {
946921 let xp = _xp()
947922 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
948923 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
949924 let x = (xp[fromIndex] + dx)
950925 let y = getY(fromIndex, toIndex, x, xp)
951926 let dy = ((xp[toIndex] - y) - 1)
952927 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
953928 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
954929 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
955930 }
956931
957932
958933
959934 @Callable(msg)
960935 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
961936 then throw("size(payments) != 1")
962937 else {
963938 let suspicious = checkSuspicious()
964939 if (suspicious._1)
965940 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
966941 else {
967942 let payment = msg.payments[0]
968943 let tokenIn = getStrAssetId(payment.assetId)
969944 let tokenOutB58 = fromBase58String(tokenOut)
970945 let dx = payment.amount
971946 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
972947 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
973948 let xp = _xp()
974949 let x = (xp[fromIndex] + dx)
975950 let y = getY(fromIndex, toIndex, x, xp)
976951 let _dy = ((xp[toIndex] - y) - 1)
977952 let feeDiscount = calculateFeeDiscount(msg.caller)
978953 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
979954 let dy = (_dy - _fee)
980955 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
981956 if (assert((dy >= min_dy)))
982957 then throw("Exchange resulted in fewer coins than expected")
983958 else {
984959 func makeNewBalances (acc,tokenBalance) = {
985- let $t02355823584 = acc
986- let newBalances = $t02355823584._1
987- let i = $t02355823584._2
960+ let $t02261722643 = acc
961+ let newBalances = $t02261722643._1
962+ let i = $t02261722643._2
988963 if ((i == fromIndex))
989964 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
990965 else if ((i == toIndex))
991966 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
992967 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
993968 }
994969
995- let $t02383523896 = {
970+ let $t02289422955 = {
996971 let $l = xp
997972 let $s = size($l)
998973 let $acc0 = $Tuple2(nil, 0)
999974 func $f0_1 ($a,$i) = if (($i >= $s))
1000975 then $a
1001976 else makeNewBalances($a, $l[$i])
1002977
1003978 func $f0_2 ($a,$i) = if (($i >= $s))
1004979 then $a
1005980 else throw("List size exceeds 15")
1006981
1007982 $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)
1008983 }
1009- let newBalances = $t02383523896._1
1010- let i = $t02383523896._2
984+ let newBalances = $t02289422955._1
985+ let i = $t02289422955._2
1011986 if (checkDAppThreshold(newBalances))
1012987 then throw()
1013988 else {
1014989 let s = stake(payment.amount, getStrAssetId(payment.assetId))
1015990 if ((s == s))
1016991 then {
1017992 let us = unstake(_dy, tokenOut)
1018993 if ((us == us))
1019994 then {
1020995 let lpFees = (_fee - governanceFees)
1021996 let airdrop = if ((lpFees > 0))
1022997 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1023998 else 0
1024999 if ((airdrop == airdrop))
10251000 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
10261001 else throw("Strict value is not equal to itself.")
10271002 }
10281003 else throw("Strict value is not equal to itself.")
10291004 }
10301005 else throw("Strict value is not equal to itself.")
10311006 }
10321007 }
10331008 }
10341009 })
10351010
10361011
10371012
10381013 @Callable(msg)
10391014 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10401015 then throw("size(payments) != 1")
10411016 else {
10421017 let pmtAmount = msg.payments[0].amount
10431018 let pmtAssetId = msg.payments[0].assetId
10441019 if ((shareAssetId != pmtAssetId))
10451020 then throw("unknown payment token")
10461021 else {
10471022 let suspicious = checkSuspicious()
10481023 if (suspicious._1)
10491024 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10501025 else {
10511026 func calcScriptActions (acc,balance) = {
1052- let $t02518725215 = acc
1053- let scriptActions = $t02518725215._1
1054- let i = $t02518725215._2
1027+ let $t02424624274 = acc
1028+ let scriptActions = $t02424624274._1
1029+ let i = $t02424624274._2
10551030 let wAmount = fraction(balance, pmtAmount, shareSupply)
10561031 if (assert((wAmount >= minAmounts[i])))
10571032 then throw("Withdrawal resulted in fewer coins than expected")
10581033 else {
10591034 let us = unstake(wAmount, assetIds[i])
10601035 if ((us == us))
10611036 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
10621037 else throw("Strict value is not equal to itself.")
10631038 }
10641039 }
10651040
1066- let $t02570525773 = {
1041+ let $t02476424832 = {
10671042 let $l = _xp()
10681043 let $s = size($l)
10691044 let $acc0 = $Tuple2(nil, 0)
10701045 func $f0_1 ($a,$i) = if (($i >= $s))
10711046 then $a
10721047 else calcScriptActions($a, $l[$i])
10731048
10741049 func $f0_2 ($a,$i) = if (($i >= $s))
10751050 then $a
10761051 else throw("List size exceeds 15")
10771052
10781053 $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)
10791054 }
1080- let scriptActions = $t02570525773._1
1081- let i = $t02570525773._2
1055+ let scriptActions = $t02476424832._1
1056+ let i = $t02476424832._2
10821057 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10831058 }
10841059 }
10851060 })
10861061
10871062
10881063
10891064 @Callable(msg)
10901065 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10911066 then throw("Unlock amount must be positive")
10921067 else {
10931068 let suspicious = checkSuspicious()
10941069 if (suspicious._1)
10951070 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10961071 else {
10971072 let pmtAmount = if ((size(msg.payments) > 0))
10981073 then if ((size(msg.payments) != 1))
10991074 then throw("size(payments) != 1")
11001075 else {
11011076 let pmtAssetId = msg.payments[0].assetId
11021077 if ((shareAssetId != pmtAssetId))
11031078 then throw("unknown payment token")
11041079 else msg.payments[0].amount
11051080 }
11061081 else 0
11071082 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11081083 if ((unlock == unlock))
11091084 then {
11101085 let withdrawAmount = (pmtAmount + unlockAmount)
11111086 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
11121087 if ((inv == inv))
11131088 then nil
11141089 else throw("Strict value is not equal to itself.")
11151090 }
11161091 else throw("Strict value is not equal to itself.")
11171092 }
11181093 })
11191094
11201095
11211096
11221097 @Callable(msg)
11231098 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
11241099 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11251100 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
11261101 }
11271102
11281103
11291104
11301105 @Callable(msg)
11311106 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
11321107 then throw("size(payments) != 1")
11331108 else {
11341109 let suspicious = checkSuspicious()
11351110 if (suspicious._1)
11361111 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
11371112 else {
11381113 let pmtAmount = msg.payments[0].amount
11391114 let pmtAssetId = msg.payments[0].assetId
11401115 if ((pmtAssetId != shareAssetId))
11411116 then throw("unknown token")
11421117 else {
11431118 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11441119 let tokenOutB58 = fromBase58String(tokenOut)
11451120 let xp = _xp()
1146- let $t02773727819 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147- let dy = $t02773727819._1
1148- let dy_fee = $t02773727819._2
1121+ let $t02679626878 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1122+ let dy = $t02679626878._1
1123+ let dy_fee = $t02679626878._2
11491124 if (assert((dy >= minAmount)))
11501125 then throw("Not enough coins removed")
11511126 else {
11521127 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11531128 let dy_and_fee = (dy + dy_fee)
11541129 func makeNewBalances (acc,tokenBalance) = {
1155- let $t02807728103 = acc
1156- let newBalances = $t02807728103._1
1157- let i = $t02807728103._2
1130+ let $t02713627162 = acc
1131+ let newBalances = $t02713627162._1
1132+ let i = $t02713627162._2
11581133 if ((i == outIndex))
11591134 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11601135 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11611136 }
11621137
1163- let $t02827028331 = {
1138+ let $t02732927390 = {
11641139 let $l = xp
11651140 let $s = size($l)
11661141 let $acc0 = $Tuple2(nil, 0)
11671142 func $f0_1 ($a,$i) = if (($i >= $s))
11681143 then $a
11691144 else makeNewBalances($a, $l[$i])
11701145
11711146 func $f0_2 ($a,$i) = if (($i >= $s))
11721147 then $a
11731148 else throw("List size exceeds 15")
11741149
11751150 $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)
11761151 }
1177- let newBalances = $t02827028331._1
1178- let v = $t02827028331._2
1152+ let newBalances = $t02732927390._1
1153+ let v = $t02732927390._2
11791154 if (checkDAppThreshold(newBalances))
11801155 then throw()
11811156 else {
11821157 let us = unstake(dy_and_fee, tokenOut)
11831158 if ((us == us))
11841159 then {
11851160 let lpFees = (dy_fee - governanceFees)
11861161 let airdrop = if ((lpFees > 0))
11871162 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11881163 else 0
11891164 if ((airdrop == airdrop))
11901165 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))]
11911166 else throw("Strict value is not equal to itself.")
11921167 }
11931168 else throw("Strict value is not equal to itself.")
11941169 }
11951170 }
11961171 }
11971172 }
11981173 })
11991174
12001175
12011176
12021177 @Callable(msg)
12031178 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
12041179 then throw("Unlock amount must be positive")
12051180 else {
12061181 let suspicious = checkSuspicious()
12071182 if (suspicious._1)
12081183 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
12091184 else {
12101185 let pmtAmount = if ((size(msg.payments) > 0))
12111186 then if ((size(msg.payments) != 1))
12121187 then throw("size(payments) != 1")
12131188 else {
12141189 let pmtAssetId = msg.payments[0].assetId
12151190 if ((shareAssetId != pmtAssetId))
12161191 then throw("unknown payment token")
12171192 else msg.payments[0].amount
12181193 }
12191194 else 0
12201195 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
12211196 if ((unlock == unlock))
12221197 then {
12231198 let withdrawAmount = (pmtAmount + unlockAmount)
12241199 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
12251200 if ((inv == inv))
12261201 then nil
12271202 else throw("Strict value is not equal to itself.")
12281203 }
12291204 else throw("Strict value is not equal to itself.")
12301205 }
12311206 })
12321207
12331208
12341209
12351210 @Callable(msg)
12361211 func A () = $Tuple2(nil, _A())
12371212
12381213
12391214
12401215 @Callable(msg)
12411216 func getVirtualPrice () = {
12421217 let D = get_D(_xp(), _A())
12431218 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12441219 }
12451220
12461221
12471222
12481223 @Callable(msg)
12491224 func calcTokenAmount (amounts,deposit) = {
12501225 let amp = _A()
12511226 let balances = _xp()
12521227 let D0 = getDMem(balances, amp)
12531228 func calcNewBalances (acc,balance) = {
1254- let $t03034830374 = acc
1255- let newBalances = $t03034830374._1
1256- let i = $t03034830374._2
1229+ let $t02940729433 = acc
1230+ let newBalances = $t02940729433._1
1231+ let i = $t02940729433._2
12571232 let newBalance = (balance + (if (deposit)
12581233 then amounts[i]
12591234 else -(amounts[i])))
12601235 $Tuple2((newBalances :+ newBalance), (i + 1))
12611236 }
12621237
12631238 let newBalances = ( let $l = balances
12641239 let $s = size($l)
12651240 let $acc0 = $Tuple2(nil, 0)
12661241 func $f0_1 ($a,$i) = if (($i >= $s))
12671242 then $a
12681243 else calcNewBalances($a, $l[$i])
12691244
12701245 func $f0_2 ($a,$i) = if (($i >= $s))
12711246 then $a
12721247 else throw("List size exceeds 15")
12731248
12741249 $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
12751250 let D1 = getDMem(newBalances, amp)
12761251 let diff = if (deposit)
12771252 then (D1 - D0)
12781253 else (D0 - D1)
12791254 $Tuple2(nil, fraction(diff, shareSupply, D0))
12801255 }
12811256
12821257
12831258
12841259 @Callable(msg)
12851260 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12861261 then throw("too often")
12871262 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12881263 then throw("insufficient time")
12891264 else {
12901265 let _initial_A = _A()
12911266 if (assert(if ((_futureA > 0))
12921267 then (MAX_A > _futureA)
12931268 else false))
12941269 then throw("out of base range")
12951270 else if (assert(if (if ((_futureA >= _initial_A))
12961271 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12971272 else false)
12981273 then true
12991274 else if ((_initial_A > _futureA))
13001275 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
13011276 else false))
13021277 then throw("out of range")
13031278 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
13041279 }))
13051280
13061281
13071282
13081283 @Callable(msg)
13091284 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
13101285 let currentA = _A()
13111286 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
13121287 }))
13131288
13141289
13151290
13161291 @Callable(msg)
13171292 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13181293 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13191294 else suspend("Paused by admin"))
13201295
13211296
13221297
13231298 @Callable(msg)
13241299 func activate () = valueOrElse(isAdminCall(msg), if (active)
13251300 then throwIsActive()
13261301 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13271302
13281303
13291304
13301305 @Callable(msg)
1331-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 $t03177531793 = acc
1312+ let sum = $t03177531793._1
1313+ let i = $t03177531793._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+ })
13321347
13331348
13341349 @Verifier(tx)
13351350 func verify () = {
13361351 let multiSignedByAdmins = {
13371352 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13381353 then 1
13391354 else 0
13401355 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13411356 then 1
13421357 else 0
13431358 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13441359 then 1
13451360 else 0
13461361 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13471362 }
13481363 match tx {
13491364 case inv: InvokeScriptTransaction =>
13501365 let callTakeIntoAccount = if ((inv.dApp == this))
13511366 then (inv.function == "takeIntoAccountExtraFunds")
13521367 else false
13531368 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13541369 then true
13551370 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13561371 then true
13571372 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13581373 then true
13591374 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
13601375 if (if (callTakeIntoAccount)
13611376 then signedByAdmin
13621377 else false)
13631378 then true
13641379 else multiSignedByAdmins
13651380 case _ =>
13661381 multiSignedByAdmins
13671382 }
13681383 }
13691384

github/deemru/w8io/873ac7e 
266.38 ms