tx · Aykfwr5jGhNU1JhkCPYo8TqJ3CeJcoZe7MeXSiyMnhgb

3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS:  -0.14000000 Waves

2022.10.24 16:06 [2286532] smart account 3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS > SELF 0.00000000 Waves

{ "type": 13, "id": "Aykfwr5jGhNU1JhkCPYo8TqJ3CeJcoZe7MeXSiyMnhgb", "fee": 14000000, "feeAssetId": null, "timestamp": 1666616810525, "version": 2, "chainId": 84, "sender": "3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS", "senderPublicKey": "C7xgcYqQ8qV8rmvzAjhQWq4cz82F6VJfXMNygvrTXsfW", "proofs": [ "5BZXzsSYq9yZD9Y2Uxc3H4ykVxPn5wUPMqtRW7gytH79Jn1omvsmQdSBFcx7QGMDeiQ8cfxzcT4C8QZqSYWGUGq9", "3AnhyBKhrqvBbai5RR9CGhEn1hQwdmfJanoQ1oPZDKfwcjZTKfbwxUUqSd4dTYA11cjASpFA5HCWLAESp36G4tiD" ], "script": "base64:BgJmCAISBAoCEQESBQoDCAEBEgUKAwEEARIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIAWAAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAARa1NoYXJlQXNzZXRTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAEa0ZlZQIKY29tbWlzc2lvbgASa0RBcHBUaHJlc2hvbGRDb2VmAhFkQXBwVGhyZXNob2xkQ29lZgAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MACmtEaXNjb3VudHMCCWRpc2NvdW50cwAPa0Rpc2NvdW50VmFsdWVzAg9kaXNjb3VudF92YWx1ZXMADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQAD2tVc2VyR1N3b3BJbkdvdgINX0dTd29wX2Ftb3VudAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzAARVU0ROASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIFBHRoaXMIBQFpBmNhbGxlcgUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ABGJpZzIJALYCAQACAAZpdGVyMTAJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwABml0ZXIxNQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsAAZpdGVyMTYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPBQNuaWwADmJsb2NrVGltZXN0YW1wBQZoZWlnaHQBBmFzc2VydAEBYQMFAWEHBgEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBAR1c2VyBAckbWF0Y2gwBQh1c2VyQWRkcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAF1BQckbWF0Y2gwCQClCAEFAXUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF1BQckbWF0Y2gwBQF1CQACAQIYVW5rbm93IHR5cGUgb2YgdXNlciBBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEdXNlcgUPa1VzZXJHU3dvcEluR292AAAEC2dTd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEdXNlcgUPa1VzZXJHU3dvcEluR292BQpzd29wQW1vdW50BA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAACQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAAAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAEDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwADAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEFDWZ1dHVyZV9BX3RpbWUEAkExBQhmdXR1cmVfQQMJAGYCBQJ0MQUOYmxvY2tUaW1lc3RhbXAEAkEwBQlpbml0aWFsX0EEAnQwBQ5pbml0aWFsX0FfdGltZQMJAGYCBQJBMQUCQTAJAGQCBQJB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MTAxNDYCXzIEDHhwX3JlZHVjZWRfaQkAkQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMDcxMDEwNzc2CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMDcxMDEwNzc2Al8xBAtzdGFraW5nQWRkcggFDSR0MDEwNzEwMTA3NzYCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDEwODYyMTA5MjgJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDEwODYyMTA5MjgCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTA4NjIxMDkyOAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExMTE1MTEyMTcJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExMTE1MTEyMTcCXzEEBGFkZHIIBQ0kdDAxMTExNTExMjE3Al8yBAZwYXJhbXMIBQ0kdDAxMTExNTExMjE3Al8zBAhwYXltZW50cwgFDSR0MDExMTE1MTEyMTcCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTQwMjExNTA1CQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTQwMjExNTA1Al8xBARhZGRyCAUNJHQwMTE0MDIxMTUwNQJfMgQGcGFyYW1zCAUNJHQwMTE0MDIxMTUwNQJfMwQIcGF5bWVudHMIBQ0kdDAxMTQwMjExNTA1Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjExNjEyMTQxBQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjExNjEyMTQxAl8xBAFpCAUNJHQwMTIxMTYxMjE0MQJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEXN1c3BlbmRTdXNwaWNpb3VzAQFpCQEHc3VzcGVuZAEJAKwCAgIdU3VzcGljaW91cyBzdGF0ZSB3aXRoIGFzc2V0OiAJAJEDAgUIYXNzZXRJZHMFAWkBDnJldHVyblBheW1lbnRzAgZjYWxsZXIIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHcGF5bWVudAkAzQgCBQNhY2MJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcggFB3BheW1lbnQGYW1vdW50CAUHcGF5bWVudAdhc3NldElkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJjaGVja0RBcHBUaHJlc2hvbGQBC25ld0JhbGFuY2VzBBFkQXBwVGhyZXNob2xkQ29lZgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFEmtEQXBwVGhyZXNob2xkQ29lZgIYTm8gZEFwcFRocmVzaG9sZENvZWYga2V5BA50aHJlc2hvbGRTY2FsZQCQTgQKbWF4QmFsYW5jZQkAlgMBBQtuZXdCYWxhbmNlcwQKbWluQmFsYW5jZQkAlwMBBQtuZXdCYWxhbmNlcwQFcmF0aW8JAGsDBQptYXhCYWxhbmNlBQ50aHJlc2hvbGRTY2FsZQUKbWluQmFsYW5jZQMJAGYCBQVyYXRpbwkAaAIFEWRBcHBUaHJlc2hvbGRDb2VmBQ50aHJlc2hvbGRTY2FsZQkAAgECOE5ldyBiYWxhbmNlIGluIGFzc2V0cyBvZiB0aGUgREFwcCBpcyBsZXNzIHRoYW4gdGhyZXNob2xkBwEKY2hlY2tDb2lucwEIYXNzZXRJZHMEBWNvaW5zCQC1CQIFCGFzc2V0SWRzAgEsAwkAZgIJAJADAQUFY29pbnMACgkAAgECIFRvIG1hbnkgY29pbnMsIG1heCBjb2lucyBzaXplIDEwCgEJY2hlY2tDb2luAgVlcnJvcgdhc3NldElkBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDZBAEFB2Fzc2V0SWQJAKwCAgISZnJvbUJhc2U1OFN0cmluZzogBQdhc3NldElkBAhkZWNpbWFscwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQVhc3NldAkArAICAgthc3NldEluZm86IAUHYXNzZXRJZAhkZWNpbWFscwMJAQIhPQIFCGRlY2ltYWxzBQhERUNJTUFMUwkAAgECDndyb25nIGRlY2ltYWxzBwoAAiRsBQVjb2lucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQljaGVja0NvaW4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoUA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDCGFzc2V0SWRzAl9BEl9kQXBwVGhyZXNob2xkQ29lZgMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAMJAGcCAAAFAl9BCQACAQIUQW1wIG11c3QgYmUgbXVzdCA+IDADCQBnAgAABRJfZEFwcFRocmVzaG9sZENvZWYJAAIBAh9kQXBwIFRocmVzaG9sZCBDb2VmIG11c3QgYmUgPiAwBAlzaGFyZU5hbWUCC3NfTXVsdGlfVVNEBBBzaGFyZURlc2NyaXB0aW9uCQCsAgICQlNoYXJlVG9rZW4gb2YgU3dvcEZpIHByb3RvY29sIGZvciBNdWx0aVN0YWJsZSBVU0QgcG9vbCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBAppc3N1ZVRva2VuCQDCCAUFCXNoYXJlTmFtZQUQc2hhcmVEZXNjcmlwdGlvbgAAAAYGBAd0b2tlbklkCQC4CAEFCmlzc3VlVG9rZW4DCQEKY2hlY2tDb2lucwEFCGFzc2V0SWRzCQEFdGhyb3cACQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgUSX2RBcHBUaHJlc2hvbGRDb2VmCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDbXNnAQxhZGRMaXF1aWRpdHkDDW1pbk1pbnRBbW91bnQMc3Rha2VGYXJtaW5nCGxvY2tUeXBlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABANhbXAJAQJfQQAEAnhwCQEDX3hwAAQCRDADCQAAAgULc2hhcmVTdXBwbHkAAAAACQEHZ2V0RE1lbQIFAnhwBQNhbXAEDSR0MDE1MzQ5MTU1NjIDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzBQZuQ29pbnMJAJQKAgkA0QgCCAUDbXNnCHBheW1lbnRzCQBlAgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAMwIAgkAkQMCCAUDbXNnCHBheW1lbnRzCQBlAgkAkAMBCAUDbXNnCHBheW1lbnRzAAEFA25pbAkAlAoCCAUDbXNnCHBheW1lbnRzBQNuaWwECHBheW1lbnRzCAUNJHQwMTUzNDkxNTU2MgJfMQQHbG9ja0ZlZQgFDSR0MDE1MzQ5MTU1NjICXzIEDHBheW1lbnRzU2l6ZQkAkAMBBQhwYXltZW50cwoBDXZhbGlkUGF5bWVudHMBAW4DCQBmAgUMcGF5bWVudHNTaXplBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUMcGF5bWVudHNTaXplCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUMcGF5bWVudHNTaXplBwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMKAQxwYXltYW50VmFsaWQCA2FjYwdwYXltZW50AwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQGCQACAQIYSW52YWxpZCBhc3NldCBpbiBwYXltZW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBheW1hbnRWYWxpZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAQEhAQkBDXZhbGlkUGF5bWVudHMBBQxwYXltZW50c1NpemUJAQV0aHJvdwAECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyBQhwYXltZW50cwoBDXBhcnNlUGF5bWVudHMCA2FjYwdhc3NldElkBA0kdDAxNjQzMjE2NDU4BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMTY0MzIxNjQ1OAJfMQQBaQgFDSR0MDE2NDMyMTY0NTgCXzIKAQxwYXJzZVBheW1lbnQCCm5ld0JhbGFuY2UHcGF5bWVudAMJAAACCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAGQCBQpuZXdCYWxhbmNlCAUHcGF5bWVudAZhbW91bnQFCm5ld0JhbGFuY2UECW5ld0JhbGFjZQoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJEDAgUCeHAFAWkKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBhcnNlUGF5bWVudAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQluZXdCYWxhY2UJAGQCBQFpAAEEDSR0MDE2ODA4MTY4NzUKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDE2ODA4MTY4NzUCXzEEAWsIBQ0kdDAxNjgwODE2ODc1Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDE3MTk1MTcyMzYFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAxNzE5NTE3MjM2Al8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTcxOTUxNzIzNgJfMgQBaQgFDSR0MDE3MTk1MTcyMzYCXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYEDGZpbmFsQmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBANwbXQJAGUCBQpuZXdCYWxhbmNlCQCRAwIFAnhwBQFpBAZscEZlZXMJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwQDaW52AwkAZgIFA3BtdAAACQEFc3Rha2UCCQBlAgUDcG10BQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANpbnYJAQVzdGFrZQIFCm5ld0JhbGFuY2UJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxODk0MTE5MDI5CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLaW52QmFsYW5jZXMIBQ0kdDAxODk0MTE5MDI5Al8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTg5NDExOTAyOQJfMgQCRDIJAQdnZXRETWVtAgULaW52QmFsYW5jZXMFA2FtcAQLbWludF9hbW91bnQDCQAAAgULc2hhcmVTdXBwbHkAAAUCRDEJAGsDBQtzaGFyZVN1cHBseQkAZQIFAkQyBQJEMAUCRDADCQEGYXNzZXJ0AQkAZwIFC21pbnRfYW1vdW50BQ1taW5NaW50QW1vdW50CQACAQIUU2xpcHBhZ2Ugc2NyZXdlZCB5b3UDBQxzdGFrZUZhcm1pbmcEAnJlCQD8BwQFBHRoaXMCDHJlaXNzdWVTaGFyZQkAzAgCBQttaW50X2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUCcmUFAnJlBAFzCQD8BwQFDmZhcm1pbmdBZGRyZXNzAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFCGxvY2tUeXBlBQNuaWwJAM4IAgkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAUDbmlsBQdsb2NrRmVlAwkAAAIFAXMFAXMJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgULbWludF9hbW91bnQFDHNoYXJlQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQFA25pbANtc2cBDmNhbGNNaW50QW1vdW50AgtuZXdCYWxhbmNlcwR1c2VyBANhbXAJAQJfQQAEAnhwCQEDX3hwAAQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAMJAAACBQtzaGFyZVN1cHBseQAACQCUCgIFA25pbAUCRDEEAkQwCQEHZ2V0RE1lbQIFAnhwBQNhbXAEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBBQR1c2VyCgEPY2FsY0ludkJhbGFuY2VzAgNhY2MKbmV3QmFsYW5jZQQNJHQwMjAyNzkyMDMwNQUDYWNjBAtpbnZCYWxhbmNlcwgFDSR0MDIwMjc5MjAzMDUCXzEEAWkIBQ0kdDAyMDI3OTIwMzA1Al8yBARfZmVlCQBpAgkAaAIJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFBm5Db2lucwkAaAIABAkAZQIFBm5Db2lucwABBARmZWVzBAxpZGVhbEJhbGFuY2UJAGsDBQJEMQkAkQMCBQJ4cAUBaQUCRDAECmRpZmZlcmVuY2UDCQBmAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUMaWRlYWxCYWxhbmNlCQBrAwUEX2ZlZQUKZGlmZmVyZW5jZQUJZmVlU2NhbGU2BBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwkAlAoCCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQBkAgUBaQABBA0kdDAyMDkwNzIwOTc3CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY0ludkJhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtpbnZCYWxhbmNlcwgFDSR0MDIwOTA3MjA5NzcCXzEEAWsIBQ0kdDAyMDkwNzIwOTc3Al8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAptaW50QW1vdW50CQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwCQCUCgIFA25pbAUKbWludEFtb3VudANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnDG9yaWdpbkNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMzAxODIzMDQ0BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjMwMTgyMzA0NAJfMQQBaQgFDSR0MDIzMDE4MjMwNDQCXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUDX2R5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjMyOTUyMzM1NgoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLbmV3QmFsYW5jZXMIBQ0kdDAyMzI5NTIzMzU2Al8xBAFpCAUNJHQwMjMyOTUyMzM1NgJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQBcwkBBXN0YWtlAggFB3BheW1lbnQGYW1vdW50CQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQDCQAAAgUBcwUBcwQCdXMJAQd1bnN0YWtlAgUDX2R5BQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBF9mZWUFDmdvdmVybmFuY2VGZWVzBAdhaXJkcm9wAwkAZgIFBmxwRmVlcwAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdG9rZW5PdXRCNTgFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSW4FDWtBc3NldEJhbGFuY2UFAXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIdG9rZW5PdXQFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQNfZHkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFAmR5BQt0b2tlbk91dEI1OAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFDmdvdmVybmFuY2VGZWVzBQt0b2tlbk91dEI1OAUDbmlsCQDMCAIFAmR5CQDMCAIFC3Rva2VuT3V0QjU4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQh3aXRoZHJhdwEKbWluQW1vdW50cwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQJcG10QW1vdW50CAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50BApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbgQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwxvcmlnaW5DYWxsZXIIBQNtc2cIcGF5bWVudHMKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjB2JhbGFuY2UEDSR0MDI0NjQ3MjQ2NzUFA2FjYwQNc2NyaXB0QWN0aW9ucwgFDSR0MDI0NjQ3MjQ2NzUCXzEEAWkIBQ0kdDAyNDY0NzI0Njc1Al8yBAd3QW1vdW50CQBrAwUHYmFsYW5jZQUJcG10QW1vdW50BQtzaGFyZVN1cHBseQMJAQZhc3NlcnQBCQBnAgUHd0Ftb3VudAkAkQMCBQptaW5BbW91bnRzBQFpCQACAQIwV2l0aGRyYXdhbCByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkBAJ1cwkBB3Vuc3Rha2UCBQd3QW1vdW50CQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFAnVzBQJ1cwkAlAoCCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQkAZQIFB2JhbGFuY2UFB3dBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwxvcmlnaW5DYWxsZXIFB3dBbW91bnQJANkEAQkAkQMCBQhhc3NldElkcwUBaQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAyNTE2NTI1MjMzCgACJGwJAQNfeHAACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyNTE2NTI1MjMzAl8xBAFpCAUNJHQwMjUxNjUyNTIzMwJfMgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQlwbXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFCXBtdEFtb3VudAUDbmlsA21zZwESd2l0aGRyYXdXaXRoVW5sb2NrAgptaW5BbW91bnRzDHVubG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAGcCAAAFDHVubG9ja0Ftb3VudAkAAgECHlVubG9jayBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMECXBtdEFtb3VudAMJAGYCCQCQAwEIBQNtc2cIcGF5bWVudHMAAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQAAAQGdW5sb2NrCQD8BwQFDmZhcm1pbmdBZGRyZXNzAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFCXBtdEFtb3VudAUMdW5sb2NrQW1vdW50BANpbnYJAPwHBAUEdGhpcwIId2l0aGRyYXcJAMwIAgUKbWluQW1vdW50cwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFDndpdGhkcmF3QW1vdW50BQNuaWwDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBE2NhbGNXaXRoZHJhd09uZUNvaW4DC3Rva2VuQW1vdW50CHRva2VuT3V0BHVzZXIDCQBnAgAABQt0b2tlbkFtb3VudAkAAgECF0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlBAFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAkAlAoCBQNuaWwICQEUX2NhbGNXaXRoZHJhd09uZUNvaW4ECQEDX3hwAAULdG9rZW5BbW91bnQFAWkJAQdBZGRyZXNzAQkA2QQBBQR1c2VyAl8xA21zZwEPd2l0aGRyYXdPbmVDb2luAgh0b2tlbk91dAltaW5BbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUKcG10QXNzZXRJZAUMc2hhcmVBc3NldElkCQACAQINdW5rbm93biB0b2tlbgQIb3V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCeHAJAQNfeHAABA0kdDAyNzI2NTI3MzQ3CQEUX2NhbGNXaXRoZHJhd09uZUNvaW4EBQJ4cAUJcG10QW1vdW50BQhvdXRJbmRleAgFA21zZwxvcmlnaW5DYWxsZXIEAmR5CAUNJHQwMjcyNjUyNzM0NwJfMQQGZHlfZmVlCAUNJHQwMjcyNjUyNzM0NwJfMgMJAQZhc3NlcnQBCQBnAgUCZHkFCW1pbkFtb3VudAkAAgECGE5vdCBlbm91Z2ggY29pbnMgcmVtb3ZlZAQOZ292ZXJuYW5jZUZlZXMJAGsDBQZkeV9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgQKZHlfYW5kX2ZlZQkAZAIFAmR5BQZkeV9mZWUKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDI3NjA1Mjc2MzEFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNzYwNTI3NjMxAl8xBAFpCAUNJHQwMjc2MDUyNzYzMQJfMgMJAAACBQFpBQhvdXRJbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQpkeV9hbmRfZmVlCQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjc3OTgyNzg1OQoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLbmV3QmFsYW5jZXMIBQ0kdDAyNzc5ODI3ODU5Al8xBAF2CAUNJHQwMjc3OTgyNzg1OQJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQCdXMJAQd1bnN0YWtlAgUKZHlfYW5kX2ZlZQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzBAZscEZlZXMJAGUCBQZkeV9mZWUFDmdvdmVybmFuY2VGZWVzBAdhaXJkcm9wAwkAZgIFBmxwRmVlcwAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdG9rZW5PdXRCNTgFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnDG9yaWdpbkNhbGxlcgUCZHkFC3Rva2VuT3V0QjU4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFCG91dEluZGV4BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUIb3V0SW5kZXgFCmR5X2FuZF9mZWUJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFCXBtdEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFDmdvdmVybmFuY2VGZWVzBQt0b2tlbk91dEI1OAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUJcG10QW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnARl3aXRoZHJhd09uZUNvaW5XaXRoVW5sb2NrAwh0b2tlbk91dAltaW5BbW91bnQMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50AwkAZgIJAJADAQgFA21zZwhwYXltZW50cwAAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbggJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAAABAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEA2ludgkA/AcEBQR0aGlzAg93aXRoZHJhd09uZUNvaW4JAMwIAgUIdG9rZW5PdXQJAMwIAgUJbWluQW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEBQQAJAJQKAgUDbmlsCQECX0EAA21zZwEPZ2V0VmlydHVhbFByaWNlAAQBRAkBBWdldF9EAgkBA194cAAJAQJfQQAJAJQKAgUDbmlsCQBrAwUBRAUJUFJFQ0lTSU9OBQtzaGFyZVN1cHBseQNtc2cBD2NhbGNUb2tlbkFtb3VudAIHYW1vdW50cwdkZXBvc2l0BANhbXAJAQJfQQAECGJhbGFuY2VzCQEDX3hwAAQCRDAJAQdnZXRETWVtAgUIYmFsYW5jZXMFA2FtcAoBD2NhbGNOZXdCYWxhbmNlcwIDYWNjB2JhbGFuY2UEDSR0MDI5ODc2Mjk5MDIFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyOTg3NjI5OTAyAl8xBAFpCAUNJHQwMjk4NzYyOTkwMgJfMgQKbmV3QmFsYW5jZQkAZAIFB2JhbGFuY2UDBQdkZXBvc2l0CQCRAwIFB2Ftb3VudHMFAWkJAQEtAQkAkQMCBQdhbW91bnRzBQFpCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFCm5ld0JhbGFuY2UJAGQCBQFpAAEEC25ld0JhbGFuY2VzCAoAAiRsBQhiYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIIBQNtc2cGY2FsbGVyBQ9tb25leUJveEFkZHJlc3MJAAIBAiZPbmx5IHRoZSB3YWxsZXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQIYmFsYW5jZXMJAQNfeHAACgEOdGFrZUV4dHJhRnVuZHMCA2FjYwdhc3NldElkBA0kdDAzMjI0NDMyMjYyBQNhY2MEA3N1bQgFDSR0MDMyMjQ0MzIyNjICXzEEAWkIBQ0kdDAzMjI0NDMyMjYyAl8yBAh0b2tlbkI1OAkA2QQBBQdhc3NldElkBAhyQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwUIdG9rZW5CNTgJAQxzdGFrZWRBbW91bnQBBQh0b2tlbkI1OAQMZW5yb2xsQW1vdW50CQBlAgUIckJhbGFuY2UJAJEDAgUIYmFsYW5jZXMFAWkDCQBmAgAABQxlbnJvbGxBbW91bnQJAQdzdXNwZW5kAQkArAICAiBFbnJvbGwgYW1vdW50IG5lZ2F0aXZlIGZvciBhc3NldAUHYXNzZXRJZAQHYWlyZHJvcAMJAGYCBQxlbnJvbGxBbW91bnQAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHRva2VuQjU4BQxlbnJvbGxBbW91bnQFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAZAIFA3N1bQUMZW5yb2xsQW1vdW50CQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAFrCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEOdGFrZUV4dHJhRnVuZHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAggFAWsCXzEAAAkAAgECEE5vIG1vbmV5IHRvIHRha2UFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQTY2FsbFRha2VJbnRvQWNjb3VudAMJAAACCAUDaW52BGRBcHAFBHRoaXMJAAACCAUDaW52CGZ1bmN0aW9uAhl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQNc2lnbmVkQnlBZG1pbgMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkyBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkzBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAURYWRtaW5QdWJLZXlJbnZva2UDAwUTY2FsbFRha2VJbnRvQWNjb3VudAUNc2lnbmVkQnlBZG1pbgcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5z1L0Ezw==", "height": 2286532, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9GDJqh7tMaqmqFFHYGC89reXt68bGsNyNuufFpxj1mEp Next: H5nDHCAQYfWvdHmpwq6BAKet1aHwZp2YKtdkh8e4rTVo Diff:
OldNewDifferences
714714 let D0 = if ((shareSupply == 0))
715715 then 0
716716 else getDMem(xp, amp)
717- let payments = msg.payments
717+ let $t01534915562 = if ((size(msg.payments) > nCoins))
718+ then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
719+ else $Tuple2(msg.payments, nil)
720+ let payments = $t01534915562._1
721+ let lockFee = $t01534915562._2
718722 let paymentsSize = size(payments)
719723 func validPayments (n) = if ((paymentsSize > nCoins))
720724 then throw(("payments size > " + toString(nCoins)))
751755 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
752756 else {
753757 func parsePayments (acc,assetId) = {
754- let $t01624716273 = acc
755- let newBalances = $t01624716273._1
756- let i = $t01624716273._2
758+ let $t01643216458 = acc
759+ let newBalances = $t01643216458._1
760+ let i = $t01643216458._2
757761 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
758762 then (newBalance + payment.amount)
759763 else newBalance
775779 $Tuple2((newBalances :+ newBalace), (i + 1))
776780 }
777781
778- let $t01662316690 = {
782+ let $t01680816875 = {
779783 let $l = assetIds
780784 let $s = size($l)
781785 let $acc0 = $Tuple2(nil, 0)
789793
790794 $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)
791795 }
792- let newBalances = $t01662316690._1
793- let k = $t01662316690._2
796+ let newBalances = $t01680816875._1
797+ let k = $t01680816875._2
794798 if (checkDAppThreshold(newBalances))
795799 then throw()
796800 else {
800804 else {
801805 let feeDiscount = calculateFeeDiscount(msg.caller)
802806 func calcScriptActions (acc,newBalance) = {
803- let $t01701017051 = acc
804- let invBalances = $t01701017051._1
805- let scriptActions = $t01701017051._2
806- let i = $t01701017051._3
807+ let $t01719517236 = acc
808+ let invBalances = $t01719517236._1
809+ let scriptActions = $t01719517236._2
810+ let i = $t01719517236._3
807811 if ((shareSupply > 0))
808812 then {
809813 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
841845 }
842846 }
843847
844- let $t01875618844 = {
848+ let $t01894119029 = {
845849 let $l = newBalances
846850 let $s = size($l)
847851 let $acc0 = $Tuple3(nil, nil, 0)
855859
856860 $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)
857861 }
858- let invBalances = $t01875618844._1
859- let scriptActions = $t01875618844._2
862+ let invBalances = $t01894119029._1
863+ let scriptActions = $t01894119029._2
860864 let D2 = getDMem(invBalances, amp)
861865 let mint_amount = if ((shareSupply == 0))
862866 then D1
868872 let re = invoke(this, "reissueShare", [mint_amount], nil)
869873 if ((re == re))
870874 then {
871- let s = invoke(farmingAddress, "lockShareTokens", [toString(this), lockType], [AttachedPayment(shareAssetId, mint_amount)])
875+ let s = invoke(farmingAddress, "lockShareTokens", [toString(this), lockType], ([AttachedPayment(shareAssetId, mint_amount)] ++ lockFee))
872876 if ((s == s))
873877 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
874878 else throw("Strict value is not equal to itself.")
895899 let D0 = getDMem(xp, amp)
896900 let feeDiscount = calculateFeeDiscount(user)
897901 func calcInvBalances (acc,newBalance) = {
898- let $t02008320109 = acc
899- let invBalances = $t02008320109._1
900- let i = $t02008320109._2
902+ let $t02027920305 = acc
903+ let invBalances = $t02027920305._1
904+ let i = $t02027920305._2
901905 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
902906 let fees = {
903907 let idealBalance = fraction(D1, xp[i], D0)
910914 $Tuple2((invBalances :+ invariantBalance), (i + 1))
911915 }
912916
913- let $t02071120781 = {
917+ let $t02090720977 = {
914918 let $l = newBalances
915919 let $s = size($l)
916920 let $acc0 = $Tuple2(nil, 0)
924928
925929 $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)
926930 }
927- let invBalances = $t02071120781._1
928- let k = $t02071120781._2
931+ let invBalances = $t02090720977._1
932+ let k = $t02090720977._2
929933 let D2 = getDMem(invBalances, amp)
930934 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
931935 $Tuple2(nil, mintAmount)
980984 then throw("Exchange resulted in fewer coins than expected")
981985 else {
982986 func makeNewBalances (acc,tokenBalance) = {
983- let $t02282222848 = acc
984- let newBalances = $t02282222848._1
985- let i = $t02282222848._2
987+ let $t02301823044 = acc
988+ let newBalances = $t02301823044._1
989+ let i = $t02301823044._2
986990 if ((i == fromIndex))
987991 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
988992 else if ((i == toIndex))
990994 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
991995 }
992996
993- let $t02309923160 = {
997+ let $t02329523356 = {
994998 let $l = xp
995999 let $s = size($l)
9961000 let $acc0 = $Tuple2(nil, 0)
10041008
10051009 $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)
10061010 }
1007- let newBalances = $t02309923160._1
1008- let i = $t02309923160._2
1011+ let newBalances = $t02329523356._1
1012+ let i = $t02329523356._2
10091013 if (checkDAppThreshold(newBalances))
10101014 then throw()
10111015 else {
10471051 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10481052 else {
10491053 func calcScriptActions (acc,balance) = {
1050- let $t02445124479 = acc
1051- let scriptActions = $t02445124479._1
1052- let i = $t02445124479._2
1054+ let $t02464724675 = acc
1055+ let scriptActions = $t02464724675._1
1056+ let i = $t02464724675._2
10531057 let wAmount = fraction(balance, pmtAmount, shareSupply)
10541058 if (assert((wAmount >= minAmounts[i])))
10551059 then throw("Withdrawal resulted in fewer coins than expected")
10611065 }
10621066 }
10631067
1064- let $t02496925037 = {
1068+ let $t02516525233 = {
10651069 let $l = _xp()
10661070 let $s = size($l)
10671071 let $acc0 = $Tuple2(nil, 0)
10751079
10761080 $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)
10771081 }
1078- let scriptActions = $t02496925037._1
1079- let i = $t02496925037._2
1082+ let scriptActions = $t02516525233._1
1083+ let i = $t02516525233._2
10801084 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10811085 }
10821086 }
11431147 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11441148 let tokenOutB58 = fromBase58String(tokenOut)
11451149 let xp = _xp()
1146- let $t02706927151 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147- let dy = $t02706927151._1
1148- let dy_fee = $t02706927151._2
1150+ let $t02726527347 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1151+ let dy = $t02726527347._1
1152+ let dy_fee = $t02726527347._2
11491153 if (assert((dy >= minAmount)))
11501154 then throw("Not enough coins removed")
11511155 else {
11521156 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11531157 let dy_and_fee = (dy + dy_fee)
11541158 func makeNewBalances (acc,tokenBalance) = {
1155- let $t02740927435 = acc
1156- let newBalances = $t02740927435._1
1157- let i = $t02740927435._2
1159+ let $t02760527631 = acc
1160+ let newBalances = $t02760527631._1
1161+ let i = $t02760527631._2
11581162 if ((i == outIndex))
11591163 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11601164 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11611165 }
11621166
1163- let $t02760227663 = {
1167+ let $t02779827859 = {
11641168 let $l = xp
11651169 let $s = size($l)
11661170 let $acc0 = $Tuple2(nil, 0)
11741178
11751179 $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)
11761180 }
1177- let newBalances = $t02760227663._1
1178- let v = $t02760227663._2
1181+ let newBalances = $t02779827859._1
1182+ let v = $t02779827859._2
11791183 if (checkDAppThreshold(newBalances))
11801184 then throw()
11811185 else {
12511255 let balances = _xp()
12521256 let D0 = getDMem(balances, amp)
12531257 func calcNewBalances (acc,balance) = {
1254- let $t02968029706 = acc
1255- let newBalances = $t02968029706._1
1256- let i = $t02968029706._2
1258+ let $t02987629902 = acc
1259+ let newBalances = $t02987629902._1
1260+ let i = $t02987629902._2
12571261 let newBalance = (balance + (if (deposit)
12581262 then amounts[i]
12591263 else -(amounts[i])))
13331337 else {
13341338 let balances = _xp()
13351339 func takeExtraFunds (acc,assetId) = {
1336- let $t03204832066 = acc
1337- let sum = $t03204832066._1
1338- let i = $t03204832066._2
1340+ let $t03224432262 = acc
1341+ let sum = $t03224432262._1
1342+ let i = $t03224432262._2
13391343 let tokenB58 = fromBase58String(assetId)
13401344 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13411345 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"
4141
4242 let kUserGSwopInGov = "_GSwop_amount"
4343
4444 let kAdminPubKey1 = "admin_pub_1"
4545
4646 let kAdminPubKey2 = "admin_pub_2"
4747
4848 let kAdminPubKey3 = "admin_pub_3"
4949
5050 let kAdminInvokePubKey = "admin_invoke_pub"
5151
5252 let kMoneyBoxAddress = "money_box_address"
5353
5454 let kGovAddress = "governance_address"
5555
5656 let kVotingAddress = "voting_address"
5757
5858 let kFarmingAddress = "farming_address"
5959
6060 let kLPFarmingAddress = "lp_farming"
6161
6262 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
6363
6464 func getBase58FromOracle (key) = match getString(oracle, key) {
6565 case string: String =>
6666 fromBase58String(string)
6767 case nothing =>
6868 throw((key + "is empty"))
6969 }
7070
7171
7272 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7373
7474 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7575
7676 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7777
7878 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
7979
8080 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8181
8282 let govAddress = Address(getBase58FromOracle(kGovAddress))
8383
8484 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8585
8686 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
8787
8888 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
8989
9090 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9191
9292 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
9393
9494 let stakingAssets = [toBase58String(USDN)]
9595
9696 let active = getBooleanValue(this, kActive)
9797
9898 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
9999
100100 let shareSupply = getIntegerValue(this, kShareAssetSupply)
101101
102102 let feeScale6 = 1000000
103103
104104 let fee = getIntegerValue(this, kFee)
105105
106106 let feeGovernance = fraction(40, feeScale6, 100)
107107
108108 let initial_A = getIntegerValue(this, "initial_A")
109109
110110 let future_A = getIntegerValue(this, "future_A")
111111
112112 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
113113
114114 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
115115
116116 let assetIds = split(getStringValue(this, kAssets), ",")
117117
118118 let nCoins = size(assetIds)
119119
120120 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
121121
122122
123123 func throwIsActive () = throw("DApp is already active")
124124
125125
126126 func isActive () = if (active)
127127 then unit
128128 else throw("DApp is inactive at this moment")
129129
130130
131131 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
132132 then unit
133133 else throw("Only admin can call this function")
134134
135135
136136 func isSelfCall (i) = if ((this == i.caller))
137137 then unit
138138 else throw("Only contract itself can call this function")
139139
140140
141141 let big2 = toBigInt(2)
142142
143143 let iter10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
144144
145145 let iter15 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
146146
147147 let iter16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
148148
149149 let blockTimestamp = height
150150
151151 func assert (a) = if (a)
152152 then false
153153 else true
154154
155155
156156 func calculateFeeDiscount (userAddr) = {
157157 let user = match userAddr {
158158 case u: Address =>
159159 toString(u)
160160 case u: String =>
161161 u
162162 case _ =>
163163 throw("Unknow type of user Addr")
164164 }
165165 let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), 0)
166166 let gSwopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), swopAmount)
167167 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
168168 let discounts = split(getStringValue(oracle, kDiscounts), ",")
169169 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
170170 then (parseIntValue(discountValues[1]) > gSwopAmount)
171171 else false)
172172 then (feeScale6 - parseIntValue(discounts[0]))
173173 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
174174 then (parseIntValue(discountValues[2]) > gSwopAmount)
175175 else false)
176176 then (feeScale6 - parseIntValue(discounts[1]))
177177 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
178178 then (parseIntValue(discountValues[3]) > gSwopAmount)
179179 else false)
180180 then (feeScale6 - parseIntValue(discounts[2]))
181181 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
182182 then (parseIntValue(discountValues[4]) > gSwopAmount)
183183 else false)
184184 then (feeScale6 - parseIntValue(discounts[3]))
185185 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
186186 then (feeScale6 - parseIntValue(discounts[4]))
187187 else feeScale6
188188 }
189189
190190
191191 func _A () = {
192192 let t1 = future_A_time
193193 let A1 = future_A
194194 if ((t1 > blockTimestamp))
195195 then {
196196 let A0 = initial_A
197197 let t0 = initial_A_time
198198 if ((A1 > A0))
199199 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
200200 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
201201 }
202202 else A1
203203 }
204204
205205
206206 func _xp () = {
207207 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
208208
209209 let $l = assetIds
210210 let $s = size($l)
211211 let $acc0 = nil
212212 func $f0_1 ($a,$i) = if (($i >= $s))
213213 then $a
214214 else assetBalances($a, $l[$i])
215215
216216 func $f0_2 ($a,$i) = if (($i >= $s))
217217 then $a
218218 else throw("List size exceeds 10")
219219
220220 $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)
221221 }
222222
223223
224224 func _xp_mem (xp) = xp
225225
226226
227227 func sumList (acc,element) = (acc + element)
228228
229229
230230 func get_D (xp,amp) = {
231231 let @ = invoke(this, "D", [xp, amp], nil)
232232 if ($isInstanceOf(@, "Int"))
233233 then @
234234 else throw(($getType(@) + " couldn't be cast to Int"))
235235 }
236236
237237
238238 func get_D_internal (xp,amp) = {
239239 let S = {
240240 let $l = xp
241241 let $s = size($l)
242242 let $acc0 = 0
243243 func $f0_1 ($a,$i) = if (($i >= $s))
244244 then $a
245245 else sumList($a, $l[$i])
246246
247247 func $f0_2 ($a,$i) = if (($i >= $s))
248248 then $a
249249 else throw("List size exceeds 10")
250250
251251 $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)
252252 }
253253 if ((S == 0))
254254 then 0
255255 else {
256256 let Ann = (amp * nCoins)
257257 let AnnS = (toBigInt(Ann) * toBigInt(S))
258258 let Ann1 = toBigInt((Ann - 1))
259259 func Dproc (acc,i) = if ((acc._2 == true))
260260 then acc
261261 else {
262262 let Dprev = acc._1
263263 func D_PProc (D_P,i) = if ((nCoins > i))
264264 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
265265 else D_P
266266
267267 let D_P = {
268268 let $l = iter10
269269 let $s = size($l)
270270 let $acc0 = Dprev
271271 func $f1_1 ($a,$i) = if (($i >= $s))
272272 then $a
273273 else D_PProc($a, $l[$i])
274274
275275 func $f1_2 ($a,$i) = if (($i >= $s))
276276 then $a
277277 else throw("List size exceeds 10")
278278
279279 $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)
280280 }
281281 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
282282 if ((D > Dprev))
283283 then if ((1 >= toInt((D - Dprev))))
284284 then $Tuple2(D, true)
285285 else $Tuple2(D, false)
286286 else if ((1 >= toInt((Dprev - D))))
287287 then $Tuple2(D, true)
288288 else $Tuple2(D, false)
289289 }
290290
291291 let $t064616527 = {
292292 let $l = iter15
293293 let $s = size($l)
294294 let $acc0 = $Tuple2(toBigInt(S), false)
295295 func $f1_1 ($a,$i) = if (($i >= $s))
296296 then $a
297297 else Dproc($a, $l[$i])
298298
299299 func $f1_2 ($a,$i) = if (($i >= $s))
300300 then $a
301301 else throw("List size exceeds 15")
302302
303303 $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)
304304 }
305305 let D = $t064616527._1
306306 let finished = $t064616527._2
307307 if ((finished == false))
308308 then throw(("get_D() not finished with " + toString(D)))
309309 else toInt(D)
310310 }
311311 }
312312
313313
314314 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
315315
316316
317317 func getY (in,out,x,xp_) = if (assert((in != out)))
318318 then throw("same coin")
319319 else if (assert(if ((out >= 0))
320320 then (in >= 0)
321321 else false))
322322 then throw("below zero")
323323 else if (assert(if ((nCoins > out))
324324 then (nCoins > in)
325325 else false))
326326 then throw("above N_COINS")
327327 else {
328328 let amp = _A()
329329 let D = get_D(xp_, amp)
330330 let Ann = (amp * nCoins)
331331 func S_c (acc,i) = {
332332 let $t070987115 = acc
333333 let S_ = $t070987115._1
334334 let c = $t070987115._2
335335 let x_ = if ((in == i))
336336 then x
337337 else xp_[i]
338338 if (if ((i != out))
339339 then (nCoins > i)
340340 else false)
341341 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
342342 else $Tuple2(S_, c)
343343 }
344344
345345 let $t073237378 = {
346346 let $l = iter10
347347 let $s = size($l)
348348 let $acc0 = $Tuple2(0, toBigInt(D))
349349 func $f0_1 ($a,$i) = if (($i >= $s))
350350 then $a
351351 else S_c($a, $l[$i])
352352
353353 func $f0_2 ($a,$i) = if (($i >= $s))
354354 then $a
355355 else throw("List size exceeds 10")
356356
357357 $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)
358358 }
359359 let S_ = $t073237378._1
360360 let c_ = $t073237378._2
361361 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
362362 let bD = toBigInt(((S_ + (D / Ann)) - D))
363363 func y_proc (acc,_i) = if ((acc._2 == true))
364364 then acc
365365 else {
366366 let y_prev = acc._1
367367 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
368368 if ((y > y_prev))
369369 then if ((1 >= toInt((y - y_prev))))
370370 then $Tuple2(y, true)
371371 else $Tuple2(y, false)
372372 else if ((1 >= toInt((y_prev - y))))
373373 then $Tuple2(y, true)
374374 else $Tuple2(y, false)
375375 }
376376
377377 let $t078607927 = {
378378 let $l = iter16
379379 let $s = size($l)
380380 let $acc0 = $Tuple2(toBigInt(D), false)
381381 func $f1_1 ($a,$i) = if (($i >= $s))
382382 then $a
383383 else y_proc($a, $l[$i])
384384
385385 func $f1_2 ($a,$i) = if (($i >= $s))
386386 then $a
387387 else throw("List size exceeds 16")
388388
389389 $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)
390390 }
391391 let y = $t078607927._1
392392 let finished = $t078607927._2
393393 if ((finished == false))
394394 then throw(("getY() not finished with " + toString(y)))
395395 else toInt(y)
396396 }
397397
398398
399399 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
400400 then throw("i below zero")
401401 else if (assert((nCoins > in)))
402402 then throw("i above N_COINS")
403403 else {
404404 let Ann = (A_ * nCoins)
405405 func S_c (acc,i) = {
406406 let $t083068323 = acc
407407 let S_ = $t083068323._1
408408 let c = $t083068323._2
409409 let x_ = if (if ((in != i))
410410 then (nCoins > i)
411411 else false)
412412 then xp[i]
413413 else 0
414414 if (if ((nCoins > i))
415415 then (in != i)
416416 else false)
417417 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
418418 else $Tuple2(S_, c)
419419 }
420420
421421 let $t085438598 = {
422422 let $l = iter10
423423 let $s = size($l)
424424 let $acc0 = $Tuple2(0, toBigInt(D))
425425 func $f0_1 ($a,$i) = if (($i >= $s))
426426 then $a
427427 else S_c($a, $l[$i])
428428
429429 func $f0_2 ($a,$i) = if (($i >= $s))
430430 then $a
431431 else throw("List size exceeds 10")
432432
433433 $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)
434434 }
435435 let S_ = $t085438598._1
436436 let c_ = $t085438598._2
437437 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
438438 let bD = toBigInt(((S_ + (D / Ann)) - D))
439439 func y_D_proc (acc,i) = if ((acc._2 == true))
440440 then acc
441441 else {
442442 let y_prev = acc._1
443443 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
444444 if ((y > y_prev))
445445 then if ((1 >= toInt((y - y_prev))))
446446 then $Tuple2(y, true)
447447 else $Tuple2(y, false)
448448 else if ((1 >= toInt((y_prev - y))))
449449 then $Tuple2(y, true)
450450 else $Tuple2(y, false)
451451 }
452452
453453 let $t090819150 = {
454454 let $l = iter16
455455 let $s = size($l)
456456 let $acc0 = $Tuple2(toBigInt(D), false)
457457 func $f1_1 ($a,$i) = if (($i >= $s))
458458 then $a
459459 else y_D_proc($a, $l[$i])
460460
461461 func $f1_2 ($a,$i) = if (($i >= $s))
462462 then $a
463463 else throw("List size exceeds 16")
464464
465465 $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)
466466 }
467467 let y = $t090819150._1
468468 let finished = $t090819150._2
469469 if ((finished == false))
470470 then throw(("get_y_D() not finished with " + toString(y)))
471471 else toInt(y)
472472 }
473473
474474
475475 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
476476 let feeDiscount = calculateFeeDiscount(caller)
477477 let amp = _A()
478478 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
479479 let total_supply = shareSupply
480480 let D0 = get_D(xp, amp)
481481 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
482482 let new_y = get_y_D(amp, i, xp, D1)
483483 let dy_0 = (xp[i] - new_y)
484484 func xp_reduced_proc (acc,xp_j) = {
485485 let $t097919820 = acc
486486 let xp_reduced = $t097919820._1
487487 let index = $t097919820._2
488488 let dx_expected = if ((index == i))
489489 then (fraction(xp_j, D1, D0) - new_y)
490490 else (xp_j - fraction(xp_j, D1, D0))
491491 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
492492 }
493493
494494 let $t01008210146 = {
495495 let $l = xp
496496 let $s = size($l)
497497 let $acc0 = $Tuple2(nil, 0)
498498 func $f0_1 ($a,$i) = if (($i >= $s))
499499 then $a
500500 else xp_reduced_proc($a, $l[$i])
501501
502502 func $f0_2 ($a,$i) = if (($i >= $s))
503503 then $a
504504 else throw("List size exceeds 10")
505505
506506 $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)
507507 }
508508 let xp_reduced = $t01008210146._1
509509 let index = $t01008210146._2
510510 let xp_reduced_i = xp_reduced[i]
511511 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
512512 $Tuple2(dy, (dy_0 - dy))
513513 }
514514
515515
516516 func getStrAssetId (assetId) = match assetId {
517517 case id: ByteVector =>
518518 toBase58String(id)
519519 case waves: Unit =>
520520 "WAVES"
521521 case _ =>
522522 throw("Match error")
523523 }
524524
525525
526526 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
527527 then $Tuple2("lockNeutrino", stakingUSDNAddress)
528528 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
529529
530530
531531 func calcStakingParams (stake,amount,assetId) = if (stake)
532532 then {
533533 let $t01071010776 = calcStakingFuncAndAddres(stake, assetId)
534534 let call = $t01071010776._1
535535 let stakingAddr = $t01071010776._2
536536 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
537537 }
538538 else {
539539 let $t01086210928 = calcStakingFuncAndAddres(stake, assetId)
540540 let call = $t01086210928._1
541541 let stakingAddr = $t01086210928._2
542542 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
543543 }
544544
545545
546546 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
547547 then {
548548 let $t01111511217 = calcStakingParams(true, amount, fromBase58String(assetIdString))
549549 let call = $t01111511217._1
550550 let addr = $t01111511217._2
551551 let params = $t01111511217._3
552552 let payments = $t01111511217._4
553553 invoke(addr, call, params, payments)
554554 }
555555 else 0
556556
557557
558558 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
559559 then {
560560 let $t01140211505 = calcStakingParams(false, amount, fromBase58String(assetIdString))
561561 let call = $t01140211505._1
562562 let addr = $t01140211505._2
563563 let params = $t01140211505._3
564564 let payments = $t01140211505._4
565565 invoke(addr, call, params, payments)
566566 }
567567 else 0
568568
569569
570570 func stakedAmount (assetId) = {
571571 let stakedAmountCalculated = match assetId {
572572 case aId: ByteVector =>
573573 if ((aId == USDN))
574574 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
575575 else 0
576576 case _: Unit =>
577577 0
578578 case _ =>
579579 throw("Match error")
580580 }
581581 match stakedAmountCalculated {
582582 case i: Int =>
583583 i
584584 case _ =>
585585 0
586586 }
587587 }
588588
589589
590590 func checkSuspicious () = {
591591 let contractBalances = _xp()
592592 func checkBalance (acc,assetId) = {
593593 let $t01211612141 = acc
594594 let suspicious = $t01211612141._1
595595 let i = $t01211612141._2
596596 if (suspicious)
597597 then $Tuple2(suspicious, i)
598598 else {
599599 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
600600 if ((contractBalances[i] > aBalance))
601601 then $Tuple2(true, i)
602602 else $Tuple2(false, (i + 1))
603603 }
604604 }
605605
606606 let $l = assetIds
607607 let $s = size($l)
608608 let $acc0 = $Tuple2(false, 0)
609609 func $f0_1 ($a,$i) = if (($i >= $s))
610610 then $a
611611 else checkBalance($a, $l[$i])
612612
613613 func $f0_2 ($a,$i) = if (($i >= $s))
614614 then $a
615615 else throw("List size exceeds 10")
616616
617617 $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)
618618 }
619619
620620
621621 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
622622
623623
624624 func returnPayments (caller,payments) = {
625625 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
626626
627627 let $l = payments
628628 let $s = size($l)
629629 let $acc0 = nil
630630 func $f0_1 ($a,$i) = if (($i >= $s))
631631 then $a
632632 else parsePayments($a, $l[$i])
633633
634634 func $f0_2 ($a,$i) = if (($i >= $s))
635635 then $a
636636 else throw("List size exceeds 10")
637637
638638 $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)
639639 }
640640
641641
642642 func checkDAppThreshold (newBalances) = {
643643 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
644644 let thresholdScale = 10000
645645 let maxBalance = max(newBalances)
646646 let minBalance = min(newBalances)
647647 let ratio = fraction(maxBalance, thresholdScale, minBalance)
648648 if ((ratio > (dAppThresholdCoef * thresholdScale)))
649649 then throw("New balance in assets of the DApp is less than threshold")
650650 else false
651651 }
652652
653653
654654 func checkCoins (assetIds) = {
655655 let coins = split(assetIds, ",")
656656 if ((size(coins) > 10))
657657 then throw("To many coins, max coins size 10")
658658 else {
659659 func checkCoin (error,assetId) = {
660660 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
661661 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
662662 if ((decimals != DECIMALS))
663663 then throw("wrong decimals")
664664 else false
665665 }
666666
667667 let $l = coins
668668 let $s = size($l)
669669 let $acc0 = false
670670 func $f0_1 ($a,$i) = if (($i >= $s))
671671 then $a
672672 else checkCoin($a, $l[$i])
673673
674674 func $f0_2 ($a,$i) = if (($i >= $s))
675675 then $a
676676 else throw("List size exceeds 10")
677677
678678 $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)
679679 }
680680 }
681681
682682
683683 @Callable(msg)
684684 func D (xp,amp) = {
685685 let D = get_D_internal(xp, amp)
686686 $Tuple2([IntegerEntry("D", D)], D)
687687 }
688688
689689
690690
691691 @Callable(msg)
692692 func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
693693 then throw("Already initialized")
694694 else if ((0 >= _A))
695695 then throw("Amp must be must > 0")
696696 else if ((0 >= _dAppThresholdCoef))
697697 then throw("dApp Threshold Coef must be > 0")
698698 else {
699699 let shareName = "s_Multi_USD"
700700 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
701701 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
702702 let tokenId = calculateAssetId(issueToken)
703703 if (checkCoins(assetIds))
704704 then throw()
705705 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]
706706 }
707707
708708
709709
710710 @Callable(msg)
711711 func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), {
712712 let amp = _A()
713713 let xp = _xp()
714714 let D0 = if ((shareSupply == 0))
715715 then 0
716716 else getDMem(xp, amp)
717- let payments = msg.payments
717+ let $t01534915562 = if ((size(msg.payments) > nCoins))
718+ then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
719+ else $Tuple2(msg.payments, nil)
720+ let payments = $t01534915562._1
721+ let lockFee = $t01534915562._2
718722 let paymentsSize = size(payments)
719723 func validPayments (n) = if ((paymentsSize > nCoins))
720724 then throw(("payments size > " + toString(nCoins)))
721725 else if ((1 > paymentsSize))
722726 then throw("payments size < 1")
723727 else if (if ((shareSupply == 0))
724728 then (nCoins != paymentsSize)
725729 else false)
726730 then throw("initial deposit requires all coins")
727731 else {
728732 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
729733 then true
730734 else throw("Invalid asset in payment")
731735
732736 let $l = payments
733737 let $s = size($l)
734738 let $acc0 = false
735739 func $f0_1 ($a,$i) = if (($i >= $s))
736740 then $a
737741 else paymantValid($a, $l[$i])
738742
739743 func $f0_2 ($a,$i) = if (($i >= $s))
740744 then $a
741745 else throw("List size exceeds 10")
742746
743747 $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)
744748 }
745749
746750 if (!(validPayments(paymentsSize)))
747751 then throw()
748752 else {
749753 let suspicious = checkSuspicious()
750754 if (suspicious._1)
751755 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
752756 else {
753757 func parsePayments (acc,assetId) = {
754- let $t01624716273 = acc
755- let newBalances = $t01624716273._1
756- let i = $t01624716273._2
758+ let $t01643216458 = acc
759+ let newBalances = $t01643216458._1
760+ let i = $t01643216458._2
757761 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
758762 then (newBalance + payment.amount)
759763 else newBalance
760764
761765 let newBalace = {
762766 let $l = payments
763767 let $s = size($l)
764768 let $acc0 = xp[i]
765769 func $f0_1 ($a,$i) = if (($i >= $s))
766770 then $a
767771 else parsePayment($a, $l[$i])
768772
769773 func $f0_2 ($a,$i) = if (($i >= $s))
770774 then $a
771775 else throw("List size exceeds 10")
772776
773777 $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)
774778 }
775779 $Tuple2((newBalances :+ newBalace), (i + 1))
776780 }
777781
778- let $t01662316690 = {
782+ let $t01680816875 = {
779783 let $l = assetIds
780784 let $s = size($l)
781785 let $acc0 = $Tuple2(nil, 0)
782786 func $f0_1 ($a,$i) = if (($i >= $s))
783787 then $a
784788 else parsePayments($a, $l[$i])
785789
786790 func $f0_2 ($a,$i) = if (($i >= $s))
787791 then $a
788792 else throw("List size exceeds 10")
789793
790794 $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)
791795 }
792- let newBalances = $t01662316690._1
793- let k = $t01662316690._2
796+ let newBalances = $t01680816875._1
797+ let k = $t01680816875._2
794798 if (checkDAppThreshold(newBalances))
795799 then throw()
796800 else {
797801 let D1 = getDMem(newBalances, amp)
798802 if (assert((D1 > D0)))
799803 then throw("D1 > D0")
800804 else {
801805 let feeDiscount = calculateFeeDiscount(msg.caller)
802806 func calcScriptActions (acc,newBalance) = {
803- let $t01701017051 = acc
804- let invBalances = $t01701017051._1
805- let scriptActions = $t01701017051._2
806- let i = $t01701017051._3
807+ let $t01719517236 = acc
808+ let invBalances = $t01719517236._1
809+ let scriptActions = $t01719517236._2
810+ let i = $t01719517236._3
807811 if ((shareSupply > 0))
808812 then {
809813 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
810814 let fees = {
811815 let idealBalance = fraction(D1, xp[i], D0)
812816 let difference = if ((idealBalance > newBalance))
813817 then (idealBalance - newBalance)
814818 else (newBalance - idealBalance)
815819 fraction(_fee, difference, feeScale6)
816820 }
817821 let governanceFees = fraction(fees, feeGovernance, feeScale6)
818822 let finalBalance = (newBalance - fees)
819823 let invariantBalance = (newBalance - fees)
820824 let pmt = (newBalance - xp[i])
821825 let lpFees = (fees - governanceFees)
822826 let inv = if ((pmt > 0))
823827 then stake((pmt - fees), assetIds[i])
824828 else unstake(fees, assetIds[i])
825829 if ((inv == inv))
826830 then {
827831 let airdrop = if ((lpFees > 0))
828832 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
829833 else 0
830834 if ((airdrop == airdrop))
831835 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
832836 else throw("Strict value is not equal to itself.")
833837 }
834838 else throw("Strict value is not equal to itself.")
835839 }
836840 else {
837841 let inv = stake(newBalance, assetIds[i])
838842 if ((inv == inv))
839843 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
840844 else throw("Strict value is not equal to itself.")
841845 }
842846 }
843847
844- let $t01875618844 = {
848+ let $t01894119029 = {
845849 let $l = newBalances
846850 let $s = size($l)
847851 let $acc0 = $Tuple3(nil, nil, 0)
848852 func $f1_1 ($a,$i) = if (($i >= $s))
849853 then $a
850854 else calcScriptActions($a, $l[$i])
851855
852856 func $f1_2 ($a,$i) = if (($i >= $s))
853857 then $a
854858 else throw("List size exceeds 10")
855859
856860 $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)
857861 }
858- let invBalances = $t01875618844._1
859- let scriptActions = $t01875618844._2
862+ let invBalances = $t01894119029._1
863+ let scriptActions = $t01894119029._2
860864 let D2 = getDMem(invBalances, amp)
861865 let mint_amount = if ((shareSupply == 0))
862866 then D1
863867 else fraction(shareSupply, (D2 - D0), D0)
864868 if (assert((mint_amount >= minMintAmount)))
865869 then throw("Slippage screwed you")
866870 else if (stakeFarming)
867871 then {
868872 let re = invoke(this, "reissueShare", [mint_amount], nil)
869873 if ((re == re))
870874 then {
871- let s = invoke(farmingAddress, "lockShareTokens", [toString(this), lockType], [AttachedPayment(shareAssetId, mint_amount)])
875+ let s = invoke(farmingAddress, "lockShareTokens", [toString(this), lockType], ([AttachedPayment(shareAssetId, mint_amount)] ++ lockFee))
872876 if ((s == s))
873877 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
874878 else throw("Strict value is not equal to itself.")
875879 }
876880 else throw("Strict value is not equal to itself.")
877881 }
878882 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
879883 }
880884 }
881885 }
882886 }
883887 })
884888
885889
886890
887891 @Callable(msg)
888892 func calcMintAmount (newBalances,user) = {
889893 let amp = _A()
890894 let xp = _xp()
891895 let D1 = getDMem(newBalances, amp)
892896 if ((shareSupply == 0))
893897 then $Tuple2(nil, D1)
894898 else {
895899 let D0 = getDMem(xp, amp)
896900 let feeDiscount = calculateFeeDiscount(user)
897901 func calcInvBalances (acc,newBalance) = {
898- let $t02008320109 = acc
899- let invBalances = $t02008320109._1
900- let i = $t02008320109._2
902+ let $t02027920305 = acc
903+ let invBalances = $t02027920305._1
904+ let i = $t02027920305._2
901905 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
902906 let fees = {
903907 let idealBalance = fraction(D1, xp[i], D0)
904908 let difference = if ((idealBalance > newBalance))
905909 then (idealBalance - newBalance)
906910 else (newBalance - idealBalance)
907911 fraction(_fee, difference, feeScale6)
908912 }
909913 let invariantBalance = (newBalance - fees)
910914 $Tuple2((invBalances :+ invariantBalance), (i + 1))
911915 }
912916
913- let $t02071120781 = {
917+ let $t02090720977 = {
914918 let $l = newBalances
915919 let $s = size($l)
916920 let $acc0 = $Tuple2(nil, 0)
917921 func $f0_1 ($a,$i) = if (($i >= $s))
918922 then $a
919923 else calcInvBalances($a, $l[$i])
920924
921925 func $f0_2 ($a,$i) = if (($i >= $s))
922926 then $a
923927 else throw("List size exceeds 10")
924928
925929 $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)
926930 }
927- let invBalances = $t02071120781._1
928- let k = $t02071120781._2
931+ let invBalances = $t02090720977._1
932+ let k = $t02090720977._2
929933 let D2 = getDMem(invBalances, amp)
930934 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
931935 $Tuple2(nil, mintAmount)
932936 }
933937 }
934938
935939
936940
937941 @Callable(msg)
938942 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
939943
940944
941945
942946 @Callable(msg)
943947 func getDy (assetFrom,assetTo,dx,userAddress) = {
944948 let xp = _xp()
945949 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
946950 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
947951 let x = (xp[fromIndex] + dx)
948952 let y = getY(fromIndex, toIndex, x, xp)
949953 let dy = ((xp[toIndex] - y) - 1)
950954 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
951955 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
952956 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
953957 }
954958
955959
956960
957961 @Callable(msg)
958962 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
959963 then throw("size(payments) != 1")
960964 else {
961965 let suspicious = checkSuspicious()
962966 if (suspicious._1)
963967 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
964968 else {
965969 let payment = msg.payments[0]
966970 let tokenIn = getStrAssetId(payment.assetId)
967971 let tokenOutB58 = fromBase58String(tokenOut)
968972 let dx = payment.amount
969973 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
970974 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
971975 let xp = _xp()
972976 let x = (xp[fromIndex] + dx)
973977 let y = getY(fromIndex, toIndex, x, xp)
974978 let _dy = ((xp[toIndex] - y) - 1)
975979 let feeDiscount = calculateFeeDiscount(msg.originCaller)
976980 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
977981 let dy = (_dy - _fee)
978982 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
979983 if (assert((dy >= min_dy)))
980984 then throw("Exchange resulted in fewer coins than expected")
981985 else {
982986 func makeNewBalances (acc,tokenBalance) = {
983- let $t02282222848 = acc
984- let newBalances = $t02282222848._1
985- let i = $t02282222848._2
987+ let $t02301823044 = acc
988+ let newBalances = $t02301823044._1
989+ let i = $t02301823044._2
986990 if ((i == fromIndex))
987991 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
988992 else if ((i == toIndex))
989993 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
990994 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
991995 }
992996
993- let $t02309923160 = {
997+ let $t02329523356 = {
994998 let $l = xp
995999 let $s = size($l)
9961000 let $acc0 = $Tuple2(nil, 0)
9971001 func $f0_1 ($a,$i) = if (($i >= $s))
9981002 then $a
9991003 else makeNewBalances($a, $l[$i])
10001004
10011005 func $f0_2 ($a,$i) = if (($i >= $s))
10021006 then $a
10031007 else throw("List size exceeds 10")
10041008
10051009 $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)
10061010 }
1007- let newBalances = $t02309923160._1
1008- let i = $t02309923160._2
1011+ let newBalances = $t02329523356._1
1012+ let i = $t02329523356._2
10091013 if (checkDAppThreshold(newBalances))
10101014 then throw()
10111015 else {
10121016 let s = stake(payment.amount, getStrAssetId(payment.assetId))
10131017 if ((s == s))
10141018 then {
10151019 let us = unstake(_dy, tokenOut)
10161020 if ((us == us))
10171021 then {
10181022 let lpFees = (_fee - governanceFees)
10191023 let airdrop = if ((lpFees > 0))
10201024 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
10211025 else 0
10221026 if ((airdrop == airdrop))
10231027 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
10241028 else throw("Strict value is not equal to itself.")
10251029 }
10261030 else throw("Strict value is not equal to itself.")
10271031 }
10281032 else throw("Strict value is not equal to itself.")
10291033 }
10301034 }
10311035 }
10321036 })
10331037
10341038
10351039
10361040 @Callable(msg)
10371041 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10381042 then throw("size(payments) != 1")
10391043 else {
10401044 let pmtAmount = msg.payments[0].amount
10411045 let pmtAssetId = msg.payments[0].assetId
10421046 if ((shareAssetId != pmtAssetId))
10431047 then throw("unknown payment token")
10441048 else {
10451049 let suspicious = checkSuspicious()
10461050 if (suspicious._1)
10471051 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10481052 else {
10491053 func calcScriptActions (acc,balance) = {
1050- let $t02445124479 = acc
1051- let scriptActions = $t02445124479._1
1052- let i = $t02445124479._2
1054+ let $t02464724675 = acc
1055+ let scriptActions = $t02464724675._1
1056+ let i = $t02464724675._2
10531057 let wAmount = fraction(balance, pmtAmount, shareSupply)
10541058 if (assert((wAmount >= minAmounts[i])))
10551059 then throw("Withdrawal resulted in fewer coins than expected")
10561060 else {
10571061 let us = unstake(wAmount, assetIds[i])
10581062 if ((us == us))
10591063 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
10601064 else throw("Strict value is not equal to itself.")
10611065 }
10621066 }
10631067
1064- let $t02496925037 = {
1068+ let $t02516525233 = {
10651069 let $l = _xp()
10661070 let $s = size($l)
10671071 let $acc0 = $Tuple2(nil, 0)
10681072 func $f0_1 ($a,$i) = if (($i >= $s))
10691073 then $a
10701074 else calcScriptActions($a, $l[$i])
10711075
10721076 func $f0_2 ($a,$i) = if (($i >= $s))
10731077 then $a
10741078 else throw("List size exceeds 10")
10751079
10761080 $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)
10771081 }
1078- let scriptActions = $t02496925037._1
1079- let i = $t02496925037._2
1082+ let scriptActions = $t02516525233._1
1083+ let i = $t02516525233._2
10801084 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10811085 }
10821086 }
10831087 })
10841088
10851089
10861090
10871091 @Callable(msg)
10881092 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10891093 then throw("Unlock amount must be positive")
10901094 else {
10911095 let suspicious = checkSuspicious()
10921096 if (suspicious._1)
10931097 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10941098 else {
10951099 let pmtAmount = if ((size(msg.payments) > 0))
10961100 then if ((size(msg.payments) != 1))
10971101 then throw("size(payments) != 1")
10981102 else {
10991103 let pmtAssetId = msg.payments[0].assetId
11001104 if ((shareAssetId != pmtAssetId))
11011105 then throw("unknown payment token")
11021106 else msg.payments[0].amount
11031107 }
11041108 else 0
11051109 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11061110 if ((unlock == unlock))
11071111 then {
11081112 let withdrawAmount = (pmtAmount + unlockAmount)
11091113 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
11101114 if ((inv == inv))
11111115 then nil
11121116 else throw("Strict value is not equal to itself.")
11131117 }
11141118 else throw("Strict value is not equal to itself.")
11151119 }
11161120 })
11171121
11181122
11191123
11201124 @Callable(msg)
11211125 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = if ((0 >= tokenAmount))
11221126 then throw("Amount must be positive")
11231127 else {
11241128 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11251129 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
11261130 }
11271131
11281132
11291133
11301134 @Callable(msg)
11311135 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
11321136 then throw("size(payments) != 1")
11331137 else {
11341138 let suspicious = checkSuspicious()
11351139 if (suspicious._1)
11361140 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
11371141 else {
11381142 let pmtAmount = msg.payments[0].amount
11391143 let pmtAssetId = msg.payments[0].assetId
11401144 if ((pmtAssetId != shareAssetId))
11411145 then throw("unknown token")
11421146 else {
11431147 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11441148 let tokenOutB58 = fromBase58String(tokenOut)
11451149 let xp = _xp()
1146- let $t02706927151 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147- let dy = $t02706927151._1
1148- let dy_fee = $t02706927151._2
1150+ let $t02726527347 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1151+ let dy = $t02726527347._1
1152+ let dy_fee = $t02726527347._2
11491153 if (assert((dy >= minAmount)))
11501154 then throw("Not enough coins removed")
11511155 else {
11521156 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11531157 let dy_and_fee = (dy + dy_fee)
11541158 func makeNewBalances (acc,tokenBalance) = {
1155- let $t02740927435 = acc
1156- let newBalances = $t02740927435._1
1157- let i = $t02740927435._2
1159+ let $t02760527631 = acc
1160+ let newBalances = $t02760527631._1
1161+ let i = $t02760527631._2
11581162 if ((i == outIndex))
11591163 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11601164 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11611165 }
11621166
1163- let $t02760227663 = {
1167+ let $t02779827859 = {
11641168 let $l = xp
11651169 let $s = size($l)
11661170 let $acc0 = $Tuple2(nil, 0)
11671171 func $f0_1 ($a,$i) = if (($i >= $s))
11681172 then $a
11691173 else makeNewBalances($a, $l[$i])
11701174
11711175 func $f0_2 ($a,$i) = if (($i >= $s))
11721176 then $a
11731177 else throw("List size exceeds 10")
11741178
11751179 $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)
11761180 }
1177- let newBalances = $t02760227663._1
1178- let v = $t02760227663._2
1181+ let newBalances = $t02779827859._1
1182+ let v = $t02779827859._2
11791183 if (checkDAppThreshold(newBalances))
11801184 then throw()
11811185 else {
11821186 let us = unstake(dy_and_fee, tokenOut)
11831187 if ((us == us))
11841188 then {
11851189 let lpFees = (dy_fee - governanceFees)
11861190 let airdrop = if ((lpFees > 0))
11871191 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11881192 else 0
11891193 if ((airdrop == airdrop))
11901194 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))]
11911195 else throw("Strict value is not equal to itself.")
11921196 }
11931197 else throw("Strict value is not equal to itself.")
11941198 }
11951199 }
11961200 }
11971201 }
11981202 })
11991203
12001204
12011205
12021206 @Callable(msg)
12031207 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
12041208 then throw("Unlock amount must be positive")
12051209 else {
12061210 let suspicious = checkSuspicious()
12071211 if (suspicious._1)
12081212 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
12091213 else {
12101214 let pmtAmount = if ((size(msg.payments) > 0))
12111215 then if ((size(msg.payments) != 1))
12121216 then throw("size(payments) != 1")
12131217 else {
12141218 let pmtAssetId = msg.payments[0].assetId
12151219 if ((shareAssetId != pmtAssetId))
12161220 then throw("unknown payment token")
12171221 else msg.payments[0].amount
12181222 }
12191223 else 0
12201224 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
12211225 if ((unlock == unlock))
12221226 then {
12231227 let withdrawAmount = (pmtAmount + unlockAmount)
12241228 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
12251229 if ((inv == inv))
12261230 then nil
12271231 else throw("Strict value is not equal to itself.")
12281232 }
12291233 else throw("Strict value is not equal to itself.")
12301234 }
12311235 })
12321236
12331237
12341238
12351239 @Callable(msg)
12361240 func A () = $Tuple2(nil, _A())
12371241
12381242
12391243
12401244 @Callable(msg)
12411245 func getVirtualPrice () = {
12421246 let D = get_D(_xp(), _A())
12431247 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12441248 }
12451249
12461250
12471251
12481252 @Callable(msg)
12491253 func calcTokenAmount (amounts,deposit) = {
12501254 let amp = _A()
12511255 let balances = _xp()
12521256 let D0 = getDMem(balances, amp)
12531257 func calcNewBalances (acc,balance) = {
1254- let $t02968029706 = acc
1255- let newBalances = $t02968029706._1
1256- let i = $t02968029706._2
1258+ let $t02987629902 = acc
1259+ let newBalances = $t02987629902._1
1260+ let i = $t02987629902._2
12571261 let newBalance = (balance + (if (deposit)
12581262 then amounts[i]
12591263 else -(amounts[i])))
12601264 $Tuple2((newBalances :+ newBalance), (i + 1))
12611265 }
12621266
12631267 let newBalances = ( let $l = balances
12641268 let $s = size($l)
12651269 let $acc0 = $Tuple2(nil, 0)
12661270 func $f0_1 ($a,$i) = if (($i >= $s))
12671271 then $a
12681272 else calcNewBalances($a, $l[$i])
12691273
12701274 func $f0_2 ($a,$i) = if (($i >= $s))
12711275 then $a
12721276 else throw("List size exceeds 10")
12731277
12741278 $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
12751279 let D1 = getDMem(newBalances, amp)
12761280 let diff = if (deposit)
12771281 then (D1 - D0)
12781282 else (D0 - D1)
12791283 $Tuple2(nil, fraction(diff, shareSupply, D0))
12801284 }
12811285
12821286
12831287
12841288 @Callable(msg)
12851289 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12861290 then throw("too often")
12871291 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12881292 then throw("insufficient time")
12891293 else {
12901294 let _initial_A = _A()
12911295 if (assert(if ((_futureA > 0))
12921296 then (MAX_A > _futureA)
12931297 else false))
12941298 then throw("out of base range")
12951299 else if (assert(if (if ((_futureA >= _initial_A))
12961300 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12971301 else false)
12981302 then true
12991303 else if ((_initial_A > _futureA))
13001304 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
13011305 else false))
13021306 then throw("out of range")
13031307 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
13041308 }))
13051309
13061310
13071311
13081312 @Callable(msg)
13091313 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
13101314 let currentA = _A()
13111315 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
13121316 }))
13131317
13141318
13151319
13161320 @Callable(msg)
13171321 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13181322 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13191323 else suspend("Paused by admin"))
13201324
13211325
13221326
13231327 @Callable(msg)
13241328 func activate () = valueOrElse(isAdminCall(msg), if (active)
13251329 then throwIsActive()
13261330 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13271331
13281332
13291333
13301334 @Callable(msg)
13311335 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), if ((msg.caller != moneyBoxAddress))
13321336 then throw("Only the wallet can call this function")
13331337 else {
13341338 let balances = _xp()
13351339 func takeExtraFunds (acc,assetId) = {
1336- let $t03204832066 = acc
1337- let sum = $t03204832066._1
1338- let i = $t03204832066._2
1340+ let $t03224432262 = acc
1341+ let sum = $t03224432262._1
1342+ let i = $t03224432262._2
13391343 let tokenB58 = fromBase58String(assetId)
13401344 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13411345 let enrollAmount = (rBalance - balances[i])
13421346 if ((0 > enrollAmount))
13431347 then suspend(("Enroll amount negative for asset" + assetId))
13441348 else {
13451349 let airdrop = if ((enrollAmount > 0))
13461350 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
13471351 else 0
13481352 if ((airdrop == airdrop))
13491353 then $Tuple2((sum + enrollAmount), (i + 1))
13501354 else throw("Strict value is not equal to itself.")
13511355 }
13521356 }
13531357
13541358 let k = {
13551359 let $l = assetIds
13561360 let $s = size($l)
13571361 let $acc0 = $Tuple2(0, 0)
13581362 func $f0_1 ($a,$i) = if (($i >= $s))
13591363 then $a
13601364 else takeExtraFunds($a, $l[$i])
13611365
13621366 func $f0_2 ($a,$i) = if (($i >= $s))
13631367 then $a
13641368 else throw("List size exceeds 10")
13651369
13661370 $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)
13671371 }
13681372 if ((k._1 == 0))
13691373 then throw("No money to take")
13701374 else nil
13711375 })
13721376
13731377
13741378 @Verifier(tx)
13751379 func verify () = {
13761380 let multiSignedByAdmins = {
13771381 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13781382 then 1
13791383 else 0
13801384 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13811385 then 1
13821386 else 0
13831387 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13841388 then 1
13851389 else 0
13861390 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13871391 }
13881392 match tx {
13891393 case inv: InvokeScriptTransaction =>
13901394 let callTakeIntoAccount = if ((inv.dApp == this))
13911395 then (inv.function == "takeIntoAccountExtraFunds")
13921396 else false
13931397 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13941398 then true
13951399 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13961400 then true
13971401 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13981402 then true
13991403 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
14001404 if (if (callTakeIntoAccount)
14011405 then signedByAdmin
14021406 else false)
14031407 then true
14041408 else multiSignedByAdmins
14051409 case _ =>
14061410 multiSignedByAdmins
14071411 }
14081412 }
14091413

github/deemru/w8io/873ac7e 
142.50 ms