tx · 9GDJqh7tMaqmqFFHYGC89reXt68bGsNyNuufFpxj1mEp

3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS:  -0.14000000 Waves

2022.10.18 17:28 [2277958] smart account 3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS > SELF 0.00000000 Waves

{ "type": 13, "id": "9GDJqh7tMaqmqFFHYGC89reXt68bGsNyNuufFpxj1mEp", "fee": 14000000, "feeAssetId": null, "timestamp": 1666103317671, "version": 2, "chainId": 84, "sender": "3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS", "senderPublicKey": "C7xgcYqQ8qV8rmvzAjhQWq4cz82F6VJfXMNygvrTXsfW", "proofs": [ "5ok3inTw1mx5aWJDiaKiLpn8LENUaD54tsUqRnoki5hne2iazVeRu3zrh58QfwRB4hztFD8KBXutsz8DoDUJe4sD", "XR3GD7EE3qLqK52cHVcQkVwLfJ2iAidyMWEy51pZDJf3AVWQBKwyQTiCN2naUtAKaZANKp5FPGD5ZfxATsTqmsb" ], "script": "base64:BgJmCAISBAoCEQESBQoDCAEBEgUKAwEEARIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIAWAAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAARa1NoYXJlQXNzZXRTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAEa0ZlZQIKY29tbWlzc2lvbgASa0RBcHBUaHJlc2hvbGRDb2VmAhFkQXBwVGhyZXNob2xkQ29lZgAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MACmtEaXNjb3VudHMCCWRpc2NvdW50cwAPa0Rpc2NvdW50VmFsdWVzAg9kaXNjb3VudF92YWx1ZXMADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQAD2tVc2VyR1N3b3BJbkdvdgINX0dTd29wX2Ftb3VudAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzAARVU0ROASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIFBHRoaXMIBQFpBmNhbGxlcgUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ABGJpZzIJALYCAQACAAZpdGVyMTAJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwABml0ZXIxNQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsAAZpdGVyMTYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPBQNuaWwADmJsb2NrVGltZXN0YW1wBQZoZWlnaHQBBmFzc2VydAEBYQMFAWEHBgEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBAR1c2VyBAckbWF0Y2gwBQh1c2VyQWRkcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAF1BQckbWF0Y2gwCQClCAEFAXUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF1BQckbWF0Y2gwBQF1CQACAQIYVW5rbm93IHR5cGUgb2YgdXNlciBBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEdXNlcgUPa1VzZXJHU3dvcEluR292AAAEC2dTd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEdXNlcgUPa1VzZXJHU3dvcEluR292BQpzd29wQW1vdW50BA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAACQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAAAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAEDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwADAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEFDWZ1dHVyZV9BX3RpbWUEAkExBQhmdXR1cmVfQQMJAGYCBQJ0MQUOYmxvY2tUaW1lc3RhbXAEAkEwBQlpbml0aWFsX0EEAnQwBQ5pbml0aWFsX0FfdGltZQMJAGYCBQJBMQUCQTAJAGQCBQJB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MTAxNDYCXzIEDHhwX3JlZHVjZWRfaQkAkQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMDcxMDEwNzc2CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMDcxMDEwNzc2Al8xBAtzdGFraW5nQWRkcggFDSR0MDEwNzEwMTA3NzYCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDEwODYyMTA5MjgJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDEwODYyMTA5MjgCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTA4NjIxMDkyOAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExMTE1MTEyMTcJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExMTE1MTEyMTcCXzEEBGFkZHIIBQ0kdDAxMTExNTExMjE3Al8yBAZwYXJhbXMIBQ0kdDAxMTExNTExMjE3Al8zBAhwYXltZW50cwgFDSR0MDExMTE1MTEyMTcCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTQwMjExNTA1CQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTQwMjExNTA1Al8xBARhZGRyCAUNJHQwMTE0MDIxMTUwNQJfMgQGcGFyYW1zCAUNJHQwMTE0MDIxMTUwNQJfMwQIcGF5bWVudHMIBQ0kdDAxMTQwMjExNTA1Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjExNjEyMTQxBQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjExNjEyMTQxAl8xBAFpCAUNJHQwMTIxMTYxMjE0MQJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEXN1c3BlbmRTdXNwaWNpb3VzAQFpCQEHc3VzcGVuZAEJAKwCAgIdU3VzcGljaW91cyBzdGF0ZSB3aXRoIGFzc2V0OiAJAJEDAgUIYXNzZXRJZHMFAWkBDnJldHVyblBheW1lbnRzAgZjYWxsZXIIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHcGF5bWVudAkAzQgCBQNhY2MJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcggFB3BheW1lbnQGYW1vdW50CAUHcGF5bWVudAdhc3NldElkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJjaGVja0RBcHBUaHJlc2hvbGQBC25ld0JhbGFuY2VzBBFkQXBwVGhyZXNob2xkQ29lZgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFEmtEQXBwVGhyZXNob2xkQ29lZgIYTm8gZEFwcFRocmVzaG9sZENvZWYga2V5BA50aHJlc2hvbGRTY2FsZQCQTgQKbWF4QmFsYW5jZQkAlgMBBQtuZXdCYWxhbmNlcwQKbWluQmFsYW5jZQkAlwMBBQtuZXdCYWxhbmNlcwQFcmF0aW8JAGsDBQptYXhCYWxhbmNlBQ50aHJlc2hvbGRTY2FsZQUKbWluQmFsYW5jZQMJAGYCBQVyYXRpbwkAaAIFEWRBcHBUaHJlc2hvbGRDb2VmBQ50aHJlc2hvbGRTY2FsZQkAAgECOE5ldyBiYWxhbmNlIGluIGFzc2V0cyBvZiB0aGUgREFwcCBpcyBsZXNzIHRoYW4gdGhyZXNob2xkBwEKY2hlY2tDb2lucwEIYXNzZXRJZHMEBWNvaW5zCQC1CQIFCGFzc2V0SWRzAgEsAwkAZgIJAJADAQUFY29pbnMACgkAAgECIFRvIG1hbnkgY29pbnMsIG1heCBjb2lucyBzaXplIDEwCgEJY2hlY2tDb2luAgVlcnJvcgdhc3NldElkBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDZBAEFB2Fzc2V0SWQJAKwCAgISZnJvbUJhc2U1OFN0cmluZzogBQdhc3NldElkBAhkZWNpbWFscwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQVhc3NldAkArAICAgthc3NldEluZm86IAUHYXNzZXRJZAhkZWNpbWFscwMJAQIhPQIFCGRlY2ltYWxzBQhERUNJTUFMUwkAAgECDndyb25nIGRlY2ltYWxzBwoAAiRsBQVjb2lucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQljaGVja0NvaW4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoUA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDCGFzc2V0SWRzAl9BEl9kQXBwVGhyZXNob2xkQ29lZgMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAMJAGcCAAAFAl9BCQACAQIUQW1wIG11c3QgYmUgbXVzdCA+IDADCQBnAgAABRJfZEFwcFRocmVzaG9sZENvZWYJAAIBAh9kQXBwIFRocmVzaG9sZCBDb2VmIG11c3QgYmUgPiAwBAlzaGFyZU5hbWUCC3NfTXVsdGlfVVNEBBBzaGFyZURlc2NyaXB0aW9uCQCsAgICQlNoYXJlVG9rZW4gb2YgU3dvcEZpIHByb3RvY29sIGZvciBNdWx0aVN0YWJsZSBVU0QgcG9vbCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBAppc3N1ZVRva2VuCQDCCAUFCXNoYXJlTmFtZQUQc2hhcmVEZXNjcmlwdGlvbgAAAAYGBAd0b2tlbklkCQC4CAEFCmlzc3VlVG9rZW4DCQEKY2hlY2tDb2lucwEFCGFzc2V0SWRzCQEFdGhyb3cACQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgUSX2RBcHBUaHJlc2hvbGRDb2VmCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDbXNnAQxhZGRMaXF1aWRpdHkDDW1pbk1pbnRBbW91bnQMc3Rha2VGYXJtaW5nCGxvY2tUeXBlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABANhbXAJAQJfQQAEAnhwCQEDX3hwAAQCRDADCQAAAgULc2hhcmVTdXBwbHkAAAAACQEHZ2V0RE1lbQIFAnhwBQNhbXAECHBheW1lbnRzCAUDbXNnCHBheW1lbnRzBAxwYXltZW50c1NpemUJAJADAQUIcGF5bWVudHMKAQ12YWxpZFBheW1lbnRzAQFuAwkAZgIFDHBheW1lbnRzU2l6ZQUGbkNvaW5zCQACAQkArAICAhBwYXltZW50cyBzaXplID4gCQCkAwEFBm5Db2lucwMJAGYCAAEFDHBheW1lbnRzU2l6ZQkAAgECEXBheW1lbnRzIHNpemUgPCAxAwMJAAACBQtzaGFyZVN1cHBseQAACQECIT0CBQZuQ29pbnMFDHBheW1lbnRzU2l6ZQcJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zCgEMcGF5bWFudFZhbGlkAgNhY2MHcGF5bWVudAMJAQ9jb250YWluc0VsZW1lbnQCBQhhc3NldElkcwkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBgkAAgECGEludmFsaWQgYXNzZXQgaW4gcGF5bWVudAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxwYXltYW50VmFsaWQC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ZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEDmdvdmVybmFuY2VGZWVzCQBrAwUEZmVlcwUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BAxmaW5hbEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwQDcG10CQBlAgUKbmV3QmFsYW5jZQkAkQMCBQJ4cAUBaQQGbHBGZWVzCQBlAgUEZmVlcwUOZ292ZXJuYW5jZUZlZXMEA2ludgMJAGYCBQNwbXQAAAkBBXN0YWtlAgkAZQIFA3BtdAUEZmVlcwkAkQMCBQhhc3NldElkcwUBaQkBB3Vuc3Rha2UCBQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52BAdhaXJkcm9wAwkAZgIFBmxwRmVlcwAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpBQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUQaW52YXJpYW50QmFsYW5jZQkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQxmaW5hbEJhbGFuY2UFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDaW52CQEFc3Rha2UCBQpuZXdCYWxhbmNlCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52CQCVCgMJAM0IAgULaW52QmFsYW5jZXMFCm5ld0JhbGFuY2UJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQUKbmV3QmFsYW5jZQkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMTg3NTYxODg0NAoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEC2ludkJhbGFuY2VzCAUNJHQwMTg3NTYxODg0NAJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDE4NzU2MTg4NDQCXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQhsb2NrVHlwZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BQNuaWwDCQAAAgUBcwUBcwkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUMc2hhcmVBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAUDbmlsA21zZwEOY2FsY01pbnRBbW91bnQCC25ld0JhbGFuY2VzBHVzZXIEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkAAAIFC3NoYXJlU3VwcGx5AAAJAJQKAgUDbmlsBQJEMQQCRDAJAQdnZXRETWVtAgUCeHAFA2FtcAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEFBHVzZXIKAQ9jYWxjSW52QmFsYW5jZXMCA2FjYwpuZXdCYWxhbmNlBA0kdDAyMDA4MzIwMTA5BQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMjAwODMyMDEwOQJfMQQBaQgFDSR0MDIwMDgzMjAxMDkCXzIEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzCQCUCgIJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAGQCBQFpAAEEDSR0MDIwNzExMjA3ODEKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjSW52QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEC2ludkJhbGFuY2VzCAUNJHQwMjA3MTEyMDc4MQJfMQQBawgFDSR0MDIwNzExMjA3ODECXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAECm1pbnRBbW91bnQJAGsDBQtzaGFyZVN1cHBseQkAZQIFAkQyBQJEMAUCRDAJAJQKAgUDbmlsBQptaW50QW1vdW50A21zZwEMcmVpc3N1ZVNoYXJlAQZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUDbXNnCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQZhbW91bnQGBQNuaWwDbXNnAQVnZXREeQQJYXNzZXRGcm9tB2Fzc2V0VG8CZHgLdXNlckFkZHJlc3MEAnhwCQEDX3hwAAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCWFzc2V0RnJvbQIQdW5rbm93biB0b2tlbiBpbgQHdG9JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQdhc3NldFRvAhF1bmtub3duIHRva2VuIG91dAQBeAkAZAIJAJEDAgUCeHAFCWZyb21JbmRleAUCZHgEAXkJAQRnZXRZBAUJZnJvbUluZGV4BQd0b0luZGV4BQF4BQJ4cAQCZHkJAGUCCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUBeQABBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQkBB0FkZHJlc3MBCQDZBAEFC3VzZXJBZGRyZXNzBARfZmVlCQBrAwkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUCZHkFCWZlZVNjYWxlNgkAlAoCBQNuaWwJAJQKAgkAZQIFAmR5BQRfZmVlBQRfZmVlA21zZwEIZXhjaGFuZ2UCCHRva2VuT3V0Bm1pbl9keQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQEC3Rva2VuT3V0QjU4CQDZBAEFCHRva2VuT3V0BAJkeAgFB3BheW1lbnQGYW1vdW50BAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHdG9rZW5JbgIQdW5rbm93biB0b2tlbiBpbgQHdG9JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQEAnhwCQEDX3hwAAQBeAkAZAIJAJEDAgUCeHAFCWZyb21JbmRleAUCZHgEAXkJAQRnZXRZBAUJZnJvbUluZGV4BQd0b0luZGV4BQF4BQJ4cAQDX2R5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIBQNtc2cMb3JpZ2luQ2FsbGVyBARfZmVlCQBrAwUDX2R5CQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQlmZWVTY2FsZTYEAmR5CQBlAgUDX2R5BQRfZmVlBA5nb3Zlcm5hbmNlRmVlcwkAawMFBF9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgMJAQZhc3NlcnQBCQBnAgUCZHkFBm1pbl9keQkAAgECLkV4Y2hhbmdlIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDIyODIyMjI4NDgFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyMjgyMjIyODQ4Al8xBAFpCAUNJHQwMjI4MjIyMjg0OAJfMgMJAAACBQFpBQlmcm9tSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZAIFDHRva2VuQmFsYW5jZQUCZHgJAGQCBQFpAAEDCQAAAgUBaQUHdG9JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQNfZHkJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyMzA5OTIzMTYwCgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDIzMDk5MjMxNjACXzEEAWkIBQ0kdDAyMzA5OTIzMTYwAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAFzCQEFc3Rha2UCCAUHcGF5bWVudAZhbW91bnQJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAMJAAACBQFzBQFzBAJ1cwkBB3Vuc3Rha2UCBQNfZHkFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwQGbHBGZWVzCQBlAgUEX2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JbgUNa0Fzc2V0QmFsYW5jZQUBeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQh0b2tlbk91dAUNa0Fzc2V0QmFsYW5jZQkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFA19keQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4BQNuaWwJAMwIAgUCZHkJAMwIAgULdG9rZW5PdXRCNTgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBCHdpdGhkcmF3AQptaW5BbW91bnRzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBAlwbXRBbW91bnQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnDG9yaWdpbkNhbGxlcggFA21zZwhwYXltZW50cwoBEWNhbGNTY3JpcHRBY3Rpb25zAgNhY2MHYmFsYW5jZQQNJHQwMjQ0NTEyNDQ3OQUDYWNjBA1zY3JpcHRBY3Rpb25zCAUNJHQwMjQ0NTEyNDQ3OQJfMQQBaQgFDSR0MDI0NDUxMjQ0NzkCXzIEB3dBbW91bnQJAGsDBQdiYWxhbmNlBQlwbXRBbW91bnQFC3NoYXJlU3VwcGx5AwkBBmFzc2VydAEJAGcCBQd3QW1vdW50CQCRAwIFCm1pbkFtb3VudHMFAWkJAAIBAjBXaXRoZHJhd2FsIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQEAnVzCQEHdW5zdGFrZQIFB3dBbW91bnQJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUCdXMFAnVzCQCUCgIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlCQBlAgUHYmFsYW5jZQUHd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnDG9yaWdpbkNhbGxlcgUHd0Ftb3VudAkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpBQNuaWwJAGQCBQFpAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDI0OTY5MjUwMzcKAAIkbAkBA194cAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQNc2NyaXB0QWN0aW9ucwgFDSR0MDI0OTY5MjUwMzcCXzEEAWkIBQ0kdDAyNDk2OTI1MDM3Al8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFCXBtdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUJcG10QW1vdW50BQNuaWwDbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50AwkAZgIJAJADAQgFA21zZwhwYXltZW50cwAAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbggJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAAABAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEA2ludgkA/AcEBQR0aGlzAgh3aXRoZHJhdwkAzAgCBQptaW5BbW91bnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgMJAGcCAAAFC3Rva2VuQW1vdW50CQACAQIXQW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAWkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0CQCUCgIFA25pbAgJARRfY2FsY1dpdGhkcmF3T25lQ29pbgQJAQNfeHAABQt0b2tlbkFtb3VudAUBaQkBB0FkZHJlc3MBCQDZBAEFBHVzZXICXzEDbXNnAQ93aXRoZHJhd09uZUNvaW4CCHRva2VuT3V0CW1pbkFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwxvcmlnaW5DYWxsZXIIBQNtc2cIcGF5bWVudHMECXBtdEFtb3VudAgJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQpwbXRBc3NldElkBQxzaGFyZUFzc2V0SWQJAAIBAg11bmtub3duIHRva2VuBAhvdXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQEC3Rva2VuT3V0QjU4CQDZBAEFCHRva2VuT3V0BAJ4cAkBA194cAAEDSR0MDI3MDY5MjcxNTEJARRfY2FsY1dpdGhkcmF3T25lQ29pbgQFAnhwBQlwbXRBbW91bnQFCG91dEluZGV4CAUDbXNnDG9yaWdpbkNhbGxlcgQCZHkIBQ0kdDAyNzA2OTI3MTUxAl8xBAZkeV9mZWUIBQ0kdDAyNzA2OTI3MTUxAl8yAwkBBmFzc2VydAEJAGcCBQJkeQUJbWluQW1vdW50CQACAQIYTm90IGVub3VnaCBjb2lucyByZW1vdmVkBA5nb3Zlcm5hbmNlRmVlcwkAawMFBmR5X2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BApkeV9hbmRfZmVlCQBkAgUCZHkFBmR5X2ZlZQoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMjc0MDkyNzQzNQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI3NDA5Mjc0MzUCXzEEAWkIBQ0kdDAyNzQwOTI3NDM1Al8yAwkAAAIFAWkFCG91dEluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGUCBQx0b2tlbkJhbGFuY2UFCmR5X2FuZF9mZWUJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyNzYwMjI3NjYzCgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDI3NjAyMjc2NjMCXzEEAXYIBQ0kdDAyNzYwMjI3NjYzAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUJcG10QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCD3dpdGhkcmF3T25lQ29pbgkAzAgCBQh0b2tlbk91dAkAzAgCBQltaW5BbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMjk2ODAyOTcwNgUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI5NjgwMjk3MDYCXzEEAWkIBQ0kdDAyOTY4MDI5NzA2Al8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAl8xBAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wBARkaWZmAwUHZGVwb3NpdAkAZQIFAkQxBQJEMAkAZQIFAkQwBQJEMQkAlAoCBQNuaWwJAGsDBQRkaWZmBQtzaGFyZVN1cHBseQUCRDADbXNnAQVyYW1wQQIIX2Z1dHVyZUELX2Z1dHVyZVRpbWUJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQZhc3NlcnQBCQBnAgUOYmxvY2tUaW1lc3RhbXAJAGQCBQ5pbml0aWFsX0FfdGltZQUNTUlOX1JBTVBfVElNRQkAAgECCXRvbyBvZnRlbgMJAQZhc3NlcnQBCQBnAgULX2Z1dHVyZVRpbWUJAGQCBQ5ibG9ja1RpbWVzdGFtcAUNTUlOX1JBTVBfVElNRQkAAgECEWluc3VmZmljaWVudCB0aW1lBApfaW5pdGlhbF9BCQECX0EAAwkBBmFzc2VydAEDCQBmAgUIX2Z1dHVyZUEAAAkAZgIFBU1BWF9BBQhfZnV0dXJlQQcJAAIBAhFvdXQgb2YgYmFzZSByYW5nZQMJAQZhc3NlcnQBAwMJAGcCBQhfZnV0dXJlQQUKX2luaXRpYWxfQQkAZwIJAGgCBQpfaW5pdGlhbF9BBQxNQVhfQV9DSEFOR0UFCF9mdXR1cmVBBwYDCQBmAgUKX2luaXRpYWxfQQUIX2Z1dHVyZUEJAGcCCQBoAgUIX2Z1dHVyZUEFDE1BWF9BX0NIQU5HRQUKX2luaXRpYWxfQQcJAAIBAgxvdXQgb2YgcmFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUKX2luaXRpYWxfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCF9mdXR1cmVBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFC19mdXR1cmVUaW1lBQNuaWwDbXNnAQlzdG9wUmFtcEEACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cECGN1cnJlbnRBCQECX0EACQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUIY3VycmVudEEJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAFA25pbANtc2cBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4DbXNnAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMFBmFjdGl2ZQkBDXRocm93SXNBY3RpdmUACQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbANtc2cBGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AggFA21zZwZjYWxsZXIFD21vbmV5Qm94QWRkcmVzcwkAAgECJk9ubHkgdGhlIHdhbGxldCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uBAhiYWxhbmNlcwkBA194cAAKAQ50YWtlRXh0cmFGdW5kcwIDYWNjB2Fzc2V0SWQEDSR0MDMyMDQ4MzIwNjYFA2FjYwQDc3VtCAUNJHQwMzIwNDgzMjA2NgJfMQQBaQgFDSR0MDMyMDQ4MzIwNjYCXzIECHRva2VuQjU4CQDZBAEFB2Fzc2V0SWQECHJCYWxhbmNlCQBkAgkA8AcCBQR0aGlzBQh0b2tlbkI1OAkBDHN0YWtlZEFtb3VudAEFCHRva2VuQjU4BAxlbnJvbGxBbW91bnQJAGUCBQhyQmFsYW5jZQkAkQMCBQhiYWxhbmNlcwUBaQMJAGYCAAAFDGVucm9sbEFtb3VudAkBB3N1c3BlbmQBCQCsAgICIEVucm9sbCBhbW91bnQgbmVnYXRpdmUgZm9yIGFzc2V0BQdhc3NldElkBAdhaXJkcm9wAwkAZgIFDGVucm9sbEFtb3VudAAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIdG9rZW5CNTgFDGVucm9sbEFtb3VudAUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlAoCCQBkAgUDc3VtBQxlbnJvbGxBbW91bnQJAGQCBQFpAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAWsKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ50YWtlRXh0cmFGdW5kcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACCAUBawJfMQAACQACAQIQTm8gbW9uZXkgdG8gdGFrZQUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBBNjYWxsVGFrZUludG9BY2NvdW50AwkAAAIIBQNpbnYEZEFwcAUEdGhpcwkAAAIIBQNpbnYIZnVuY3Rpb24CGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMHBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRFhZG1pblB1YktleUludm9rZQMDBRNjYWxsVGFrZUludG9BY2NvdW50BQ1zaWduZWRCeUFkbWluBwYFE211bHRpU2lnbmVkQnlBZG1pbnMFE211bHRpU2lnbmVkQnlBZG1pbnNwbNoh", "height": 2277958, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FMS6w7BGyn5VFdu3yVE6gM682UXaoiJv9wY2FB3oNUPp Next: Aykfwr5jGhNU1JhkCPYo8TqJ3CeJcoZe7MeXSiyMnhgb Diff:
OldNewDifferences
3838 let kDiscountValues = "discount_values"
3939
4040 let kUserSwopInGov = "_SWOP_amount"
41+
42+let kUserGSwopInGov = "_GSwop_amount"
4143
4244 let kAdminPubKey1 = "admin_pub_1"
4345
8789
8890 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
8991
90-let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
92+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
9193
9294 let stakingAssets = [toBase58String(USDN)]
9395
160162 case _ =>
161163 throw("Unknow type of user Addr")
162164 }
163- let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
165+ let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), 0)
166+ let gSwopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), swopAmount)
164167 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
165168 let discounts = split(getStringValue(oracle, kDiscounts), ",")
166- if (if ((swopAmount >= parseIntValue(discountValues[0])))
167- then (parseIntValue(discountValues[1]) > swopAmount)
169+ if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
170+ then (parseIntValue(discountValues[1]) > gSwopAmount)
168171 else false)
169172 then (feeScale6 - parseIntValue(discounts[0]))
170- else if (if ((swopAmount >= parseIntValue(discountValues[1])))
171- then (parseIntValue(discountValues[2]) > swopAmount)
173+ else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
174+ then (parseIntValue(discountValues[2]) > gSwopAmount)
172175 else false)
173176 then (feeScale6 - parseIntValue(discounts[1]))
174- else if (if ((swopAmount >= parseIntValue(discountValues[2])))
175- then (parseIntValue(discountValues[3]) > swopAmount)
177+ else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
178+ then (parseIntValue(discountValues[3]) > gSwopAmount)
176179 else false)
177180 then (feeScale6 - parseIntValue(discounts[2]))
178- else if (if ((swopAmount >= parseIntValue(discountValues[3])))
179- then (parseIntValue(discountValues[4]) > swopAmount)
181+ else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
182+ then (parseIntValue(discountValues[4]) > gSwopAmount)
180183 else false)
181184 then (feeScale6 - parseIntValue(discounts[3]))
182- else if ((swopAmount >= parseIntValue(discountValues[4])))
185+ else if ((gSwopAmount >= parseIntValue(discountValues[4])))
183186 then (feeScale6 - parseIntValue(discounts[4]))
184187 else feeScale6
185188 }
285288 else $Tuple2(D, false)
286289 }
287290
288- let $t063216387 = {
291+ let $t064616527 = {
289292 let $l = iter15
290293 let $s = size($l)
291294 let $acc0 = $Tuple2(toBigInt(S), false)
299302
300303 $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)
301304 }
302- let D = $t063216387._1
303- let finished = $t063216387._2
305+ let D = $t064616527._1
306+ let finished = $t064616527._2
304307 if ((finished == false))
305308 then throw(("get_D() not finished with " + toString(D)))
306309 else toInt(D)
326329 let D = get_D(xp_, amp)
327330 let Ann = (amp * nCoins)
328331 func S_c (acc,i) = {
329- let $t069586975 = acc
330- let S_ = $t069586975._1
331- let c = $t069586975._2
332+ let $t070987115 = acc
333+ let S_ = $t070987115._1
334+ let c = $t070987115._2
332335 let x_ = if ((in == i))
333336 then x
334337 else xp_[i]
339342 else $Tuple2(S_, c)
340343 }
341344
342- let $t071837238 = {
345+ let $t073237378 = {
343346 let $l = iter10
344347 let $s = size($l)
345348 let $acc0 = $Tuple2(0, toBigInt(D))
353356
354357 $f0_2($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)
355358 }
356- let S_ = $t071837238._1
357- let c_ = $t071837238._2
359+ let S_ = $t073237378._1
360+ let c_ = $t073237378._2
358361 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
359362 let bD = toBigInt(((S_ + (D / Ann)) - D))
360363 func y_proc (acc,_i) = if ((acc._2 == true))
371374 else $Tuple2(y, false)
372375 }
373376
374- let $t077207787 = {
377+ let $t078607927 = {
375378 let $l = iter16
376379 let $s = size($l)
377380 let $acc0 = $Tuple2(toBigInt(D), false)
385388
386389 $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)
387390 }
388- let y = $t077207787._1
389- let finished = $t077207787._2
391+ let y = $t078607927._1
392+ let finished = $t078607927._2
390393 if ((finished == false))
391394 then throw(("getY() not finished with " + toString(y)))
392395 else toInt(y)
400403 else {
401404 let Ann = (A_ * nCoins)
402405 func S_c (acc,i) = {
403- let $t081668183 = acc
404- let S_ = $t081668183._1
405- let c = $t081668183._2
406+ let $t083068323 = acc
407+ let S_ = $t083068323._1
408+ let c = $t083068323._2
406409 let x_ = if (if ((in != i))
407410 then (nCoins > i)
408411 else false)
415418 else $Tuple2(S_, c)
416419 }
417420
418- let $t084038458 = {
421+ let $t085438598 = {
419422 let $l = iter10
420423 let $s = size($l)
421424 let $acc0 = $Tuple2(0, toBigInt(D))
429432
430433 $f0_2($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)
431434 }
432- let S_ = $t084038458._1
433- let c_ = $t084038458._2
435+ let S_ = $t085438598._1
436+ let c_ = $t085438598._2
434437 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
435438 let bD = toBigInt(((S_ + (D / Ann)) - D))
436439 func y_D_proc (acc,i) = if ((acc._2 == true))
447450 else $Tuple2(y, false)
448451 }
449452
450- let $t089419010 = {
453+ let $t090819150 = {
451454 let $l = iter16
452455 let $s = size($l)
453456 let $acc0 = $Tuple2(toBigInt(D), false)
461464
462465 $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)
463466 }
464- let y = $t089419010._1
465- let finished = $t089419010._2
467+ let y = $t090819150._1
468+ let finished = $t090819150._2
466469 if ((finished == false))
467470 then throw(("get_y_D() not finished with " + toString(y)))
468471 else toInt(y)
479482 let new_y = get_y_D(amp, i, xp, D1)
480483 let dy_0 = (xp[i] - new_y)
481484 func xp_reduced_proc (acc,xp_j) = {
482- let $t096519680 = acc
483- let xp_reduced = $t096519680._1
484- let index = $t096519680._2
485+ let $t097919820 = acc
486+ let xp_reduced = $t097919820._1
487+ let index = $t097919820._2
485488 let dx_expected = if ((index == i))
486489 then (fraction(xp_j, D1, D0) - new_y)
487490 else (xp_j - fraction(xp_j, D1, D0))
488491 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
489492 }
490493
491- let $t0994210006 = {
494+ let $t01008210146 = {
492495 let $l = xp
493496 let $s = size($l)
494497 let $acc0 = $Tuple2(nil, 0)
502505
503506 $f0_2($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)
504507 }
505- let xp_reduced = $t0994210006._1
506- let index = $t0994210006._2
508+ let xp_reduced = $t01008210146._1
509+ let index = $t01008210146._2
507510 let xp_reduced_i = xp_reduced[i]
508511 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
509512 $Tuple2(dy, (dy_0 - dy))
527530
528531 func calcStakingParams (stake,amount,assetId) = if (stake)
529532 then {
530- let $t01057010636 = calcStakingFuncAndAddres(stake, assetId)
531- let call = $t01057010636._1
532- let stakingAddr = $t01057010636._2
533+ let $t01071010776 = calcStakingFuncAndAddres(stake, assetId)
534+ let call = $t01071010776._1
535+ let stakingAddr = $t01071010776._2
533536 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
534537 }
535538 else {
536- let $t01072210788 = calcStakingFuncAndAddres(stake, assetId)
537- let call = $t01072210788._1
538- let stakingAddr = $t01072210788._2
539+ let $t01086210928 = calcStakingFuncAndAddres(stake, assetId)
540+ let call = $t01086210928._1
541+ let stakingAddr = $t01086210928._2
539542 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
540543 }
541544
542545
543546 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
544547 then {
545- let $t01097511077 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546- let call = $t01097511077._1
547- let addr = $t01097511077._2
548- let params = $t01097511077._3
549- let payments = $t01097511077._4
548+ let $t01111511217 = calcStakingParams(true, amount, fromBase58String(assetIdString))
549+ let call = $t01111511217._1
550+ let addr = $t01111511217._2
551+ let params = $t01111511217._3
552+ let payments = $t01111511217._4
550553 invoke(addr, call, params, payments)
551554 }
552555 else 0
554557
555558 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
556559 then {
557- let $t01126211365 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558- let call = $t01126211365._1
559- let addr = $t01126211365._2
560- let params = $t01126211365._3
561- let payments = $t01126211365._4
560+ let $t01140211505 = calcStakingParams(false, amount, fromBase58String(assetIdString))
561+ let call = $t01140211505._1
562+ let addr = $t01140211505._2
563+ let params = $t01140211505._3
564+ let payments = $t01140211505._4
562565 invoke(addr, call, params, payments)
563566 }
564567 else 0
587590 func checkSuspicious () = {
588591 let contractBalances = _xp()
589592 func checkBalance (acc,assetId) = {
590- let $t01197612001 = acc
591- let suspicious = $t01197612001._1
592- let i = $t01197612001._2
593+ let $t01211612141 = acc
594+ let suspicious = $t01211612141._1
595+ let i = $t01211612141._2
593596 if (suspicious)
594597 then $Tuple2(suspicious, i)
595598 else {
705708
706709
707710 @Callable(msg)
708-func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
711+func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), {
709712 let amp = _A()
710713 let xp = _xp()
711714 let D0 = if ((shareSupply == 0))
748751 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
749752 else {
750753 func parsePayments (acc,assetId) = {
751- let $t01609216118 = acc
752- let newBalances = $t01609216118._1
753- let i = $t01609216118._2
754+ let $t01624716273 = acc
755+ let newBalances = $t01624716273._1
756+ let i = $t01624716273._2
754757 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
755758 then (newBalance + payment.amount)
756759 else newBalance
772775 $Tuple2((newBalances :+ newBalace), (i + 1))
773776 }
774777
775- let $t01646816535 = {
778+ let $t01662316690 = {
776779 let $l = assetIds
777780 let $s = size($l)
778781 let $acc0 = $Tuple2(nil, 0)
786789
787790 $f0_2($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)
788791 }
789- let newBalances = $t01646816535._1
790- let k = $t01646816535._2
792+ let newBalances = $t01662316690._1
793+ let k = $t01662316690._2
791794 if (checkDAppThreshold(newBalances))
792795 then throw()
793796 else {
797800 else {
798801 let feeDiscount = calculateFeeDiscount(msg.caller)
799802 func calcScriptActions (acc,newBalance) = {
800- let $t01685516896 = acc
801- let invBalances = $t01685516896._1
802- let scriptActions = $t01685516896._2
803- let i = $t01685516896._3
803+ let $t01701017051 = acc
804+ let invBalances = $t01701017051._1
805+ let scriptActions = $t01701017051._2
806+ let i = $t01701017051._3
804807 if ((shareSupply > 0))
805808 then {
806809 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
838841 }
839842 }
840843
841- let $t01860118689 = {
844+ let $t01875618844 = {
842845 let $l = newBalances
843846 let $s = size($l)
844847 let $acc0 = $Tuple3(nil, nil, 0)
852855
853856 $f1_2($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)
854857 }
855- let invBalances = $t01860118689._1
856- let scriptActions = $t01860118689._2
858+ let invBalances = $t01875618844._1
859+ let scriptActions = $t01875618844._2
857860 let D2 = getDMem(invBalances, amp)
858861 let mint_amount = if ((shareSupply == 0))
859862 then D1
865868 let re = invoke(this, "reissueShare", [mint_amount], nil)
866869 if ((re == re))
867870 then {
868- let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
871+ let s = invoke(farmingAddress, "lockShareTokens", [toString(this), lockType], [AttachedPayment(shareAssetId, mint_amount)])
869872 if ((s == s))
870873 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
871874 else throw("Strict value is not equal to itself.")
892895 let D0 = getDMem(xp, amp)
893896 let feeDiscount = calculateFeeDiscount(user)
894897 func calcInvBalances (acc,newBalance) = {
895- let $t01987819904 = acc
896- let invBalances = $t01987819904._1
897- let i = $t01987819904._2
898+ let $t02008320109 = acc
899+ let invBalances = $t02008320109._1
900+ let i = $t02008320109._2
898901 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
899902 let fees = {
900903 let idealBalance = fraction(D1, xp[i], D0)
907910 $Tuple2((invBalances :+ invariantBalance), (i + 1))
908911 }
909912
910- let $t02050620576 = {
913+ let $t02071120781 = {
911914 let $l = newBalances
912915 let $s = size($l)
913916 let $acc0 = $Tuple2(nil, 0)
921924
922925 $f0_2($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)
923926 }
924- let invBalances = $t02050620576._1
925- let k = $t02050620576._2
927+ let invBalances = $t02071120781._1
928+ let k = $t02071120781._2
926929 let D2 = getDMem(invBalances, amp)
927930 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
928931 $Tuple2(nil, mintAmount)
977980 then throw("Exchange resulted in fewer coins than expected")
978981 else {
979982 func makeNewBalances (acc,tokenBalance) = {
980- let $t02261722643 = acc
981- let newBalances = $t02261722643._1
982- let i = $t02261722643._2
983+ let $t02282222848 = acc
984+ let newBalances = $t02282222848._1
985+ let i = $t02282222848._2
983986 if ((i == fromIndex))
984987 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
985988 else if ((i == toIndex))
987990 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
988991 }
989992
990- let $t02289422955 = {
993+ let $t02309923160 = {
991994 let $l = xp
992995 let $s = size($l)
993996 let $acc0 = $Tuple2(nil, 0)
10011004
10021005 $f0_2($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)
10031006 }
1004- let newBalances = $t02289422955._1
1005- let i = $t02289422955._2
1007+ let newBalances = $t02309923160._1
1008+ let i = $t02309923160._2
10061009 if (checkDAppThreshold(newBalances))
10071010 then throw()
10081011 else {
10441047 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10451048 else {
10461049 func calcScriptActions (acc,balance) = {
1047- let $t02424624274 = acc
1048- let scriptActions = $t02424624274._1
1049- let i = $t02424624274._2
1050+ let $t02445124479 = acc
1051+ let scriptActions = $t02445124479._1
1052+ let i = $t02445124479._2
10501053 let wAmount = fraction(balance, pmtAmount, shareSupply)
10511054 if (assert((wAmount >= minAmounts[i])))
10521055 then throw("Withdrawal resulted in fewer coins than expected")
10581061 }
10591062 }
10601063
1061- let $t02476424832 = {
1064+ let $t02496925037 = {
10621065 let $l = _xp()
10631066 let $s = size($l)
10641067 let $acc0 = $Tuple2(nil, 0)
10721075
10731076 $f0_2($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)
10741077 }
1075- let scriptActions = $t02476424832._1
1076- let i = $t02476424832._2
1078+ let scriptActions = $t02496925037._1
1079+ let i = $t02496925037._2
10771080 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10781081 }
10791082 }
11401143 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11411144 let tokenOutB58 = fromBase58String(tokenOut)
11421145 let xp = _xp()
1143- let $t02686426946 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1144- let dy = $t02686426946._1
1145- let dy_fee = $t02686426946._2
1146+ let $t02706927151 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147+ let dy = $t02706927151._1
1148+ let dy_fee = $t02706927151._2
11461149 if (assert((dy >= minAmount)))
11471150 then throw("Not enough coins removed")
11481151 else {
11491152 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11501153 let dy_and_fee = (dy + dy_fee)
11511154 func makeNewBalances (acc,tokenBalance) = {
1152- let $t02720427230 = acc
1153- let newBalances = $t02720427230._1
1154- let i = $t02720427230._2
1155+ let $t02740927435 = acc
1156+ let newBalances = $t02740927435._1
1157+ let i = $t02740927435._2
11551158 if ((i == outIndex))
11561159 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11571160 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11581161 }
11591162
1160- let $t02739727458 = {
1163+ let $t02760227663 = {
11611164 let $l = xp
11621165 let $s = size($l)
11631166 let $acc0 = $Tuple2(nil, 0)
11711174
11721175 $f0_2($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)
11731176 }
1174- let newBalances = $t02739727458._1
1175- let v = $t02739727458._2
1177+ let newBalances = $t02760227663._1
1178+ let v = $t02760227663._2
11761179 if (checkDAppThreshold(newBalances))
11771180 then throw()
11781181 else {
12481251 let balances = _xp()
12491252 let D0 = getDMem(balances, amp)
12501253 func calcNewBalances (acc,balance) = {
1251- let $t02947529501 = acc
1252- let newBalances = $t02947529501._1
1253- let i = $t02947529501._2
1254+ let $t02968029706 = acc
1255+ let newBalances = $t02968029706._1
1256+ let i = $t02968029706._2
12541257 let newBalance = (balance + (if (deposit)
12551258 then amounts[i]
12561259 else -(amounts[i])))
13301333 else {
13311334 let balances = _xp()
13321335 func takeExtraFunds (acc,assetId) = {
1333- let $t03184331861 = acc
1334- let sum = $t03184331861._1
1335- let i = $t03184331861._2
1336+ let $t03204832066 = acc
1337+ let sum = $t03204832066._1
1338+ let i = $t03204832066._2
13361339 let tokenB58 = fromBase58String(assetId)
13371340 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13381341 let enrollAmount = (rBalance - balances[i])
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 kUserGSwopInGov = "_GSwop_amount"
4143
4244 let kAdminPubKey1 = "admin_pub_1"
4345
4446 let kAdminPubKey2 = "admin_pub_2"
4547
4648 let kAdminPubKey3 = "admin_pub_3"
4749
4850 let kAdminInvokePubKey = "admin_invoke_pub"
4951
5052 let kMoneyBoxAddress = "money_box_address"
5153
5254 let kGovAddress = "governance_address"
5355
5456 let kVotingAddress = "voting_address"
5557
5658 let kFarmingAddress = "farming_address"
5759
5860 let kLPFarmingAddress = "lp_farming"
5961
6062 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
6163
6264 func getBase58FromOracle (key) = match getString(oracle, key) {
6365 case string: String =>
6466 fromBase58String(string)
6567 case nothing =>
6668 throw((key + "is empty"))
6769 }
6870
6971
7072 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7173
7274 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7375
7476 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7577
7678 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
7779
7880 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
7981
8082 let govAddress = Address(getBase58FromOracle(kGovAddress))
8183
8284 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8385
8486 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
8587
8688 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
8789
8890 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
8991
90-let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
92+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
9193
9294 let stakingAssets = [toBase58String(USDN)]
9395
9496 let active = getBooleanValue(this, kActive)
9597
9698 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
9799
98100 let shareSupply = getIntegerValue(this, kShareAssetSupply)
99101
100102 let feeScale6 = 1000000
101103
102104 let fee = getIntegerValue(this, kFee)
103105
104106 let feeGovernance = fraction(40, feeScale6, 100)
105107
106108 let initial_A = getIntegerValue(this, "initial_A")
107109
108110 let future_A = getIntegerValue(this, "future_A")
109111
110112 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
111113
112114 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
113115
114116 let assetIds = split(getStringValue(this, kAssets), ",")
115117
116118 let nCoins = size(assetIds)
117119
118120 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
119121
120122
121123 func throwIsActive () = throw("DApp is already active")
122124
123125
124126 func isActive () = if (active)
125127 then unit
126128 else throw("DApp is inactive at this moment")
127129
128130
129131 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
130132 then unit
131133 else throw("Only admin can call this function")
132134
133135
134136 func isSelfCall (i) = if ((this == i.caller))
135137 then unit
136138 else throw("Only contract itself can call this function")
137139
138140
139141 let big2 = toBigInt(2)
140142
141143 let iter10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
142144
143145 let iter15 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
144146
145147 let iter16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
146148
147149 let blockTimestamp = height
148150
149151 func assert (a) = if (a)
150152 then false
151153 else true
152154
153155
154156 func calculateFeeDiscount (userAddr) = {
155157 let user = match userAddr {
156158 case u: Address =>
157159 toString(u)
158160 case u: String =>
159161 u
160162 case _ =>
161163 throw("Unknow type of user Addr")
162164 }
163- let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
165+ let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), 0)
166+ let gSwopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), swopAmount)
164167 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
165168 let discounts = split(getStringValue(oracle, kDiscounts), ",")
166- if (if ((swopAmount >= parseIntValue(discountValues[0])))
167- then (parseIntValue(discountValues[1]) > swopAmount)
169+ if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
170+ then (parseIntValue(discountValues[1]) > gSwopAmount)
168171 else false)
169172 then (feeScale6 - parseIntValue(discounts[0]))
170- else if (if ((swopAmount >= parseIntValue(discountValues[1])))
171- then (parseIntValue(discountValues[2]) > swopAmount)
173+ else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
174+ then (parseIntValue(discountValues[2]) > gSwopAmount)
172175 else false)
173176 then (feeScale6 - parseIntValue(discounts[1]))
174- else if (if ((swopAmount >= parseIntValue(discountValues[2])))
175- then (parseIntValue(discountValues[3]) > swopAmount)
177+ else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
178+ then (parseIntValue(discountValues[3]) > gSwopAmount)
176179 else false)
177180 then (feeScale6 - parseIntValue(discounts[2]))
178- else if (if ((swopAmount >= parseIntValue(discountValues[3])))
179- then (parseIntValue(discountValues[4]) > swopAmount)
181+ else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
182+ then (parseIntValue(discountValues[4]) > gSwopAmount)
180183 else false)
181184 then (feeScale6 - parseIntValue(discounts[3]))
182- else if ((swopAmount >= parseIntValue(discountValues[4])))
185+ else if ((gSwopAmount >= parseIntValue(discountValues[4])))
183186 then (feeScale6 - parseIntValue(discounts[4]))
184187 else feeScale6
185188 }
186189
187190
188191 func _A () = {
189192 let t1 = future_A_time
190193 let A1 = future_A
191194 if ((t1 > blockTimestamp))
192195 then {
193196 let A0 = initial_A
194197 let t0 = initial_A_time
195198 if ((A1 > A0))
196199 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
197200 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
198201 }
199202 else A1
200203 }
201204
202205
203206 func _xp () = {
204207 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
205208
206209 let $l = assetIds
207210 let $s = size($l)
208211 let $acc0 = nil
209212 func $f0_1 ($a,$i) = if (($i >= $s))
210213 then $a
211214 else assetBalances($a, $l[$i])
212215
213216 func $f0_2 ($a,$i) = if (($i >= $s))
214217 then $a
215218 else throw("List size exceeds 10")
216219
217220 $f0_2($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)
218221 }
219222
220223
221224 func _xp_mem (xp) = xp
222225
223226
224227 func sumList (acc,element) = (acc + element)
225228
226229
227230 func get_D (xp,amp) = {
228231 let @ = invoke(this, "D", [xp, amp], nil)
229232 if ($isInstanceOf(@, "Int"))
230233 then @
231234 else throw(($getType(@) + " couldn't be cast to Int"))
232235 }
233236
234237
235238 func get_D_internal (xp,amp) = {
236239 let S = {
237240 let $l = xp
238241 let $s = size($l)
239242 let $acc0 = 0
240243 func $f0_1 ($a,$i) = if (($i >= $s))
241244 then $a
242245 else sumList($a, $l[$i])
243246
244247 func $f0_2 ($a,$i) = if (($i >= $s))
245248 then $a
246249 else throw("List size exceeds 10")
247250
248251 $f0_2($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)
249252 }
250253 if ((S == 0))
251254 then 0
252255 else {
253256 let Ann = (amp * nCoins)
254257 let AnnS = (toBigInt(Ann) * toBigInt(S))
255258 let Ann1 = toBigInt((Ann - 1))
256259 func Dproc (acc,i) = if ((acc._2 == true))
257260 then acc
258261 else {
259262 let Dprev = acc._1
260263 func D_PProc (D_P,i) = if ((nCoins > i))
261264 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
262265 else D_P
263266
264267 let D_P = {
265268 let $l = iter10
266269 let $s = size($l)
267270 let $acc0 = Dprev
268271 func $f1_1 ($a,$i) = if (($i >= $s))
269272 then $a
270273 else D_PProc($a, $l[$i])
271274
272275 func $f1_2 ($a,$i) = if (($i >= $s))
273276 then $a
274277 else throw("List size exceeds 10")
275278
276279 $f1_2($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)
277280 }
278281 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
279282 if ((D > Dprev))
280283 then if ((1 >= toInt((D - Dprev))))
281284 then $Tuple2(D, true)
282285 else $Tuple2(D, false)
283286 else if ((1 >= toInt((Dprev - D))))
284287 then $Tuple2(D, true)
285288 else $Tuple2(D, false)
286289 }
287290
288- let $t063216387 = {
291+ let $t064616527 = {
289292 let $l = iter15
290293 let $s = size($l)
291294 let $acc0 = $Tuple2(toBigInt(S), false)
292295 func $f1_1 ($a,$i) = if (($i >= $s))
293296 then $a
294297 else Dproc($a, $l[$i])
295298
296299 func $f1_2 ($a,$i) = if (($i >= $s))
297300 then $a
298301 else throw("List size exceeds 15")
299302
300303 $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)
301304 }
302- let D = $t063216387._1
303- let finished = $t063216387._2
305+ let D = $t064616527._1
306+ let finished = $t064616527._2
304307 if ((finished == false))
305308 then throw(("get_D() not finished with " + toString(D)))
306309 else toInt(D)
307310 }
308311 }
309312
310313
311314 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
312315
313316
314317 func getY (in,out,x,xp_) = if (assert((in != out)))
315318 then throw("same coin")
316319 else if (assert(if ((out >= 0))
317320 then (in >= 0)
318321 else false))
319322 then throw("below zero")
320323 else if (assert(if ((nCoins > out))
321324 then (nCoins > in)
322325 else false))
323326 then throw("above N_COINS")
324327 else {
325328 let amp = _A()
326329 let D = get_D(xp_, amp)
327330 let Ann = (amp * nCoins)
328331 func S_c (acc,i) = {
329- let $t069586975 = acc
330- let S_ = $t069586975._1
331- let c = $t069586975._2
332+ let $t070987115 = acc
333+ let S_ = $t070987115._1
334+ let c = $t070987115._2
332335 let x_ = if ((in == i))
333336 then x
334337 else xp_[i]
335338 if (if ((i != out))
336339 then (nCoins > i)
337340 else false)
338341 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
339342 else $Tuple2(S_, c)
340343 }
341344
342- let $t071837238 = {
345+ let $t073237378 = {
343346 let $l = iter10
344347 let $s = size($l)
345348 let $acc0 = $Tuple2(0, toBigInt(D))
346349 func $f0_1 ($a,$i) = if (($i >= $s))
347350 then $a
348351 else S_c($a, $l[$i])
349352
350353 func $f0_2 ($a,$i) = if (($i >= $s))
351354 then $a
352355 else throw("List size exceeds 10")
353356
354357 $f0_2($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)
355358 }
356- let S_ = $t071837238._1
357- let c_ = $t071837238._2
359+ let S_ = $t073237378._1
360+ let c_ = $t073237378._2
358361 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
359362 let bD = toBigInt(((S_ + (D / Ann)) - D))
360363 func y_proc (acc,_i) = if ((acc._2 == true))
361364 then acc
362365 else {
363366 let y_prev = acc._1
364367 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
365368 if ((y > y_prev))
366369 then if ((1 >= toInt((y - y_prev))))
367370 then $Tuple2(y, true)
368371 else $Tuple2(y, false)
369372 else if ((1 >= toInt((y_prev - y))))
370373 then $Tuple2(y, true)
371374 else $Tuple2(y, false)
372375 }
373376
374- let $t077207787 = {
377+ let $t078607927 = {
375378 let $l = iter16
376379 let $s = size($l)
377380 let $acc0 = $Tuple2(toBigInt(D), false)
378381 func $f1_1 ($a,$i) = if (($i >= $s))
379382 then $a
380383 else y_proc($a, $l[$i])
381384
382385 func $f1_2 ($a,$i) = if (($i >= $s))
383386 then $a
384387 else throw("List size exceeds 16")
385388
386389 $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)
387390 }
388- let y = $t077207787._1
389- let finished = $t077207787._2
391+ let y = $t078607927._1
392+ let finished = $t078607927._2
390393 if ((finished == false))
391394 then throw(("getY() not finished with " + toString(y)))
392395 else toInt(y)
393396 }
394397
395398
396399 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
397400 then throw("i below zero")
398401 else if (assert((nCoins > in)))
399402 then throw("i above N_COINS")
400403 else {
401404 let Ann = (A_ * nCoins)
402405 func S_c (acc,i) = {
403- let $t081668183 = acc
404- let S_ = $t081668183._1
405- let c = $t081668183._2
406+ let $t083068323 = acc
407+ let S_ = $t083068323._1
408+ let c = $t083068323._2
406409 let x_ = if (if ((in != i))
407410 then (nCoins > i)
408411 else false)
409412 then xp[i]
410413 else 0
411414 if (if ((nCoins > i))
412415 then (in != i)
413416 else false)
414417 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
415418 else $Tuple2(S_, c)
416419 }
417420
418- let $t084038458 = {
421+ let $t085438598 = {
419422 let $l = iter10
420423 let $s = size($l)
421424 let $acc0 = $Tuple2(0, toBigInt(D))
422425 func $f0_1 ($a,$i) = if (($i >= $s))
423426 then $a
424427 else S_c($a, $l[$i])
425428
426429 func $f0_2 ($a,$i) = if (($i >= $s))
427430 then $a
428431 else throw("List size exceeds 10")
429432
430433 $f0_2($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)
431434 }
432- let S_ = $t084038458._1
433- let c_ = $t084038458._2
435+ let S_ = $t085438598._1
436+ let c_ = $t085438598._2
434437 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
435438 let bD = toBigInt(((S_ + (D / Ann)) - D))
436439 func y_D_proc (acc,i) = if ((acc._2 == true))
437440 then acc
438441 else {
439442 let y_prev = acc._1
440443 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
441444 if ((y > y_prev))
442445 then if ((1 >= toInt((y - y_prev))))
443446 then $Tuple2(y, true)
444447 else $Tuple2(y, false)
445448 else if ((1 >= toInt((y_prev - y))))
446449 then $Tuple2(y, true)
447450 else $Tuple2(y, false)
448451 }
449452
450- let $t089419010 = {
453+ let $t090819150 = {
451454 let $l = iter16
452455 let $s = size($l)
453456 let $acc0 = $Tuple2(toBigInt(D), false)
454457 func $f1_1 ($a,$i) = if (($i >= $s))
455458 then $a
456459 else y_D_proc($a, $l[$i])
457460
458461 func $f1_2 ($a,$i) = if (($i >= $s))
459462 then $a
460463 else throw("List size exceeds 16")
461464
462465 $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)
463466 }
464- let y = $t089419010._1
465- let finished = $t089419010._2
467+ let y = $t090819150._1
468+ let finished = $t090819150._2
466469 if ((finished == false))
467470 then throw(("get_y_D() not finished with " + toString(y)))
468471 else toInt(y)
469472 }
470473
471474
472475 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
473476 let feeDiscount = calculateFeeDiscount(caller)
474477 let amp = _A()
475478 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
476479 let total_supply = shareSupply
477480 let D0 = get_D(xp, amp)
478481 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
479482 let new_y = get_y_D(amp, i, xp, D1)
480483 let dy_0 = (xp[i] - new_y)
481484 func xp_reduced_proc (acc,xp_j) = {
482- let $t096519680 = acc
483- let xp_reduced = $t096519680._1
484- let index = $t096519680._2
485+ let $t097919820 = acc
486+ let xp_reduced = $t097919820._1
487+ let index = $t097919820._2
485488 let dx_expected = if ((index == i))
486489 then (fraction(xp_j, D1, D0) - new_y)
487490 else (xp_j - fraction(xp_j, D1, D0))
488491 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
489492 }
490493
491- let $t0994210006 = {
494+ let $t01008210146 = {
492495 let $l = xp
493496 let $s = size($l)
494497 let $acc0 = $Tuple2(nil, 0)
495498 func $f0_1 ($a,$i) = if (($i >= $s))
496499 then $a
497500 else xp_reduced_proc($a, $l[$i])
498501
499502 func $f0_2 ($a,$i) = if (($i >= $s))
500503 then $a
501504 else throw("List size exceeds 10")
502505
503506 $f0_2($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)
504507 }
505- let xp_reduced = $t0994210006._1
506- let index = $t0994210006._2
508+ let xp_reduced = $t01008210146._1
509+ let index = $t01008210146._2
507510 let xp_reduced_i = xp_reduced[i]
508511 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
509512 $Tuple2(dy, (dy_0 - dy))
510513 }
511514
512515
513516 func getStrAssetId (assetId) = match assetId {
514517 case id: ByteVector =>
515518 toBase58String(id)
516519 case waves: Unit =>
517520 "WAVES"
518521 case _ =>
519522 throw("Match error")
520523 }
521524
522525
523526 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
524527 then $Tuple2("lockNeutrino", stakingUSDNAddress)
525528 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
526529
527530
528531 func calcStakingParams (stake,amount,assetId) = if (stake)
529532 then {
530- let $t01057010636 = calcStakingFuncAndAddres(stake, assetId)
531- let call = $t01057010636._1
532- let stakingAddr = $t01057010636._2
533+ let $t01071010776 = calcStakingFuncAndAddres(stake, assetId)
534+ let call = $t01071010776._1
535+ let stakingAddr = $t01071010776._2
533536 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
534537 }
535538 else {
536- let $t01072210788 = calcStakingFuncAndAddres(stake, assetId)
537- let call = $t01072210788._1
538- let stakingAddr = $t01072210788._2
539+ let $t01086210928 = calcStakingFuncAndAddres(stake, assetId)
540+ let call = $t01086210928._1
541+ let stakingAddr = $t01086210928._2
539542 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
540543 }
541544
542545
543546 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
544547 then {
545- let $t01097511077 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546- let call = $t01097511077._1
547- let addr = $t01097511077._2
548- let params = $t01097511077._3
549- let payments = $t01097511077._4
548+ let $t01111511217 = calcStakingParams(true, amount, fromBase58String(assetIdString))
549+ let call = $t01111511217._1
550+ let addr = $t01111511217._2
551+ let params = $t01111511217._3
552+ let payments = $t01111511217._4
550553 invoke(addr, call, params, payments)
551554 }
552555 else 0
553556
554557
555558 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
556559 then {
557- let $t01126211365 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558- let call = $t01126211365._1
559- let addr = $t01126211365._2
560- let params = $t01126211365._3
561- let payments = $t01126211365._4
560+ let $t01140211505 = calcStakingParams(false, amount, fromBase58String(assetIdString))
561+ let call = $t01140211505._1
562+ let addr = $t01140211505._2
563+ let params = $t01140211505._3
564+ let payments = $t01140211505._4
562565 invoke(addr, call, params, payments)
563566 }
564567 else 0
565568
566569
567570 func stakedAmount (assetId) = {
568571 let stakedAmountCalculated = match assetId {
569572 case aId: ByteVector =>
570573 if ((aId == USDN))
571574 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
572575 else 0
573576 case _: Unit =>
574577 0
575578 case _ =>
576579 throw("Match error")
577580 }
578581 match stakedAmountCalculated {
579582 case i: Int =>
580583 i
581584 case _ =>
582585 0
583586 }
584587 }
585588
586589
587590 func checkSuspicious () = {
588591 let contractBalances = _xp()
589592 func checkBalance (acc,assetId) = {
590- let $t01197612001 = acc
591- let suspicious = $t01197612001._1
592- let i = $t01197612001._2
593+ let $t01211612141 = acc
594+ let suspicious = $t01211612141._1
595+ let i = $t01211612141._2
593596 if (suspicious)
594597 then $Tuple2(suspicious, i)
595598 else {
596599 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
597600 if ((contractBalances[i] > aBalance))
598601 then $Tuple2(true, i)
599602 else $Tuple2(false, (i + 1))
600603 }
601604 }
602605
603606 let $l = assetIds
604607 let $s = size($l)
605608 let $acc0 = $Tuple2(false, 0)
606609 func $f0_1 ($a,$i) = if (($i >= $s))
607610 then $a
608611 else checkBalance($a, $l[$i])
609612
610613 func $f0_2 ($a,$i) = if (($i >= $s))
611614 then $a
612615 else throw("List size exceeds 10")
613616
614617 $f0_2($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)
615618 }
616619
617620
618621 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
619622
620623
621624 func returnPayments (caller,payments) = {
622625 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
623626
624627 let $l = payments
625628 let $s = size($l)
626629 let $acc0 = nil
627630 func $f0_1 ($a,$i) = if (($i >= $s))
628631 then $a
629632 else parsePayments($a, $l[$i])
630633
631634 func $f0_2 ($a,$i) = if (($i >= $s))
632635 then $a
633636 else throw("List size exceeds 10")
634637
635638 $f0_2($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)
636639 }
637640
638641
639642 func checkDAppThreshold (newBalances) = {
640643 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
641644 let thresholdScale = 10000
642645 let maxBalance = max(newBalances)
643646 let minBalance = min(newBalances)
644647 let ratio = fraction(maxBalance, thresholdScale, minBalance)
645648 if ((ratio > (dAppThresholdCoef * thresholdScale)))
646649 then throw("New balance in assets of the DApp is less than threshold")
647650 else false
648651 }
649652
650653
651654 func checkCoins (assetIds) = {
652655 let coins = split(assetIds, ",")
653656 if ((size(coins) > 10))
654657 then throw("To many coins, max coins size 10")
655658 else {
656659 func checkCoin (error,assetId) = {
657660 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
658661 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
659662 if ((decimals != DECIMALS))
660663 then throw("wrong decimals")
661664 else false
662665 }
663666
664667 let $l = coins
665668 let $s = size($l)
666669 let $acc0 = false
667670 func $f0_1 ($a,$i) = if (($i >= $s))
668671 then $a
669672 else checkCoin($a, $l[$i])
670673
671674 func $f0_2 ($a,$i) = if (($i >= $s))
672675 then $a
673676 else throw("List size exceeds 10")
674677
675678 $f0_2($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)
676679 }
677680 }
678681
679682
680683 @Callable(msg)
681684 func D (xp,amp) = {
682685 let D = get_D_internal(xp, amp)
683686 $Tuple2([IntegerEntry("D", D)], D)
684687 }
685688
686689
687690
688691 @Callable(msg)
689692 func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
690693 then throw("Already initialized")
691694 else if ((0 >= _A))
692695 then throw("Amp must be must > 0")
693696 else if ((0 >= _dAppThresholdCoef))
694697 then throw("dApp Threshold Coef must be > 0")
695698 else {
696699 let shareName = "s_Multi_USD"
697700 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
698701 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
699702 let tokenId = calculateAssetId(issueToken)
700703 if (checkCoins(assetIds))
701704 then throw()
702705 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]
703706 }
704707
705708
706709
707710 @Callable(msg)
708-func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
711+func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), {
709712 let amp = _A()
710713 let xp = _xp()
711714 let D0 = if ((shareSupply == 0))
712715 then 0
713716 else getDMem(xp, amp)
714717 let payments = msg.payments
715718 let paymentsSize = size(payments)
716719 func validPayments (n) = if ((paymentsSize > nCoins))
717720 then throw(("payments size > " + toString(nCoins)))
718721 else if ((1 > paymentsSize))
719722 then throw("payments size < 1")
720723 else if (if ((shareSupply == 0))
721724 then (nCoins != paymentsSize)
722725 else false)
723726 then throw("initial deposit requires all coins")
724727 else {
725728 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
726729 then true
727730 else throw("Invalid asset in payment")
728731
729732 let $l = payments
730733 let $s = size($l)
731734 let $acc0 = false
732735 func $f0_1 ($a,$i) = if (($i >= $s))
733736 then $a
734737 else paymantValid($a, $l[$i])
735738
736739 func $f0_2 ($a,$i) = if (($i >= $s))
737740 then $a
738741 else throw("List size exceeds 10")
739742
740743 $f0_2($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)
741744 }
742745
743746 if (!(validPayments(paymentsSize)))
744747 then throw()
745748 else {
746749 let suspicious = checkSuspicious()
747750 if (suspicious._1)
748751 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
749752 else {
750753 func parsePayments (acc,assetId) = {
751- let $t01609216118 = acc
752- let newBalances = $t01609216118._1
753- let i = $t01609216118._2
754+ let $t01624716273 = acc
755+ let newBalances = $t01624716273._1
756+ let i = $t01624716273._2
754757 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
755758 then (newBalance + payment.amount)
756759 else newBalance
757760
758761 let newBalace = {
759762 let $l = payments
760763 let $s = size($l)
761764 let $acc0 = xp[i]
762765 func $f0_1 ($a,$i) = if (($i >= $s))
763766 then $a
764767 else parsePayment($a, $l[$i])
765768
766769 func $f0_2 ($a,$i) = if (($i >= $s))
767770 then $a
768771 else throw("List size exceeds 10")
769772
770773 $f0_2($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)
771774 }
772775 $Tuple2((newBalances :+ newBalace), (i + 1))
773776 }
774777
775- let $t01646816535 = {
778+ let $t01662316690 = {
776779 let $l = assetIds
777780 let $s = size($l)
778781 let $acc0 = $Tuple2(nil, 0)
779782 func $f0_1 ($a,$i) = if (($i >= $s))
780783 then $a
781784 else parsePayments($a, $l[$i])
782785
783786 func $f0_2 ($a,$i) = if (($i >= $s))
784787 then $a
785788 else throw("List size exceeds 10")
786789
787790 $f0_2($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)
788791 }
789- let newBalances = $t01646816535._1
790- let k = $t01646816535._2
792+ let newBalances = $t01662316690._1
793+ let k = $t01662316690._2
791794 if (checkDAppThreshold(newBalances))
792795 then throw()
793796 else {
794797 let D1 = getDMem(newBalances, amp)
795798 if (assert((D1 > D0)))
796799 then throw("D1 > D0")
797800 else {
798801 let feeDiscount = calculateFeeDiscount(msg.caller)
799802 func calcScriptActions (acc,newBalance) = {
800- let $t01685516896 = acc
801- let invBalances = $t01685516896._1
802- let scriptActions = $t01685516896._2
803- let i = $t01685516896._3
803+ let $t01701017051 = acc
804+ let invBalances = $t01701017051._1
805+ let scriptActions = $t01701017051._2
806+ let i = $t01701017051._3
804807 if ((shareSupply > 0))
805808 then {
806809 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
807810 let fees = {
808811 let idealBalance = fraction(D1, xp[i], D0)
809812 let difference = if ((idealBalance > newBalance))
810813 then (idealBalance - newBalance)
811814 else (newBalance - idealBalance)
812815 fraction(_fee, difference, feeScale6)
813816 }
814817 let governanceFees = fraction(fees, feeGovernance, feeScale6)
815818 let finalBalance = (newBalance - fees)
816819 let invariantBalance = (newBalance - fees)
817820 let pmt = (newBalance - xp[i])
818821 let lpFees = (fees - governanceFees)
819822 let inv = if ((pmt > 0))
820823 then stake((pmt - fees), assetIds[i])
821824 else unstake(fees, assetIds[i])
822825 if ((inv == inv))
823826 then {
824827 let airdrop = if ((lpFees > 0))
825828 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
826829 else 0
827830 if ((airdrop == airdrop))
828831 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
829832 else throw("Strict value is not equal to itself.")
830833 }
831834 else throw("Strict value is not equal to itself.")
832835 }
833836 else {
834837 let inv = stake(newBalance, assetIds[i])
835838 if ((inv == inv))
836839 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
837840 else throw("Strict value is not equal to itself.")
838841 }
839842 }
840843
841- let $t01860118689 = {
844+ let $t01875618844 = {
842845 let $l = newBalances
843846 let $s = size($l)
844847 let $acc0 = $Tuple3(nil, nil, 0)
845848 func $f1_1 ($a,$i) = if (($i >= $s))
846849 then $a
847850 else calcScriptActions($a, $l[$i])
848851
849852 func $f1_2 ($a,$i) = if (($i >= $s))
850853 then $a
851854 else throw("List size exceeds 10")
852855
853856 $f1_2($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)
854857 }
855- let invBalances = $t01860118689._1
856- let scriptActions = $t01860118689._2
858+ let invBalances = $t01875618844._1
859+ let scriptActions = $t01875618844._2
857860 let D2 = getDMem(invBalances, amp)
858861 let mint_amount = if ((shareSupply == 0))
859862 then D1
860863 else fraction(shareSupply, (D2 - D0), D0)
861864 if (assert((mint_amount >= minMintAmount)))
862865 then throw("Slippage screwed you")
863866 else if (stakeFarming)
864867 then {
865868 let re = invoke(this, "reissueShare", [mint_amount], nil)
866869 if ((re == re))
867870 then {
868- let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
871+ let s = invoke(farmingAddress, "lockShareTokens", [toString(this), lockType], [AttachedPayment(shareAssetId, mint_amount)])
869872 if ((s == s))
870873 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
871874 else throw("Strict value is not equal to itself.")
872875 }
873876 else throw("Strict value is not equal to itself.")
874877 }
875878 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
876879 }
877880 }
878881 }
879882 }
880883 })
881884
882885
883886
884887 @Callable(msg)
885888 func calcMintAmount (newBalances,user) = {
886889 let amp = _A()
887890 let xp = _xp()
888891 let D1 = getDMem(newBalances, amp)
889892 if ((shareSupply == 0))
890893 then $Tuple2(nil, D1)
891894 else {
892895 let D0 = getDMem(xp, amp)
893896 let feeDiscount = calculateFeeDiscount(user)
894897 func calcInvBalances (acc,newBalance) = {
895- let $t01987819904 = acc
896- let invBalances = $t01987819904._1
897- let i = $t01987819904._2
898+ let $t02008320109 = acc
899+ let invBalances = $t02008320109._1
900+ let i = $t02008320109._2
898901 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
899902 let fees = {
900903 let idealBalance = fraction(D1, xp[i], D0)
901904 let difference = if ((idealBalance > newBalance))
902905 then (idealBalance - newBalance)
903906 else (newBalance - idealBalance)
904907 fraction(_fee, difference, feeScale6)
905908 }
906909 let invariantBalance = (newBalance - fees)
907910 $Tuple2((invBalances :+ invariantBalance), (i + 1))
908911 }
909912
910- let $t02050620576 = {
913+ let $t02071120781 = {
911914 let $l = newBalances
912915 let $s = size($l)
913916 let $acc0 = $Tuple2(nil, 0)
914917 func $f0_1 ($a,$i) = if (($i >= $s))
915918 then $a
916919 else calcInvBalances($a, $l[$i])
917920
918921 func $f0_2 ($a,$i) = if (($i >= $s))
919922 then $a
920923 else throw("List size exceeds 10")
921924
922925 $f0_2($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)
923926 }
924- let invBalances = $t02050620576._1
925- let k = $t02050620576._2
927+ let invBalances = $t02071120781._1
928+ let k = $t02071120781._2
926929 let D2 = getDMem(invBalances, amp)
927930 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
928931 $Tuple2(nil, mintAmount)
929932 }
930933 }
931934
932935
933936
934937 @Callable(msg)
935938 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
936939
937940
938941
939942 @Callable(msg)
940943 func getDy (assetFrom,assetTo,dx,userAddress) = {
941944 let xp = _xp()
942945 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
943946 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
944947 let x = (xp[fromIndex] + dx)
945948 let y = getY(fromIndex, toIndex, x, xp)
946949 let dy = ((xp[toIndex] - y) - 1)
947950 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
948951 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
949952 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
950953 }
951954
952955
953956
954957 @Callable(msg)
955958 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
956959 then throw("size(payments) != 1")
957960 else {
958961 let suspicious = checkSuspicious()
959962 if (suspicious._1)
960963 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
961964 else {
962965 let payment = msg.payments[0]
963966 let tokenIn = getStrAssetId(payment.assetId)
964967 let tokenOutB58 = fromBase58String(tokenOut)
965968 let dx = payment.amount
966969 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
967970 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
968971 let xp = _xp()
969972 let x = (xp[fromIndex] + dx)
970973 let y = getY(fromIndex, toIndex, x, xp)
971974 let _dy = ((xp[toIndex] - y) - 1)
972975 let feeDiscount = calculateFeeDiscount(msg.originCaller)
973976 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
974977 let dy = (_dy - _fee)
975978 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
976979 if (assert((dy >= min_dy)))
977980 then throw("Exchange resulted in fewer coins than expected")
978981 else {
979982 func makeNewBalances (acc,tokenBalance) = {
980- let $t02261722643 = acc
981- let newBalances = $t02261722643._1
982- let i = $t02261722643._2
983+ let $t02282222848 = acc
984+ let newBalances = $t02282222848._1
985+ let i = $t02282222848._2
983986 if ((i == fromIndex))
984987 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
985988 else if ((i == toIndex))
986989 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
987990 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
988991 }
989992
990- let $t02289422955 = {
993+ let $t02309923160 = {
991994 let $l = xp
992995 let $s = size($l)
993996 let $acc0 = $Tuple2(nil, 0)
994997 func $f0_1 ($a,$i) = if (($i >= $s))
995998 then $a
996999 else makeNewBalances($a, $l[$i])
9971000
9981001 func $f0_2 ($a,$i) = if (($i >= $s))
9991002 then $a
10001003 else throw("List size exceeds 10")
10011004
10021005 $f0_2($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)
10031006 }
1004- let newBalances = $t02289422955._1
1005- let i = $t02289422955._2
1007+ let newBalances = $t02309923160._1
1008+ let i = $t02309923160._2
10061009 if (checkDAppThreshold(newBalances))
10071010 then throw()
10081011 else {
10091012 let s = stake(payment.amount, getStrAssetId(payment.assetId))
10101013 if ((s == s))
10111014 then {
10121015 let us = unstake(_dy, tokenOut)
10131016 if ((us == us))
10141017 then {
10151018 let lpFees = (_fee - governanceFees)
10161019 let airdrop = if ((lpFees > 0))
10171020 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
10181021 else 0
10191022 if ((airdrop == airdrop))
10201023 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
10211024 else throw("Strict value is not equal to itself.")
10221025 }
10231026 else throw("Strict value is not equal to itself.")
10241027 }
10251028 else throw("Strict value is not equal to itself.")
10261029 }
10271030 }
10281031 }
10291032 })
10301033
10311034
10321035
10331036 @Callable(msg)
10341037 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10351038 then throw("size(payments) != 1")
10361039 else {
10371040 let pmtAmount = msg.payments[0].amount
10381041 let pmtAssetId = msg.payments[0].assetId
10391042 if ((shareAssetId != pmtAssetId))
10401043 then throw("unknown payment token")
10411044 else {
10421045 let suspicious = checkSuspicious()
10431046 if (suspicious._1)
10441047 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10451048 else {
10461049 func calcScriptActions (acc,balance) = {
1047- let $t02424624274 = acc
1048- let scriptActions = $t02424624274._1
1049- let i = $t02424624274._2
1050+ let $t02445124479 = acc
1051+ let scriptActions = $t02445124479._1
1052+ let i = $t02445124479._2
10501053 let wAmount = fraction(balance, pmtAmount, shareSupply)
10511054 if (assert((wAmount >= minAmounts[i])))
10521055 then throw("Withdrawal resulted in fewer coins than expected")
10531056 else {
10541057 let us = unstake(wAmount, assetIds[i])
10551058 if ((us == us))
10561059 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
10571060 else throw("Strict value is not equal to itself.")
10581061 }
10591062 }
10601063
1061- let $t02476424832 = {
1064+ let $t02496925037 = {
10621065 let $l = _xp()
10631066 let $s = size($l)
10641067 let $acc0 = $Tuple2(nil, 0)
10651068 func $f0_1 ($a,$i) = if (($i >= $s))
10661069 then $a
10671070 else calcScriptActions($a, $l[$i])
10681071
10691072 func $f0_2 ($a,$i) = if (($i >= $s))
10701073 then $a
10711074 else throw("List size exceeds 10")
10721075
10731076 $f0_2($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)
10741077 }
1075- let scriptActions = $t02476424832._1
1076- let i = $t02476424832._2
1078+ let scriptActions = $t02496925037._1
1079+ let i = $t02496925037._2
10771080 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10781081 }
10791082 }
10801083 })
10811084
10821085
10831086
10841087 @Callable(msg)
10851088 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10861089 then throw("Unlock amount must be positive")
10871090 else {
10881091 let suspicious = checkSuspicious()
10891092 if (suspicious._1)
10901093 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10911094 else {
10921095 let pmtAmount = if ((size(msg.payments) > 0))
10931096 then if ((size(msg.payments) != 1))
10941097 then throw("size(payments) != 1")
10951098 else {
10961099 let pmtAssetId = msg.payments[0].assetId
10971100 if ((shareAssetId != pmtAssetId))
10981101 then throw("unknown payment token")
10991102 else msg.payments[0].amount
11001103 }
11011104 else 0
11021105 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11031106 if ((unlock == unlock))
11041107 then {
11051108 let withdrawAmount = (pmtAmount + unlockAmount)
11061109 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
11071110 if ((inv == inv))
11081111 then nil
11091112 else throw("Strict value is not equal to itself.")
11101113 }
11111114 else throw("Strict value is not equal to itself.")
11121115 }
11131116 })
11141117
11151118
11161119
11171120 @Callable(msg)
11181121 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = if ((0 >= tokenAmount))
11191122 then throw("Amount must be positive")
11201123 else {
11211124 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11221125 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
11231126 }
11241127
11251128
11261129
11271130 @Callable(msg)
11281131 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
11291132 then throw("size(payments) != 1")
11301133 else {
11311134 let suspicious = checkSuspicious()
11321135 if (suspicious._1)
11331136 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
11341137 else {
11351138 let pmtAmount = msg.payments[0].amount
11361139 let pmtAssetId = msg.payments[0].assetId
11371140 if ((pmtAssetId != shareAssetId))
11381141 then throw("unknown token")
11391142 else {
11401143 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11411144 let tokenOutB58 = fromBase58String(tokenOut)
11421145 let xp = _xp()
1143- let $t02686426946 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1144- let dy = $t02686426946._1
1145- let dy_fee = $t02686426946._2
1146+ let $t02706927151 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147+ let dy = $t02706927151._1
1148+ let dy_fee = $t02706927151._2
11461149 if (assert((dy >= minAmount)))
11471150 then throw("Not enough coins removed")
11481151 else {
11491152 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11501153 let dy_and_fee = (dy + dy_fee)
11511154 func makeNewBalances (acc,tokenBalance) = {
1152- let $t02720427230 = acc
1153- let newBalances = $t02720427230._1
1154- let i = $t02720427230._2
1155+ let $t02740927435 = acc
1156+ let newBalances = $t02740927435._1
1157+ let i = $t02740927435._2
11551158 if ((i == outIndex))
11561159 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11571160 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11581161 }
11591162
1160- let $t02739727458 = {
1163+ let $t02760227663 = {
11611164 let $l = xp
11621165 let $s = size($l)
11631166 let $acc0 = $Tuple2(nil, 0)
11641167 func $f0_1 ($a,$i) = if (($i >= $s))
11651168 then $a
11661169 else makeNewBalances($a, $l[$i])
11671170
11681171 func $f0_2 ($a,$i) = if (($i >= $s))
11691172 then $a
11701173 else throw("List size exceeds 10")
11711174
11721175 $f0_2($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)
11731176 }
1174- let newBalances = $t02739727458._1
1175- let v = $t02739727458._2
1177+ let newBalances = $t02760227663._1
1178+ let v = $t02760227663._2
11761179 if (checkDAppThreshold(newBalances))
11771180 then throw()
11781181 else {
11791182 let us = unstake(dy_and_fee, tokenOut)
11801183 if ((us == us))
11811184 then {
11821185 let lpFees = (dy_fee - governanceFees)
11831186 let airdrop = if ((lpFees > 0))
11841187 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11851188 else 0
11861189 if ((airdrop == airdrop))
11871190 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))]
11881191 else throw("Strict value is not equal to itself.")
11891192 }
11901193 else throw("Strict value is not equal to itself.")
11911194 }
11921195 }
11931196 }
11941197 }
11951198 })
11961199
11971200
11981201
11991202 @Callable(msg)
12001203 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
12011204 then throw("Unlock amount must be positive")
12021205 else {
12031206 let suspicious = checkSuspicious()
12041207 if (suspicious._1)
12051208 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
12061209 else {
12071210 let pmtAmount = if ((size(msg.payments) > 0))
12081211 then if ((size(msg.payments) != 1))
12091212 then throw("size(payments) != 1")
12101213 else {
12111214 let pmtAssetId = msg.payments[0].assetId
12121215 if ((shareAssetId != pmtAssetId))
12131216 then throw("unknown payment token")
12141217 else msg.payments[0].amount
12151218 }
12161219 else 0
12171220 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
12181221 if ((unlock == unlock))
12191222 then {
12201223 let withdrawAmount = (pmtAmount + unlockAmount)
12211224 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
12221225 if ((inv == inv))
12231226 then nil
12241227 else throw("Strict value is not equal to itself.")
12251228 }
12261229 else throw("Strict value is not equal to itself.")
12271230 }
12281231 })
12291232
12301233
12311234
12321235 @Callable(msg)
12331236 func A () = $Tuple2(nil, _A())
12341237
12351238
12361239
12371240 @Callable(msg)
12381241 func getVirtualPrice () = {
12391242 let D = get_D(_xp(), _A())
12401243 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12411244 }
12421245
12431246
12441247
12451248 @Callable(msg)
12461249 func calcTokenAmount (amounts,deposit) = {
12471250 let amp = _A()
12481251 let balances = _xp()
12491252 let D0 = getDMem(balances, amp)
12501253 func calcNewBalances (acc,balance) = {
1251- let $t02947529501 = acc
1252- let newBalances = $t02947529501._1
1253- let i = $t02947529501._2
1254+ let $t02968029706 = acc
1255+ let newBalances = $t02968029706._1
1256+ let i = $t02968029706._2
12541257 let newBalance = (balance + (if (deposit)
12551258 then amounts[i]
12561259 else -(amounts[i])))
12571260 $Tuple2((newBalances :+ newBalance), (i + 1))
12581261 }
12591262
12601263 let newBalances = ( let $l = balances
12611264 let $s = size($l)
12621265 let $acc0 = $Tuple2(nil, 0)
12631266 func $f0_1 ($a,$i) = if (($i >= $s))
12641267 then $a
12651268 else calcNewBalances($a, $l[$i])
12661269
12671270 func $f0_2 ($a,$i) = if (($i >= $s))
12681271 then $a
12691272 else throw("List size exceeds 10")
12701273
12711274 $f0_2($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))._1
12721275 let D1 = getDMem(newBalances, amp)
12731276 let diff = if (deposit)
12741277 then (D1 - D0)
12751278 else (D0 - D1)
12761279 $Tuple2(nil, fraction(diff, shareSupply, D0))
12771280 }
12781281
12791282
12801283
12811284 @Callable(msg)
12821285 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12831286 then throw("too often")
12841287 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12851288 then throw("insufficient time")
12861289 else {
12871290 let _initial_A = _A()
12881291 if (assert(if ((_futureA > 0))
12891292 then (MAX_A > _futureA)
12901293 else false))
12911294 then throw("out of base range")
12921295 else if (assert(if (if ((_futureA >= _initial_A))
12931296 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12941297 else false)
12951298 then true
12961299 else if ((_initial_A > _futureA))
12971300 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12981301 else false))
12991302 then throw("out of range")
13001303 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
13011304 }))
13021305
13031306
13041307
13051308 @Callable(msg)
13061309 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
13071310 let currentA = _A()
13081311 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
13091312 }))
13101313
13111314
13121315
13131316 @Callable(msg)
13141317 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13151318 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13161319 else suspend("Paused by admin"))
13171320
13181321
13191322
13201323 @Callable(msg)
13211324 func activate () = valueOrElse(isAdminCall(msg), if (active)
13221325 then throwIsActive()
13231326 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13241327
13251328
13261329
13271330 @Callable(msg)
13281331 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), if ((msg.caller != moneyBoxAddress))
13291332 then throw("Only the wallet can call this function")
13301333 else {
13311334 let balances = _xp()
13321335 func takeExtraFunds (acc,assetId) = {
1333- let $t03184331861 = acc
1334- let sum = $t03184331861._1
1335- let i = $t03184331861._2
1336+ let $t03204832066 = acc
1337+ let sum = $t03204832066._1
1338+ let i = $t03204832066._2
13361339 let tokenB58 = fromBase58String(assetId)
13371340 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13381341 let enrollAmount = (rBalance - balances[i])
13391342 if ((0 > enrollAmount))
13401343 then suspend(("Enroll amount negative for asset" + assetId))
13411344 else {
13421345 let airdrop = if ((enrollAmount > 0))
13431346 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
13441347 else 0
13451348 if ((airdrop == airdrop))
13461349 then $Tuple2((sum + enrollAmount), (i + 1))
13471350 else throw("Strict value is not equal to itself.")
13481351 }
13491352 }
13501353
13511354 let k = {
13521355 let $l = assetIds
13531356 let $s = size($l)
13541357 let $acc0 = $Tuple2(0, 0)
13551358 func $f0_1 ($a,$i) = if (($i >= $s))
13561359 then $a
13571360 else takeExtraFunds($a, $l[$i])
13581361
13591362 func $f0_2 ($a,$i) = if (($i >= $s))
13601363 then $a
13611364 else throw("List size exceeds 10")
13621365
13631366 $f0_2($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)
13641367 }
13651368 if ((k._1 == 0))
13661369 then throw("No money to take")
13671370 else nil
13681371 })
13691372
13701373
13711374 @Verifier(tx)
13721375 func verify () = {
13731376 let multiSignedByAdmins = {
13741377 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13751378 then 1
13761379 else 0
13771380 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13781381 then 1
13791382 else 0
13801383 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13811384 then 1
13821385 else 0
13831386 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13841387 }
13851388 match tx {
13861389 case inv: InvokeScriptTransaction =>
13871390 let callTakeIntoAccount = if ((inv.dApp == this))
13881391 then (inv.function == "takeIntoAccountExtraFunds")
13891392 else false
13901393 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13911394 then true
13921395 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13931396 then true
13941397 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13951398 then true
13961399 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
13971400 if (if (callTakeIntoAccount)
13981401 then signedByAdmin
13991402 else false)
14001403 then true
14011404 else multiSignedByAdmins
14021405 case _ =>
14031406 multiSignedByAdmins
14041407 }
14051408 }
14061409

github/deemru/w8io/3ef1775 
270.18 ms