tx · 2qx92co4SR1AudRP8jjYiG4t3DftPsgsLCwded8nqLzr

3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us:  -0.13400000 Waves

2022.09.16 12:11 [2231461] smart account 3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us > SELF 0.00000000 Waves

{ "type": 13, "id": "2qx92co4SR1AudRP8jjYiG4t3DftPsgsLCwded8nqLzr", "fee": 13400000, "feeAssetId": null, "timestamp": 1663319519674, "version": 2, "chainId": 84, "sender": "3N1yLGKxTbjWG76Wfcu3g1mKFy1KwN797Us", "senderPublicKey": "Fde5uhpJbFyNR686oXgTi64Bk9LBabxZiNKCncCk6vKz", "proofs": [ "3hVgtvDY6SsSRPxvN6QijxWeM1Cn8pJw7oM8tNyUFagg8UzzyhfzkG3JWPp914bVoaYWxqSgxZW7j2qBTipT6F3S", "2a423gbTLbaZYCD31YfGfMBiTVcfMkWYky5VupXfL459u1RrqQMrx8dkvAH6tDWDb1nsPyAnL2bNVffgZGATe3TG" ], "script": "base64:BgJpCAISBAoCEQESBgoECAEBBBIECgIBBBIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBXgAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAARa1NoYXJlQXNzZXRTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAEa0ZlZQIKY29tbWlzc2lvbgASa0RBcHBUaHJlc2hvbGRDb2VmAhFkQXBwVGhyZXNob2xkQ29lZgAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MACmtEaXNjb3VudHMCCWRpc2NvdW50cwAPa0Rpc2NvdW50VmFsdWVzAg9kaXNjb3VudF92YWx1ZXMADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQADWtGaXJzdEhhcnZlc3QCDWZpcnN0X2hhcnZlc3QAE2tGaXJzdEhhcnZlc3RIZWlnaHQCFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAtrU2hhcmVMaW1pdAIcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAALa0Jhc2VQZXJpb2QCC2Jhc2VfcGVyaW9kAA1rUGVyaW9kTGVuZ3RoAg1wZXJpb2RfbGVuZ3RoAAxrU3RhcnRIZWlnaHQCDHN0YXJ0X2hlaWdodAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAMc2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFDWtTaGFyZUFzc2V0SWQAC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrU2hhcmVBc3NldFN1cHBseQAJZmVlU2NhbGU2AMCEPQADZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQRrRmVlAA1mZWVHb3Zlcm5hbmNlCQBrAwAoBQlmZWVTY2FsZTYAZAAJaW5pdGlhbF9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglpbml0aWFsX0EACGZ1dHVyZV9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAghmdXR1cmVfQQAOaW5pdGlhbF9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIOaW5pdGlhbF9BX3RpbWUAAAANZnV0dXJlX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg1mdXR1cmVfQV90aW1lAAAACGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tBc3NldHMCASwABm5Db2lucwkAkAMBBQhhc3NldElkcwEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENdGhyb3dJc0FjdGl2ZQAJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQhpc0FjdGl2ZQADBQZhY3RpdmUFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAOYmxvY2tUaW1lc3RhbXAFBmhlaWdodAEGYXNzZXJ0AQFhAwUBYQcGARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIdXNlckFkZHIEBHVzZXIEByRtYXRjaDAFCHVzZXJBZGRyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAXUFByRtYXRjaDAJAKUIAQUBdQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXUFByRtYXRjaDAFAXUJAAIBAhhVbmtub3cgdHlwZSBvZiB1c2VyIEFkZHIECnN3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQR1c2VyBQ5rVXNlclN3b3BJbkdvdgAABA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEF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ZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8ECnhwX3JlZHVjZWQIBQ0kdDAxMDY5OTEwNzYzAl8xBAVpbmRleAgFDSR0MDEwNjk5MTA3NjMCXzIEDHhwX3JlZHVjZWRfaQkAkQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMTMyNzExMzkzCQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTMyNzExMzkzAl8xBAtzdGFraW5nQWRkcggFDSR0MDExMzI3MTEzOTMCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDExNDc5MTE1NDUJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExNDc5MTE1NDUCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTE0NzkxMTU0NQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExNzMyMTE4MzQJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExNzMyMTE4MzQCXzEEBGFkZHIIBQ0kdDAxMTczMjExODM0Al8yBAZwYXJhbXMIBQ0kdDAxMTczMjExODM0Al8zBAhwYXltZW50cwgFDSR0MDExNzMyMTE4MzQCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMjAxOTEyMTIyCQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMjAxOTEyMTIyAl8xBARhZGRyCAUNJHQwMTIwMTkxMjEyMgJfMgQGcGFyYW1zCAUNJHQwMTIwMTkxMjEyMgJfMwQIcGF5bWVudHMIBQ0kdDAxMjAxOTEyMTIyAl80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjczMzEyNzU4BQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjczMzEyNzU4Al8xBAFpCAUNJHQwMTI3MzMxMjc1OAJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmNoZWNrREFwcFRocmVzaG9sZAELbmV3QmFsYW5jZXMEEWRBcHBUaHJlc2hvbGRDb2VmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUSa0RBcHBUaHJlc2hvbGRDb2VmAhhObyBkQXBwVGhyZXNob2xkQ29lZiBrZXkEDnRocmVzaG9sZFNjYWxlAJBOBAptYXhCYWxhbmNlCQCWAwEFC25ld0JhbGFuY2VzBAptaW5CYWxhbmNlCQCXAwEFC25ld0JhbGFuY2VzBAVyYXRpbwkAawMFCm1heEJhbGFuY2UFDnRocmVzaG9sZFNjYWxlBQptaW5CYWxhbmNlAwkAZgIFBXJhdGlvCQBoAgURZEFwcFRocmVzaG9sZENvZWYFDnRocmVzaG9sZFNjYWxlCQACAQI4TmV3IGJhbGFuY2UgaW4gYXNzZXRzIG9mIHRoZSBEQXBwIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQHAQpjaGVja0NvaW5zAQhhc3NldElkcwQFY29pbnMJALUJAgUIYXNzZXRJZHMCASwKAQljaGVja0NvaW4CBWVycm9yB2Fzc2V0SWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQUHYXNzZXRJZAkArAICAhJmcm9tQmFzZTU4U3RyaW5nOiAFB2Fzc2V0SWQECGRlY2ltYWxzCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFBWFzc2V0CQCsAgICC2Fzc2V0SW5mbzogBQdhc3NldElkCGRlY2ltYWxzAwkBAiE9AgUIZGVjaW1hbHMFCERFQ0lNQUxTCQACAQIOd3JvbmcgZGVjaW1hbHMHCgACJGwFBWNvaW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWNoZWNrQ29pbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8UA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQECGFzc2V0SWRzAl9BEl9kQXBwVGhyZXNob2xkQ29lZgxmaXJzdEhhcnZlc3QDCQEBIQEJAJ4IAQUEdGhpcwkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQDCQBnAgAABQJfQQkAAgECFEFtcCBtdXN0IGJlIG11c3QgPiAwAwkAZwIAAAUSX2RBcHBUaHJlc2hvbGRDb2VmCQACAQIfZEFwcCBUaHJlc2hvbGQgQ29lZiBtdXN0IGJlID4gMAQJc2hhcmVOYW1lAgtzX011bHRpX1VTRAQQc2hhcmVEZXNjcmlwdGlvbgkArAICAkJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgTXVsdGlTdGFibGUgVVNEIHBvb2wgYXQgYWRkcmVzcyAJAKUIAQUEdGhpcwQKaXNzdWVUb2tlbgkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24AAAAGBgQHdG9rZW5JZAkAuAgBBQppc3N1ZVRva2VuAwkBCmNoZWNrQ29pbnMBBQhhc3NldElkcwkBBXRocm93AAQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgUSX2RBcHBUaHJlc2hvbGRDb2VmCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDBQxmaXJzdEhhcnZlc3QJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFCWJhc2VFbnRyeQNtc2cBDGFkZExpcXVpZGl0eQINbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMAMJAAACBQtzaGFyZVN1cHBseQAAAAAJAQdnZXRETWVtAgUCeHAFA2FtcAQIcGF5bWVudHMIBQNtc2cIcGF5bWVudHMEDHBheW1lbnRzU2l6ZQkAkAMBBQhwYXltZW50cwoBDXZhbGlkUGF5bWVudHMBAW4DCQBmAgUMcGF5bWVudHNTaXplBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUMcGF5bWVudHNTaXplCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUMcGF5bWVudHNTaXplBwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMKAQxwYXltYW50VmFsaWQCA2FjYwdwYXltZW50AwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQGCQACAQIYSW52YWxpZCBhc3NldCBpbiBwYXltZW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBheW1hbnRWYWxpZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8DCQEBIQEJAQ12YWxpZFBheW1lbnRzAQUMcGF5bWVudHNTaXplCQEFdGhyb3cABApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcgUIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHYXNzZXRJZAQNJHQwMTcwNjYxNzA5NQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDE3MDY2MTcwOTUCXzEEAWkIBQ0kdDAxNzA2NjE3MDk1Al8yBAFqCAUNJHQwMTcwNjYxNzA5NQJfMwMDCQBmAgUMcGF5bWVudHNTaXplBQFqCQAAAgkBDWdldFN0ckFzc2V0SWQBCAkAkQMCBQhwYXltZW50cwUBagdhc3NldElkBQdhc3NldElkBwkAlQoDCQDNCAIFC25ld0JhbGFuY2VzCQBkAgkAkQMCBQJ4cAUBaQgJAJEDAgUIcGF5bWVudHMFAWoGYW1vdW50CQBkAgUBaQABCQBkAgUBagABCQCVCgMJAM0IAgULbmV3QmFsYW5jZXMJAJEDAgUCeHAFAWkJAGQCBQFpAAEFAWoEDSR0MDE3MzE1MTc0MDEKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXBhcnNlUGF5bWVudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDE3MzE1MTc0MDECXzEEAWsIBQ0kdDAxNzMxNTE3NDAxAl8yBA5wYXJzZWRQYXltZW50cwgFDSR0MDE3MzE1MTc0MDECXzMDCQBmAgUMcGF5bWVudHNTaXplBQ5wYXJzZWRQYXltZW50cwkAAgECF0luY29yZWN0IHBheW1lbnRzIG9yZGVyAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDE3ODAyMTc4NDMFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAxNzgwMjE3ODQzAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTc4MDIxNzg0MwJfMgQBaQgFDSR0MDE3ODAyMTc4NDMCXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYEDGZpbmFsQmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBANwbXQJAGUCBQpuZXdCYWxhbmNlCQCRAwIFAnhwBQFpBAZscEZlZXMJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwQDaW52AwkAZgIFA3BtdAAACQEFc3Rha2UCCQBlAgUDcG10BQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANpbnYJAQVzdGFrZQIFCm5ld0JhbGFuY2UJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxOTU0ODE5NjM2CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC2ludkJhbGFuY2VzCAUNJHQwMTk1NDgxOTYzNgJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDE5NTQ4MTk2MzYCXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BQNuaWwDCQAAAgUBcwUBcwkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUMc2hhcmVBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAUDbmlsA21zZwEOY2FsY01pbnRBbW91bnQCC25ld0JhbGFuY2VzBHVzZXIEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkAAAIFC3NoYXJlU3VwcGx5AAAJAJQKAgUDbmlsBQJEMQQCRDAJAQdnZXRETWVtAgUCeHAFA2FtcAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEFBHVzZXIKAQ9jYWxjSW52QmFsYW5jZXMCA2FjYwpuZXdCYWxhbmNlBA0kdDAyMDgyNTIwODUxBQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMjA4MjUyMDg1MQJfMQQBaQgFDSR0MDIwODI1MjA4NTECXzIEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzCQCUCgIJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAGQCBQFpAAEEDSR0MDIxNDUzMjE1MjMKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjSW52QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtpbnZCYWxhbmNlcwgFDSR0MDIxNDUzMjE1MjMCXzEEAWsIBQ0kdDAyMTQ1MzIxNTIzAl8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAptaW50QW1vdW50CQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwCQCUCgIFA25pbAUKbWludEFtb3VudANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnBmNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMzU1ODIzNTg0BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjM1NTgyMzU4NAJfMQQBaQgFDSR0MDIzNTU4MjM1ODQCXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUDX2R5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjM4MzUyMzg5NgoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjM4MzUyMzg5NgJfMQQBaQgFDSR0MDIzODM1MjM4OTYCXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAXMJAQVzdGFrZQIIBQdwYXltZW50BmFtb3VudAkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkAwkAAAIFAXMFAXMEAnVzCQEHdW5zdGFrZQIFA19keQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzBAZscEZlZXMJAGUCBQRfZmVlBQ5nb3Zlcm5hbmNlRmVlcwQHYWlyZHJvcAMJAGYCBQZscEZlZXMAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3Rva2VuT3V0QjU4BQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUDX2R5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgFA25pbAkAzAgCBQJkeQkAzAgCBQt0b2tlbk91dEI1OAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEId2l0aGRyYXcBCm1pbkFtb3VudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECXBtdEFtb3VudAgJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzCgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwdiYWxhbmNlBA0kdDAyNTE4NzI1MjE1BQNhY2MEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyNTE4NzI1MjE1Al8xBAFpCAUNJHQwMjUxODcyNTIxNQJfMgQHd0Ftb3VudAkAawMFB2JhbGFuY2UFCXBtdEFtb3VudAULc2hhcmVTdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjU3MDUyNTc3MwoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQNc2NyaXB0QWN0aW9ucwgFDSR0MDI1NzA1MjU3NzMCXzEEAWkIBQ0kdDAyNTcwNTI1NzczAl8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFCXBtdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUJcG10QW1vdW50BQNuaWwDbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50AwkAZgIJAJADAQgFA21zZwhwYXltZW50cwAAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbggJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAAABAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEA2ludgkA/AcEBQR0aGlzAgh3aXRoZHJhdwkAzAgCBQptaW5BbW91bnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgIIdG9rZW5PdXQJbWluQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnDG9yaWdpbkNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50CAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50BApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFCnBtdEFzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4ECG91dEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAnhwCQEDX3hwAAQNJHQwMjc3MzcyNzgxOQkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFCXBtdEFtb3VudAUIb3V0SW5kZXgIBQNtc2cMb3JpZ2luQ2FsbGVyBAJkeQgFDSR0MDI3NzM3Mjc4MTkCXzEEBmR5X2ZlZQgFDSR0MDI3NzM3Mjc4MTkCXzIDCQEGYXNzZXJ0AQkAZwIFAmR5BQltaW5BbW91bnQJAAIBAhhOb3QgZW5vdWdoIGNvaW5zIHJlbW92ZWQEDmdvdmVybmFuY2VGZWVzCQBrAwUGZHlfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYECmR5X2FuZF9mZWUJAGQCBQJkeQUGZHlfZmVlCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyODA3NzI4MTAzBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjgwNzcyODEwMwJfMQQBaQgFDSR0MDI4MDc3MjgxMDMCXzIDCQAAAgUBaQUIb3V0SW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUKZHlfYW5kX2ZlZQkAZAIFAWkAAQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQx0b2tlbkJhbGFuY2UJAGQCBQFpAAEEDSR0MDI4MjcwMjgzMzEKAAIkbAUCeHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9tYWtlTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDI4MjcwMjgzMzECXzEEAXYIBQ0kdDAyODI3MDI4MzMxAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUJcG10QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCD3dpdGhkcmF3T25lQ29pbgkAzAgCBQh0b2tlbk91dAkAzAgCBQltaW5BbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMzAzNDgzMDM3NAUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDMwMzQ4MzAzNzQCXzEEAWkIBQ0kdDAzMDM0ODMwMzc0Al8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARhrZWVwTGltaXRGb3JGaXJzdEhhcnZlc3QBCnNoYXJlTGltaXQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1NoYXJlTGltaXQFCnNoYXJlTGltaXQFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQTY2FsbFRha2VJbnRvQWNjb3VudAMJAAACCAUDaW52BGRBcHAFBHRoaXMJAAACCAUDaW52CGZ1bmN0aW9uAhl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQNc2lnbmVkQnlBZG1pbgMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkyBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkzBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAURYWRtaW5QdWJLZXlJbnZva2UDAwUTY2FsbFRha2VJbnRvQWNjb3VudAUNc2lnbmVkQnlBZG1pbgcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5z7UbC3A==", "height": 2231461, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6orvAq5eLYtuVEJ5TZqEwGvGWcWmxEw5cJYcY64tgthf Next: DF1i5cugQt1rf6irM5stYXv2dUkWzfLNM4rCjQCYzdwv Diff:
OldNewDifferences
6767
6868 let kFarmingAddress = "farming_address"
6969
70+let kLPFarmingAddress = "lp_farming"
71+
7072 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7173
7274 func getBase58FromOracle (key) = match getString(oracle, key) {
9597
9698 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9799
98-let capMoneyBoxAddress = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
100+let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
99101
100102 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
101103
164166
165167
166168 func calculateFeeDiscount (userAddr) = {
167- let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
169+ let user = match userAddr {
170+ case u: Address =>
171+ toString(u)
172+ case u: String =>
173+ u
174+ case _ =>
175+ throw("Unknow type of user Addr")
176+ }
177+ let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
168178 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
169179 let discounts = split(getStringValue(oracle, kDiscounts), ",")
170180 if (if ((swopAmount >= parseIntValue(discountValues[0])))
289299 else $Tuple2(D, false)
290300 }
291301
292- let $t066756787 = {
302+ let $t068406952 = {
293303 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
294304 let $s = size($l)
295305 let $acc0 = $Tuple2(toBigInt(S), false)
303313
304314 $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)
305315 }
306- let D = $t066756787._1
307- let finished = $t066756787._2
316+ let D = $t068406952._1
317+ let finished = $t068406952._2
308318 if ((finished == false))
309319 then throw(("get_D() not finished with " + toString(D)))
310320 else toInt(D)
330340 let D = get_D(xp_, amp)
331341 let Ann = (amp * nCoins)
332342 func S_c (acc,i) = {
333- let $t073587375 = acc
334- let S_ = $t073587375._1
335- let c = $t073587375._2
343+ let $t075237540 = acc
344+ let S_ = $t075237540._1
345+ let c = $t075237540._2
336346 let x_ = if ((in == i))
337347 then x
338348 else xp_[i]
343353 else $Tuple2(S_, c)
344354 }
345355
346- let $t075837684 = {
356+ let $t077487849 = {
347357 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
348358 let $s = size($l)
349359 let $acc0 = $Tuple2(0, toBigInt(D))
357367
358368 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
359369 }
360- let S_ = $t075837684._1
361- let c_ = $t075837684._2
370+ let S_ = $t077487849._1
371+ let c_ = $t077487849._2
362372 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
363373 let bD = toBigInt(((S_ + (D / Ann)) - D))
364374 func y_proc (acc,_i) = if ((acc._2 == true))
375385 else $Tuple2(y, false)
376386 }
377387
378- let $t081668283 = {
388+ let $t083318448 = {
379389 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
380390 let $s = size($l)
381391 let $acc0 = $Tuple2(toBigInt(D), false)
389399
390400 $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)
391401 }
392- let y = $t081668283._1
393- let finished = $t081668283._2
402+ let y = $t083318448._1
403+ let finished = $t083318448._2
394404 if ((finished == false))
395405 then throw(("getY() not finished with " + toString(y)))
396406 else toInt(y)
404414 else {
405415 let Ann = (A_ * nCoins)
406416 func S_c (acc,i) = {
407- let $t086628679 = acc
408- let S_ = $t086628679._1
409- let c = $t086628679._2
417+ let $t088278844 = acc
418+ let S_ = $t088278844._1
419+ let c = $t088278844._2
410420 let x_ = if (if ((in != i))
411421 then (nCoins > i)
412422 else false)
419429 else $Tuple2(S_, c)
420430 }
421431
422- let $t088999000 = {
432+ let $t090649165 = {
423433 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
424434 let $s = size($l)
425435 let $acc0 = $Tuple2(0, toBigInt(D))
433443
434444 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
435445 }
436- let S_ = $t088999000._1
437- let c_ = $t088999000._2
446+ let S_ = $t090649165._1
447+ let c_ = $t090649165._2
438448 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
439449 let bD = toBigInt(((S_ + (D / Ann)) - D))
440450 func y_D_proc (acc,i) = if ((acc._2 == true))
451461 else $Tuple2(y, false)
452462 }
453463
454- let $t094839602 = {
464+ let $t096489767 = {
455465 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
456466 let $s = size($l)
457467 let $acc0 = $Tuple2(toBigInt(D), false)
465475
466476 $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)
467477 }
468- let y = $t094839602._1
469- let finished = $t094839602._2
478+ let y = $t096489767._1
479+ let finished = $t096489767._2
470480 if ((finished == false))
471481 then throw(("get_y_D() not finished with " + toString(y)))
472482 else toInt(y)
483493 let new_y = get_y_D(amp, i, xp, D1)
484494 let dy_0 = (xp[i] - new_y)
485495 func xp_reduced_proc (acc,xp_j) = {
486- let $t01024310272 = acc
487- let xp_reduced = $t01024310272._1
488- let index = $t01024310272._2
496+ let $t01040810437 = acc
497+ let xp_reduced = $t01040810437._1
498+ let index = $t01040810437._2
489499 let dx_expected = if ((index == i))
490500 then (fraction(xp_j, D1, D0) - new_y)
491501 else (xp_j - fraction(xp_j, D1, D0))
492502 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
493503 }
494504
495- let $t01053410598 = {
505+ let $t01069910763 = {
496506 let $l = xp
497507 let $s = size($l)
498508 let $acc0 = $Tuple2(nil, 0)
506516
507517 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
508518 }
509- let xp_reduced = $t01053410598._1
510- let index = $t01053410598._2
519+ let xp_reduced = $t01069910763._1
520+ let index = $t01069910763._2
511521 let xp_reduced_i = xp_reduced[i]
512522 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
513523 $Tuple2(dy, (dy_0 - dy))
531541
532542 func calcStakingParams (stake,amount,assetId) = if (stake)
533543 then {
534- let $t01116211228 = calcStakingFuncAndAddres(stake, assetId)
535- let call = $t01116211228._1
536- let stakingAddr = $t01116211228._2
544+ let $t01132711393 = calcStakingFuncAndAddres(stake, assetId)
545+ let call = $t01132711393._1
546+ let stakingAddr = $t01132711393._2
537547 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
538548 }
539549 else {
540- let $t01131411380 = calcStakingFuncAndAddres(stake, assetId)
541- let call = $t01131411380._1
542- let stakingAddr = $t01131411380._2
550+ let $t01147911545 = calcStakingFuncAndAddres(stake, assetId)
551+ let call = $t01147911545._1
552+ let stakingAddr = $t01147911545._2
543553 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
544554 }
545555
546556
547557 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
548558 then {
549- let $t01156711669 = calcStakingParams(true, amount, fromBase58String(assetIdString))
550- let call = $t01156711669._1
551- let addr = $t01156711669._2
552- let params = $t01156711669._3
553- let payments = $t01156711669._4
559+ let $t01173211834 = calcStakingParams(true, amount, fromBase58String(assetIdString))
560+ let call = $t01173211834._1
561+ let addr = $t01173211834._2
562+ let params = $t01173211834._3
563+ let payments = $t01173211834._4
554564 invoke(addr, call, params, payments)
555565 }
556566 else 0
558568
559569 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
560570 then {
561- let $t01185411957 = calcStakingParams(false, amount, fromBase58String(assetIdString))
562- let call = $t01185411957._1
563- let addr = $t01185411957._2
564- let params = $t01185411957._3
565- let payments = $t01185411957._4
571+ let $t01201912122 = calcStakingParams(false, amount, fromBase58String(assetIdString))
572+ let call = $t01201912122._1
573+ let addr = $t01201912122._2
574+ let params = $t01201912122._3
575+ let payments = $t01201912122._4
566576 invoke(addr, call, params, payments)
567577 }
568578 else 0
591601 func checkSuspicious () = {
592602 let contractBalances = _xp()
593603 func checkBalance (acc,assetId) = {
594- let $t01256812593 = acc
595- let suspicious = $t01256812593._1
596- let i = $t01256812593._2
604+ let $t01273312758 = acc
605+ let suspicious = $t01273312758._1
606+ let i = $t01273312758._2
597607 if (suspicious)
598608 then $Tuple2(suspicious, i)
599609 else {
753763 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
754764 else {
755765 func parsePayments (acc,assetId) = {
756- let $t01690116930 = acc
757- let newBalances = $t01690116930._1
758- let i = $t01690116930._2
759- let j = $t01690116930._3
766+ let $t01706617095 = acc
767+ let newBalances = $t01706617095._1
768+ let i = $t01706617095._2
769+ let j = $t01706617095._3
760770 if (if ((paymentsSize > j))
761771 then (getStrAssetId(payments[j].assetId) == assetId)
762772 else false)
764774 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
765775 }
766776
767- let $t01715017236 = {
777+ let $t01731517401 = {
768778 let $l = assetIds
769779 let $s = size($l)
770780 let $acc0 = $Tuple3(nil, 0, 0)
778788
779789 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
780790 }
781- let newBalances = $t01715017236._1
782- let k = $t01715017236._2
783- let parsedPayments = $t01715017236._3
791+ let newBalances = $t01731517401._1
792+ let k = $t01731517401._2
793+ let parsedPayments = $t01731517401._3
784794 if ((paymentsSize > parsedPayments))
785795 then throw("Incorect payments order")
786796 else if (checkDAppThreshold(newBalances))
792802 else {
793803 let feeDiscount = calculateFeeDiscount(msg.caller)
794804 func calcScriptActions (acc,newBalance) = {
795- let $t01763717678 = acc
796- let invBalances = $t01763717678._1
797- let scriptActions = $t01763717678._2
798- let i = $t01763717678._3
805+ let $t01780217843 = acc
806+ let invBalances = $t01780217843._1
807+ let scriptActions = $t01780217843._2
808+ let i = $t01780217843._3
799809 if ((shareSupply > 0))
800810 then {
801811 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
810820 let finalBalance = (newBalance - fees)
811821 let invariantBalance = (newBalance - fees)
812822 let pmt = (newBalance - xp[i])
823+ let lpFees = (fees - governanceFees)
813824 let inv = if ((pmt > 0))
814825 then stake((pmt - fees), assetIds[i])
815826 else unstake(fees, assetIds[i])
816827 if ((inv == inv))
817- then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
828+ then {
829+ let airdrop = if ((lpFees > 0))
830+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
831+ else 0
832+ if ((airdrop == airdrop))
833+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
834+ else throw("Strict value is not equal to itself.")
835+ }
818836 else throw("Strict value is not equal to itself.")
819837 }
820838 else {
825843 }
826844 }
827845
828- let $t01922619314 = {
846+ let $t01954819636 = {
829847 let $l = newBalances
830848 let $s = size($l)
831849 let $acc0 = $Tuple3(nil, nil, 0)
839857
840858 $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)
841859 }
842- let invBalances = $t01922619314._1
843- let scriptActions = $t01922619314._2
860+ let invBalances = $t01954819636._1
861+ let scriptActions = $t01954819636._2
844862 let D2 = getDMem(invBalances, amp)
845863 let mint_amount = if ((shareSupply == 0))
846864 then D1
865883 }
866884 }
867885 })
886+
887+
888+
889+@Callable(msg)
890+func calcMintAmount (newBalances,user) = {
891+ let amp = _A()
892+ let xp = _xp()
893+ let D1 = getDMem(newBalances, amp)
894+ if ((shareSupply == 0))
895+ then $Tuple2(nil, D1)
896+ else {
897+ let D0 = getDMem(xp, amp)
898+ let feeDiscount = calculateFeeDiscount(user)
899+ func calcInvBalances (acc,newBalance) = {
900+ let $t02082520851 = acc
901+ let invBalances = $t02082520851._1
902+ let i = $t02082520851._2
903+ let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
904+ let fees = {
905+ let idealBalance = fraction(D1, xp[i], D0)
906+ let difference = if ((idealBalance > newBalance))
907+ then (idealBalance - newBalance)
908+ else (newBalance - idealBalance)
909+ fraction(_fee, difference, feeScale6)
910+ }
911+ let invariantBalance = (newBalance - fees)
912+ $Tuple2((invBalances :+ invariantBalance), (i + 1))
913+ }
914+
915+ let $t02145321523 = {
916+ let $l = newBalances
917+ let $s = size($l)
918+ let $acc0 = $Tuple2(nil, 0)
919+ func $f0_1 ($a,$i) = if (($i >= $s))
920+ then $a
921+ else calcInvBalances($a, $l[$i])
922+
923+ func $f0_2 ($a,$i) = if (($i >= $s))
924+ then $a
925+ else throw("List size exceeds 15")
926+
927+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
928+ }
929+ let invBalances = $t02145321523._1
930+ let k = $t02145321523._2
931+ let D2 = getDMem(invBalances, amp)
932+ let mintAmount = fraction(shareSupply, (D2 - D0), D0)
933+ $Tuple2(nil, mintAmount)
934+ }
935+ }
868936
869937
870938
914982 then throw("Exchange resulted in fewer coins than expected")
915983 else {
916984 func makeNewBalances (acc,tokenBalance) = {
917- let $t02202622052 = acc
918- let newBalances = $t02202622052._1
919- let i = $t02202622052._2
985+ let $t02355823584 = acc
986+ let newBalances = $t02355823584._1
987+ let i = $t02355823584._2
920988 if ((i == fromIndex))
921989 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
922990 else if ((i == toIndex))
924992 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
925993 }
926994
927- let $t02230322364 = {
995+ let $t02383523896 = {
928996 let $l = xp
929997 let $s = size($l)
930998 let $acc0 = $Tuple2(nil, 0)
9381006
9391007 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
9401008 }
941- let newBalances = $t02230322364._1
942- let i = $t02230322364._2
1009+ let newBalances = $t02383523896._1
1010+ let i = $t02383523896._2
9431011 if (checkDAppThreshold(newBalances))
9441012 then throw()
9451013 else {
9481016 then {
9491017 let us = unstake(_dy, tokenOut)
9501018 if ((us == us))
951- then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], [dy, tokenOutB58])
1019+ then {
1020+ let lpFees = (_fee - governanceFees)
1021+ let airdrop = if ((lpFees > 0))
1022+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1023+ else 0
1024+ if ((airdrop == airdrop))
1025+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
1026+ else throw("Strict value is not equal to itself.")
1027+ }
9521028 else throw("Strict value is not equal to itself.")
9531029 }
9541030 else throw("Strict value is not equal to itself.")
9731049 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
9741050 else {
9751051 func calcScriptActions (acc,balance) = {
976- let $t02350523533 = acc
977- let scriptActions = $t02350523533._1
978- let i = $t02350523533._2
1052+ let $t02518725215 = acc
1053+ let scriptActions = $t02518725215._1
1054+ let i = $t02518725215._2
9791055 let wAmount = fraction(balance, pmtAmount, shareSupply)
9801056 if (assert((wAmount >= minAmounts[i])))
9811057 then throw("Withdrawal resulted in fewer coins than expected")
9871063 }
9881064 }
9891065
990- let $t02402324091 = {
1066+ let $t02570525773 = {
9911067 let $l = _xp()
9921068 let $s = size($l)
9931069 let $acc0 = $Tuple2(nil, 0)
10011077
10021078 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10031079 }
1004- let scriptActions = $t02402324091._1
1005- let i = $t02402324091._2
1080+ let scriptActions = $t02570525773._1
1081+ let i = $t02570525773._2
10061082 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10071083 }
10081084 }
10651141 then throw("unknown token")
10661142 else {
10671143 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1144+ let tokenOutB58 = fromBase58String(tokenOut)
10681145 let xp = _xp()
1069- let $t02600526087 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1070- let dy = $t02600526087._1
1071- let dy_fee = $t02600526087._2
1146+ let $t02773727819 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147+ let dy = $t02773727819._1
1148+ let dy_fee = $t02773727819._2
10721149 if (assert((dy >= minAmount)))
10731150 then throw("Not enough coins removed")
10741151 else {
10751152 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10761153 let dy_and_fee = (dy + dy_fee)
10771154 func makeNewBalances (acc,tokenBalance) = {
1078- let $t02634526371 = acc
1079- let newBalances = $t02634526371._1
1080- let i = $t02634526371._2
1155+ let $t02807728103 = acc
1156+ let newBalances = $t02807728103._1
1157+ let i = $t02807728103._2
10811158 if ((i == outIndex))
10821159 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10831160 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10841161 }
10851162
1086- let $t02653826599 = {
1163+ let $t02827028331 = {
10871164 let $l = xp
10881165 let $s = size($l)
10891166 let $acc0 = $Tuple2(nil, 0)
10971174
10981175 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10991176 }
1100- let newBalances = $t02653826599._1
1101- let v = $t02653826599._2
1177+ let newBalances = $t02827028331._1
1178+ let v = $t02827028331._2
11021179 if (checkDAppThreshold(newBalances))
11031180 then throw()
11041181 else {
11051182 let us = unstake(dy_and_fee, tokenOut)
11061183 if ((us == us))
1107- then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1184+ then {
1185+ let lpFees = (dy_fee - governanceFees)
1186+ let airdrop = if ((lpFees > 0))
1187+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1188+ else 0
1189+ if ((airdrop == airdrop))
1190+ 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))]
1191+ else throw("Strict value is not equal to itself.")
1192+ }
11081193 else throw("Strict value is not equal to itself.")
11091194 }
11101195 }
11661251 let balances = _xp()
11671252 let D0 = getDMem(balances, amp)
11681253 func calcNewBalances (acc,balance) = {
1169- let $t02852328549 = acc
1170- let newBalances = $t02852328549._1
1171- let i = $t02852328549._2
1254+ let $t03034830374 = acc
1255+ let newBalances = $t03034830374._1
1256+ let i = $t03034830374._2
11721257 let newBalance = (balance + (if (deposit)
11731258 then amounts[i]
11741259 else -(amounts[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 kFirstHarvest = "first_harvest"
4343
4444 let kFirstHarvestHeight = "first_harvest_height"
4545
4646 let kShareLimit = "share_limit_on_first_harvest"
4747
4848 let kBasePeriod = "base_period"
4949
5050 let kPeriodLength = "period_length"
5151
5252 let kStartHeight = "start_height"
5353
5454 let kAdminPubKey1 = "admin_pub_1"
5555
5656 let kAdminPubKey2 = "admin_pub_2"
5757
5858 let kAdminPubKey3 = "admin_pub_3"
5959
6060 let kAdminInvokePubKey = "admin_invoke_pub"
6161
6262 let kMoneyBoxAddress = "money_box_address"
6363
6464 let kGovAddress = "governance_address"
6565
6666 let kVotingAddress = "voting_address"
6767
6868 let kFarmingAddress = "farming_address"
6969
70+let kLPFarmingAddress = "lp_farming"
71+
7072 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7173
7274 func getBase58FromOracle (key) = match getString(oracle, key) {
7375 case string: String =>
7476 fromBase58String(string)
7577 case nothing =>
7678 throw((key + "is empty"))
7779 }
7880
7981
8082 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8183
8284 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8385
8486 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8587
8688 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8789
8890 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8991
9092 let govAddress = Address(getBase58FromOracle(kGovAddress))
9193
9294 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9395
9496 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9597
9698 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9799
98-let capMoneyBoxAddress = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
100+let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
99101
100102 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
101103
102104 let stakingAssets = [toBase58String(USDN)]
103105
104106 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
105107
106108 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
107109
108110 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
109111
110112 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
111113
112114 let active = getBooleanValue(this, kActive)
113115
114116 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
115117
116118 let shareSupply = getIntegerValue(this, kShareAssetSupply)
117119
118120 let feeScale6 = 1000000
119121
120122 let fee = getIntegerValue(this, kFee)
121123
122124 let feeGovernance = fraction(40, feeScale6, 100)
123125
124126 let initial_A = getIntegerValue(this, "initial_A")
125127
126128 let future_A = getIntegerValue(this, "future_A")
127129
128130 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
129131
130132 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
131133
132134 let assetIds = split(getStringValue(this, kAssets), ",")
133135
134136 let nCoins = size(assetIds)
135137
136138 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
137139
138140
139141 func throwIsActive () = throw("DApp is already active")
140142
141143
142144 func isActive () = if (active)
143145 then unit
144146 else throw("DApp is inactive at this moment")
145147
146148
147149 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
148150 then unit
149151 else throw("Only admin can call this function")
150152
151153
152154 func isSelfCall (i) = if ((this == i.caller))
153155 then unit
154156 else throw("Only contract itself can call this function")
155157
156158
157159 let big2 = toBigInt(2)
158160
159161 let blockTimestamp = height
160162
161163 func assert (a) = if (a)
162164 then false
163165 else true
164166
165167
166168 func calculateFeeDiscount (userAddr) = {
167- let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
169+ let user = match userAddr {
170+ case u: Address =>
171+ toString(u)
172+ case u: String =>
173+ u
174+ case _ =>
175+ throw("Unknow type of user Addr")
176+ }
177+ let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
168178 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
169179 let discounts = split(getStringValue(oracle, kDiscounts), ",")
170180 if (if ((swopAmount >= parseIntValue(discountValues[0])))
171181 then (parseIntValue(discountValues[1]) > swopAmount)
172182 else false)
173183 then (feeScale6 - parseIntValue(discounts[0]))
174184 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
175185 then (parseIntValue(discountValues[2]) > swopAmount)
176186 else false)
177187 then (feeScale6 - parseIntValue(discounts[1]))
178188 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
179189 then (parseIntValue(discountValues[3]) > swopAmount)
180190 else false)
181191 then (feeScale6 - parseIntValue(discounts[2]))
182192 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
183193 then (parseIntValue(discountValues[4]) > swopAmount)
184194 else false)
185195 then (feeScale6 - parseIntValue(discounts[3]))
186196 else if ((swopAmount >= parseIntValue(discountValues[4])))
187197 then (feeScale6 - parseIntValue(discounts[4]))
188198 else feeScale6
189199 }
190200
191201
192202 func _A () = {
193203 let t1 = future_A_time
194204 let A1 = future_A
195205 if ((t1 > blockTimestamp))
196206 then {
197207 let A0 = initial_A
198208 let t0 = initial_A_time
199209 if ((A1 > A0))
200210 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
201211 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
202212 }
203213 else A1
204214 }
205215
206216
207217 func _xp () = {
208218 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
209219
210220 let $l = assetIds
211221 let $s = size($l)
212222 let $acc0 = nil
213223 func $f0_1 ($a,$i) = if (($i >= $s))
214224 then $a
215225 else assetBalances($a, $l[$i])
216226
217227 func $f0_2 ($a,$i) = if (($i >= $s))
218228 then $a
219229 else throw("List size exceeds 15")
220230
221231 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
222232 }
223233
224234
225235 func _xp_mem (xp) = xp
226236
227237
228238 func sumList (acc,element) = (acc + element)
229239
230240
231241 func get_D (xp,amp) = {
232242 let @ = invoke(this, "D", [xp, amp], nil)
233243 if ($isInstanceOf(@, "Int"))
234244 then @
235245 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
236246 }
237247
238248
239249 func get_D_internal (xp,amp) = {
240250 let S = {
241251 let $l = xp
242252 let $s = size($l)
243253 let $acc0 = 0
244254 func $f0_1 ($a,$i) = if (($i >= $s))
245255 then $a
246256 else sumList($a, $l[$i])
247257
248258 func $f0_2 ($a,$i) = if (($i >= $s))
249259 then $a
250260 else throw("List size exceeds 15")
251261
252262 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
253263 }
254264 if ((S == 0))
255265 then 0
256266 else {
257267 let Ann = (amp * nCoins)
258268 let AnnS = (toBigInt(Ann) * toBigInt(S))
259269 let Ann1 = toBigInt((Ann - 1))
260270 func Dproc (acc,i) = if ((acc._2 == true))
261271 then acc
262272 else {
263273 let Dprev = acc._1
264274 func D_PProc (D_P,i) = if ((nCoins > i))
265275 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
266276 else D_P
267277
268278 let D_P = {
269279 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
270280 let $s = size($l)
271281 let $acc0 = Dprev
272282 func $f1_1 ($a,$i) = if (($i >= $s))
273283 then $a
274284 else D_PProc($a, $l[$i])
275285
276286 func $f1_2 ($a,$i) = if (($i >= $s))
277287 then $a
278288 else throw("List size exceeds 15")
279289
280290 $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)
281291 }
282292 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
283293 if ((D > Dprev))
284294 then if ((1 >= toInt((D - Dprev))))
285295 then $Tuple2(D, true)
286296 else $Tuple2(D, false)
287297 else if ((1 >= toInt((Dprev - D))))
288298 then $Tuple2(D, true)
289299 else $Tuple2(D, false)
290300 }
291301
292- let $t066756787 = {
302+ let $t068406952 = {
293303 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
294304 let $s = size($l)
295305 let $acc0 = $Tuple2(toBigInt(S), false)
296306 func $f1_1 ($a,$i) = if (($i >= $s))
297307 then $a
298308 else Dproc($a, $l[$i])
299309
300310 func $f1_2 ($a,$i) = if (($i >= $s))
301311 then $a
302312 else throw("List size exceeds 15")
303313
304314 $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)
305315 }
306- let D = $t066756787._1
307- let finished = $t066756787._2
316+ let D = $t068406952._1
317+ let finished = $t068406952._2
308318 if ((finished == false))
309319 then throw(("get_D() not finished with " + toString(D)))
310320 else toInt(D)
311321 }
312322 }
313323
314324
315325 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
316326
317327
318328 func getY (in,out,x,xp_) = if (assert((in != out)))
319329 then throw("same coin")
320330 else if (assert(if ((out >= 0))
321331 then (in >= 0)
322332 else false))
323333 then throw("below zero")
324334 else if (assert(if ((nCoins > out))
325335 then (nCoins > in)
326336 else false))
327337 then throw("above N_COINS")
328338 else {
329339 let amp = _A()
330340 let D = get_D(xp_, amp)
331341 let Ann = (amp * nCoins)
332342 func S_c (acc,i) = {
333- let $t073587375 = acc
334- let S_ = $t073587375._1
335- let c = $t073587375._2
343+ let $t075237540 = acc
344+ let S_ = $t075237540._1
345+ let c = $t075237540._2
336346 let x_ = if ((in == i))
337347 then x
338348 else xp_[i]
339349 if (if ((i != out))
340350 then (nCoins > i)
341351 else false)
342352 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
343353 else $Tuple2(S_, c)
344354 }
345355
346- let $t075837684 = {
356+ let $t077487849 = {
347357 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
348358 let $s = size($l)
349359 let $acc0 = $Tuple2(0, toBigInt(D))
350360 func $f0_1 ($a,$i) = if (($i >= $s))
351361 then $a
352362 else S_c($a, $l[$i])
353363
354364 func $f0_2 ($a,$i) = if (($i >= $s))
355365 then $a
356366 else throw("List size exceeds 15")
357367
358368 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
359369 }
360- let S_ = $t075837684._1
361- let c_ = $t075837684._2
370+ let S_ = $t077487849._1
371+ let c_ = $t077487849._2
362372 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
363373 let bD = toBigInt(((S_ + (D / Ann)) - D))
364374 func y_proc (acc,_i) = if ((acc._2 == true))
365375 then acc
366376 else {
367377 let y_prev = acc._1
368378 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
369379 if ((y > y_prev))
370380 then if ((1 >= toInt((y - y_prev))))
371381 then $Tuple2(y, true)
372382 else $Tuple2(y, false)
373383 else if ((1 >= toInt((y_prev - y))))
374384 then $Tuple2(y, true)
375385 else $Tuple2(y, false)
376386 }
377387
378- let $t081668283 = {
388+ let $t083318448 = {
379389 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
380390 let $s = size($l)
381391 let $acc0 = $Tuple2(toBigInt(D), false)
382392 func $f1_1 ($a,$i) = if (($i >= $s))
383393 then $a
384394 else y_proc($a, $l[$i])
385395
386396 func $f1_2 ($a,$i) = if (($i >= $s))
387397 then $a
388398 else throw("List size exceeds 16")
389399
390400 $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)
391401 }
392- let y = $t081668283._1
393- let finished = $t081668283._2
402+ let y = $t083318448._1
403+ let finished = $t083318448._2
394404 if ((finished == false))
395405 then throw(("getY() not finished with " + toString(y)))
396406 else toInt(y)
397407 }
398408
399409
400410 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
401411 then throw("i below zero")
402412 else if (assert((nCoins > in)))
403413 then throw("i above N_COINS")
404414 else {
405415 let Ann = (A_ * nCoins)
406416 func S_c (acc,i) = {
407- let $t086628679 = acc
408- let S_ = $t086628679._1
409- let c = $t086628679._2
417+ let $t088278844 = acc
418+ let S_ = $t088278844._1
419+ let c = $t088278844._2
410420 let x_ = if (if ((in != i))
411421 then (nCoins > i)
412422 else false)
413423 then xp[i]
414424 else 0
415425 if (if ((nCoins > i))
416426 then (in != i)
417427 else false)
418428 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
419429 else $Tuple2(S_, c)
420430 }
421431
422- let $t088999000 = {
432+ let $t090649165 = {
423433 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
424434 let $s = size($l)
425435 let $acc0 = $Tuple2(0, toBigInt(D))
426436 func $f0_1 ($a,$i) = if (($i >= $s))
427437 then $a
428438 else S_c($a, $l[$i])
429439
430440 func $f0_2 ($a,$i) = if (($i >= $s))
431441 then $a
432442 else throw("List size exceeds 15")
433443
434444 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
435445 }
436- let S_ = $t088999000._1
437- let c_ = $t088999000._2
446+ let S_ = $t090649165._1
447+ let c_ = $t090649165._2
438448 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
439449 let bD = toBigInt(((S_ + (D / Ann)) - D))
440450 func y_D_proc (acc,i) = if ((acc._2 == true))
441451 then acc
442452 else {
443453 let y_prev = acc._1
444454 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
445455 if ((y > y_prev))
446456 then if ((1 >= toInt((y - y_prev))))
447457 then $Tuple2(y, true)
448458 else $Tuple2(y, false)
449459 else if ((1 >= toInt((y_prev - y))))
450460 then $Tuple2(y, true)
451461 else $Tuple2(y, false)
452462 }
453463
454- let $t094839602 = {
464+ let $t096489767 = {
455465 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
456466 let $s = size($l)
457467 let $acc0 = $Tuple2(toBigInt(D), false)
458468 func $f1_1 ($a,$i) = if (($i >= $s))
459469 then $a
460470 else y_D_proc($a, $l[$i])
461471
462472 func $f1_2 ($a,$i) = if (($i >= $s))
463473 then $a
464474 else throw("List size exceeds 16")
465475
466476 $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)
467477 }
468- let y = $t094839602._1
469- let finished = $t094839602._2
478+ let y = $t096489767._1
479+ let finished = $t096489767._2
470480 if ((finished == false))
471481 then throw(("get_y_D() not finished with " + toString(y)))
472482 else toInt(y)
473483 }
474484
475485
476486 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
477487 let feeDiscount = calculateFeeDiscount(caller)
478488 let amp = _A()
479489 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
480490 let total_supply = shareSupply
481491 let D0 = get_D(xp, amp)
482492 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
483493 let new_y = get_y_D(amp, i, xp, D1)
484494 let dy_0 = (xp[i] - new_y)
485495 func xp_reduced_proc (acc,xp_j) = {
486- let $t01024310272 = acc
487- let xp_reduced = $t01024310272._1
488- let index = $t01024310272._2
496+ let $t01040810437 = acc
497+ let xp_reduced = $t01040810437._1
498+ let index = $t01040810437._2
489499 let dx_expected = if ((index == i))
490500 then (fraction(xp_j, D1, D0) - new_y)
491501 else (xp_j - fraction(xp_j, D1, D0))
492502 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
493503 }
494504
495- let $t01053410598 = {
505+ let $t01069910763 = {
496506 let $l = xp
497507 let $s = size($l)
498508 let $acc0 = $Tuple2(nil, 0)
499509 func $f0_1 ($a,$i) = if (($i >= $s))
500510 then $a
501511 else xp_reduced_proc($a, $l[$i])
502512
503513 func $f0_2 ($a,$i) = if (($i >= $s))
504514 then $a
505515 else throw("List size exceeds 15")
506516
507517 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
508518 }
509- let xp_reduced = $t01053410598._1
510- let index = $t01053410598._2
519+ let xp_reduced = $t01069910763._1
520+ let index = $t01069910763._2
511521 let xp_reduced_i = xp_reduced[i]
512522 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
513523 $Tuple2(dy, (dy_0 - dy))
514524 }
515525
516526
517527 func getStrAssetId (assetId) = match assetId {
518528 case id: ByteVector =>
519529 toBase58String(id)
520530 case waves: Unit =>
521531 "WAVES"
522532 case _ =>
523533 throw("Match error")
524534 }
525535
526536
527537 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
528538 then $Tuple2("lockNeutrino", stakingUSDNAddress)
529539 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
530540
531541
532542 func calcStakingParams (stake,amount,assetId) = if (stake)
533543 then {
534- let $t01116211228 = calcStakingFuncAndAddres(stake, assetId)
535- let call = $t01116211228._1
536- let stakingAddr = $t01116211228._2
544+ let $t01132711393 = calcStakingFuncAndAddres(stake, assetId)
545+ let call = $t01132711393._1
546+ let stakingAddr = $t01132711393._2
537547 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
538548 }
539549 else {
540- let $t01131411380 = calcStakingFuncAndAddres(stake, assetId)
541- let call = $t01131411380._1
542- let stakingAddr = $t01131411380._2
550+ let $t01147911545 = calcStakingFuncAndAddres(stake, assetId)
551+ let call = $t01147911545._1
552+ let stakingAddr = $t01147911545._2
543553 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
544554 }
545555
546556
547557 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
548558 then {
549- let $t01156711669 = calcStakingParams(true, amount, fromBase58String(assetIdString))
550- let call = $t01156711669._1
551- let addr = $t01156711669._2
552- let params = $t01156711669._3
553- let payments = $t01156711669._4
559+ let $t01173211834 = calcStakingParams(true, amount, fromBase58String(assetIdString))
560+ let call = $t01173211834._1
561+ let addr = $t01173211834._2
562+ let params = $t01173211834._3
563+ let payments = $t01173211834._4
554564 invoke(addr, call, params, payments)
555565 }
556566 else 0
557567
558568
559569 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
560570 then {
561- let $t01185411957 = calcStakingParams(false, amount, fromBase58String(assetIdString))
562- let call = $t01185411957._1
563- let addr = $t01185411957._2
564- let params = $t01185411957._3
565- let payments = $t01185411957._4
571+ let $t01201912122 = calcStakingParams(false, amount, fromBase58String(assetIdString))
572+ let call = $t01201912122._1
573+ let addr = $t01201912122._2
574+ let params = $t01201912122._3
575+ let payments = $t01201912122._4
566576 invoke(addr, call, params, payments)
567577 }
568578 else 0
569579
570580
571581 func stakedAmount (assetId) = {
572582 let stakedAmountCalculated = match assetId {
573583 case aId: ByteVector =>
574584 if ((aId == USDN))
575585 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
576586 else 0
577587 case _: Unit =>
578588 0
579589 case _ =>
580590 throw("Match error")
581591 }
582592 match stakedAmountCalculated {
583593 case i: Int =>
584594 i
585595 case _ =>
586596 0
587597 }
588598 }
589599
590600
591601 func checkSuspicious () = {
592602 let contractBalances = _xp()
593603 func checkBalance (acc,assetId) = {
594- let $t01256812593 = acc
595- let suspicious = $t01256812593._1
596- let i = $t01256812593._2
604+ let $t01273312758 = acc
605+ let suspicious = $t01273312758._1
606+ let i = $t01273312758._2
597607 if (suspicious)
598608 then $Tuple2(suspicious, i)
599609 else {
600610 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
601611 if ((contractBalances[i] > aBalance))
602612 then $Tuple2(true, i)
603613 else $Tuple2(false, (i + 1))
604614 }
605615 }
606616
607617 let $l = assetIds
608618 let $s = size($l)
609619 let $acc0 = $Tuple2(false, 0)
610620 func $f0_1 ($a,$i) = if (($i >= $s))
611621 then $a
612622 else checkBalance($a, $l[$i])
613623
614624 func $f0_2 ($a,$i) = if (($i >= $s))
615625 then $a
616626 else throw("List size exceeds 15")
617627
618628 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
619629 }
620630
621631
622632 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
623633
624634
625635 func returnPayments (caller,payments) = {
626636 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
627637
628638 let $l = payments
629639 let $s = size($l)
630640 let $acc0 = nil
631641 func $f0_1 ($a,$i) = if (($i >= $s))
632642 then $a
633643 else parsePayments($a, $l[$i])
634644
635645 func $f0_2 ($a,$i) = if (($i >= $s))
636646 then $a
637647 else throw("List size exceeds 15")
638648
639649 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
640650 }
641651
642652
643653 func checkDAppThreshold (newBalances) = {
644654 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
645655 let thresholdScale = 10000
646656 let maxBalance = max(newBalances)
647657 let minBalance = min(newBalances)
648658 let ratio = fraction(maxBalance, thresholdScale, minBalance)
649659 if ((ratio > (dAppThresholdCoef * thresholdScale)))
650660 then throw("New balance in assets of the DApp is less than threshold")
651661 else false
652662 }
653663
654664
655665 func checkCoins (assetIds) = {
656666 let coins = split(assetIds, ",")
657667 func checkCoin (error,assetId) = {
658668 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
659669 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
660670 if ((decimals != DECIMALS))
661671 then throw("wrong decimals")
662672 else false
663673 }
664674
665675 let $l = coins
666676 let $s = size($l)
667677 let $acc0 = false
668678 func $f0_1 ($a,$i) = if (($i >= $s))
669679 then $a
670680 else checkCoin($a, $l[$i])
671681
672682 func $f0_2 ($a,$i) = if (($i >= $s))
673683 then $a
674684 else throw("List size exceeds 15")
675685
676686 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
677687 }
678688
679689
680690 @Callable(msg)
681691 func D (xp,amp) = {
682692 let D = get_D_internal(xp, amp)
683693 $Tuple2([IntegerEntry("D", D)], D)
684694 }
685695
686696
687697
688698 @Callable(msg)
689699 func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
690700 then throw("Already initialized")
691701 else if ((0 >= _A))
692702 then throw("Amp must be must > 0")
693703 else if ((0 >= _dAppThresholdCoef))
694704 then throw("dApp Threshold Coef must be > 0")
695705 else {
696706 let shareName = "s_Multi_USD"
697707 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
698708 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
699709 let tokenId = calculateAssetId(issueToken)
700710 if (checkCoins(assetIds))
701711 then throw()
702712 else {
703713 let baseEntry = [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
704714 if (firstHarvest)
705715 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
706716 else baseEntry
707717 }
708718 }
709719
710720
711721
712722 @Callable(msg)
713723 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
714724 let amp = _A()
715725 let xp = _xp()
716726 let D0 = if ((shareSupply == 0))
717727 then 0
718728 else getDMem(xp, amp)
719729 let payments = msg.payments
720730 let paymentsSize = size(payments)
721731 func validPayments (n) = if ((paymentsSize > nCoins))
722732 then throw(("payments size > " + toString(nCoins)))
723733 else if ((1 > paymentsSize))
724734 then throw("payments size < 1")
725735 else if (if ((shareSupply == 0))
726736 then (nCoins != paymentsSize)
727737 else false)
728738 then throw("initial deposit requires all coins")
729739 else {
730740 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
731741 then true
732742 else throw("Invalid asset in payment")
733743
734744 let $l = payments
735745 let $s = size($l)
736746 let $acc0 = false
737747 func $f0_1 ($a,$i) = if (($i >= $s))
738748 then $a
739749 else paymantValid($a, $l[$i])
740750
741751 func $f0_2 ($a,$i) = if (($i >= $s))
742752 then $a
743753 else throw("List size exceeds 15")
744754
745755 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
746756 }
747757
748758 if (!(validPayments(paymentsSize)))
749759 then throw()
750760 else {
751761 let suspicious = checkSuspicious()
752762 if (suspicious._1)
753763 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
754764 else {
755765 func parsePayments (acc,assetId) = {
756- let $t01690116930 = acc
757- let newBalances = $t01690116930._1
758- let i = $t01690116930._2
759- let j = $t01690116930._3
766+ let $t01706617095 = acc
767+ let newBalances = $t01706617095._1
768+ let i = $t01706617095._2
769+ let j = $t01706617095._3
760770 if (if ((paymentsSize > j))
761771 then (getStrAssetId(payments[j].assetId) == assetId)
762772 else false)
763773 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
764774 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
765775 }
766776
767- let $t01715017236 = {
777+ let $t01731517401 = {
768778 let $l = assetIds
769779 let $s = size($l)
770780 let $acc0 = $Tuple3(nil, 0, 0)
771781 func $f0_1 ($a,$i) = if (($i >= $s))
772782 then $a
773783 else parsePayments($a, $l[$i])
774784
775785 func $f0_2 ($a,$i) = if (($i >= $s))
776786 then $a
777787 else throw("List size exceeds 15")
778788
779789 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
780790 }
781- let newBalances = $t01715017236._1
782- let k = $t01715017236._2
783- let parsedPayments = $t01715017236._3
791+ let newBalances = $t01731517401._1
792+ let k = $t01731517401._2
793+ let parsedPayments = $t01731517401._3
784794 if ((paymentsSize > parsedPayments))
785795 then throw("Incorect payments order")
786796 else if (checkDAppThreshold(newBalances))
787797 then throw()
788798 else {
789799 let D1 = getDMem(newBalances, amp)
790800 if (assert((D1 > D0)))
791801 then throw("D1 > D0")
792802 else {
793803 let feeDiscount = calculateFeeDiscount(msg.caller)
794804 func calcScriptActions (acc,newBalance) = {
795- let $t01763717678 = acc
796- let invBalances = $t01763717678._1
797- let scriptActions = $t01763717678._2
798- let i = $t01763717678._3
805+ let $t01780217843 = acc
806+ let invBalances = $t01780217843._1
807+ let scriptActions = $t01780217843._2
808+ let i = $t01780217843._3
799809 if ((shareSupply > 0))
800810 then {
801811 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
802812 let fees = {
803813 let idealBalance = fraction(D1, xp[i], D0)
804814 let difference = if ((idealBalance > newBalance))
805815 then (idealBalance - newBalance)
806816 else (newBalance - idealBalance)
807817 fraction(_fee, difference, feeScale6)
808818 }
809819 let governanceFees = fraction(fees, feeGovernance, feeScale6)
810820 let finalBalance = (newBalance - fees)
811821 let invariantBalance = (newBalance - fees)
812822 let pmt = (newBalance - xp[i])
823+ let lpFees = (fees - governanceFees)
813824 let inv = if ((pmt > 0))
814825 then stake((pmt - fees), assetIds[i])
815826 else unstake(fees, assetIds[i])
816827 if ((inv == inv))
817- then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
828+ then {
829+ let airdrop = if ((lpFees > 0))
830+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
831+ else 0
832+ if ((airdrop == airdrop))
833+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
834+ else throw("Strict value is not equal to itself.")
835+ }
818836 else throw("Strict value is not equal to itself.")
819837 }
820838 else {
821839 let inv = stake(newBalance, assetIds[i])
822840 if ((inv == inv))
823841 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
824842 else throw("Strict value is not equal to itself.")
825843 }
826844 }
827845
828- let $t01922619314 = {
846+ let $t01954819636 = {
829847 let $l = newBalances
830848 let $s = size($l)
831849 let $acc0 = $Tuple3(nil, nil, 0)
832850 func $f1_1 ($a,$i) = if (($i >= $s))
833851 then $a
834852 else calcScriptActions($a, $l[$i])
835853
836854 func $f1_2 ($a,$i) = if (($i >= $s))
837855 then $a
838856 else throw("List size exceeds 15")
839857
840858 $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)
841859 }
842- let invBalances = $t01922619314._1
843- let scriptActions = $t01922619314._2
860+ let invBalances = $t01954819636._1
861+ let scriptActions = $t01954819636._2
844862 let D2 = getDMem(invBalances, amp)
845863 let mint_amount = if ((shareSupply == 0))
846864 then D1
847865 else fraction(shareSupply, (D2 - D0), D0)
848866 if (assert((mint_amount >= minMintAmount)))
849867 then throw("Slippage screwed you")
850868 else if (stakeFarming)
851869 then {
852870 let re = invoke(this, "reissueShare", [mint_amount], nil)
853871 if ((re == re))
854872 then {
855873 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
856874 if ((s == s))
857875 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
858876 else throw("Strict value is not equal to itself.")
859877 }
860878 else throw("Strict value is not equal to itself.")
861879 }
862880 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
863881 }
864882 }
865883 }
866884 }
867885 })
886+
887+
888+
889+@Callable(msg)
890+func calcMintAmount (newBalances,user) = {
891+ let amp = _A()
892+ let xp = _xp()
893+ let D1 = getDMem(newBalances, amp)
894+ if ((shareSupply == 0))
895+ then $Tuple2(nil, D1)
896+ else {
897+ let D0 = getDMem(xp, amp)
898+ let feeDiscount = calculateFeeDiscount(user)
899+ func calcInvBalances (acc,newBalance) = {
900+ let $t02082520851 = acc
901+ let invBalances = $t02082520851._1
902+ let i = $t02082520851._2
903+ let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
904+ let fees = {
905+ let idealBalance = fraction(D1, xp[i], D0)
906+ let difference = if ((idealBalance > newBalance))
907+ then (idealBalance - newBalance)
908+ else (newBalance - idealBalance)
909+ fraction(_fee, difference, feeScale6)
910+ }
911+ let invariantBalance = (newBalance - fees)
912+ $Tuple2((invBalances :+ invariantBalance), (i + 1))
913+ }
914+
915+ let $t02145321523 = {
916+ let $l = newBalances
917+ let $s = size($l)
918+ let $acc0 = $Tuple2(nil, 0)
919+ func $f0_1 ($a,$i) = if (($i >= $s))
920+ then $a
921+ else calcInvBalances($a, $l[$i])
922+
923+ func $f0_2 ($a,$i) = if (($i >= $s))
924+ then $a
925+ else throw("List size exceeds 15")
926+
927+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
928+ }
929+ let invBalances = $t02145321523._1
930+ let k = $t02145321523._2
931+ let D2 = getDMem(invBalances, amp)
932+ let mintAmount = fraction(shareSupply, (D2 - D0), D0)
933+ $Tuple2(nil, mintAmount)
934+ }
935+ }
868936
869937
870938
871939 @Callable(msg)
872940 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
873941
874942
875943
876944 @Callable(msg)
877945 func getDy (assetFrom,assetTo,dx,userAddress) = {
878946 let xp = _xp()
879947 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
880948 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
881949 let x = (xp[fromIndex] + dx)
882950 let y = getY(fromIndex, toIndex, x, xp)
883951 let dy = ((xp[toIndex] - y) - 1)
884952 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
885953 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
886954 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
887955 }
888956
889957
890958
891959 @Callable(msg)
892960 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
893961 then throw("size(payments) != 1")
894962 else {
895963 let suspicious = checkSuspicious()
896964 if (suspicious._1)
897965 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
898966 else {
899967 let payment = msg.payments[0]
900968 let tokenIn = getStrAssetId(payment.assetId)
901969 let tokenOutB58 = fromBase58String(tokenOut)
902970 let dx = payment.amount
903971 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
904972 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
905973 let xp = _xp()
906974 let x = (xp[fromIndex] + dx)
907975 let y = getY(fromIndex, toIndex, x, xp)
908976 let _dy = ((xp[toIndex] - y) - 1)
909977 let feeDiscount = calculateFeeDiscount(msg.caller)
910978 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
911979 let dy = (_dy - _fee)
912980 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
913981 if (assert((dy >= min_dy)))
914982 then throw("Exchange resulted in fewer coins than expected")
915983 else {
916984 func makeNewBalances (acc,tokenBalance) = {
917- let $t02202622052 = acc
918- let newBalances = $t02202622052._1
919- let i = $t02202622052._2
985+ let $t02355823584 = acc
986+ let newBalances = $t02355823584._1
987+ let i = $t02355823584._2
920988 if ((i == fromIndex))
921989 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
922990 else if ((i == toIndex))
923991 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
924992 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
925993 }
926994
927- let $t02230322364 = {
995+ let $t02383523896 = {
928996 let $l = xp
929997 let $s = size($l)
930998 let $acc0 = $Tuple2(nil, 0)
931999 func $f0_1 ($a,$i) = if (($i >= $s))
9321000 then $a
9331001 else makeNewBalances($a, $l[$i])
9341002
9351003 func $f0_2 ($a,$i) = if (($i >= $s))
9361004 then $a
9371005 else throw("List size exceeds 15")
9381006
9391007 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
9401008 }
941- let newBalances = $t02230322364._1
942- let i = $t02230322364._2
1009+ let newBalances = $t02383523896._1
1010+ let i = $t02383523896._2
9431011 if (checkDAppThreshold(newBalances))
9441012 then throw()
9451013 else {
9461014 let s = stake(payment.amount, getStrAssetId(payment.assetId))
9471015 if ((s == s))
9481016 then {
9491017 let us = unstake(_dy, tokenOut)
9501018 if ((us == us))
951- then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], [dy, tokenOutB58])
1019+ then {
1020+ let lpFees = (_fee - governanceFees)
1021+ let airdrop = if ((lpFees > 0))
1022+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1023+ else 0
1024+ if ((airdrop == airdrop))
1025+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
1026+ else throw("Strict value is not equal to itself.")
1027+ }
9521028 else throw("Strict value is not equal to itself.")
9531029 }
9541030 else throw("Strict value is not equal to itself.")
9551031 }
9561032 }
9571033 }
9581034 })
9591035
9601036
9611037
9621038 @Callable(msg)
9631039 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
9641040 then throw("size(payments) != 1")
9651041 else {
9661042 let pmtAmount = msg.payments[0].amount
9671043 let pmtAssetId = msg.payments[0].assetId
9681044 if ((shareAssetId != pmtAssetId))
9691045 then throw("unknown payment token")
9701046 else {
9711047 let suspicious = checkSuspicious()
9721048 if (suspicious._1)
9731049 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
9741050 else {
9751051 func calcScriptActions (acc,balance) = {
976- let $t02350523533 = acc
977- let scriptActions = $t02350523533._1
978- let i = $t02350523533._2
1052+ let $t02518725215 = acc
1053+ let scriptActions = $t02518725215._1
1054+ let i = $t02518725215._2
9791055 let wAmount = fraction(balance, pmtAmount, shareSupply)
9801056 if (assert((wAmount >= minAmounts[i])))
9811057 then throw("Withdrawal resulted in fewer coins than expected")
9821058 else {
9831059 let us = unstake(wAmount, assetIds[i])
9841060 if ((us == us))
9851061 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
9861062 else throw("Strict value is not equal to itself.")
9871063 }
9881064 }
9891065
990- let $t02402324091 = {
1066+ let $t02570525773 = {
9911067 let $l = _xp()
9921068 let $s = size($l)
9931069 let $acc0 = $Tuple2(nil, 0)
9941070 func $f0_1 ($a,$i) = if (($i >= $s))
9951071 then $a
9961072 else calcScriptActions($a, $l[$i])
9971073
9981074 func $f0_2 ($a,$i) = if (($i >= $s))
9991075 then $a
10001076 else throw("List size exceeds 15")
10011077
10021078 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10031079 }
1004- let scriptActions = $t02402324091._1
1005- let i = $t02402324091._2
1080+ let scriptActions = $t02570525773._1
1081+ let i = $t02570525773._2
10061082 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10071083 }
10081084 }
10091085 })
10101086
10111087
10121088
10131089 @Callable(msg)
10141090 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10151091 then throw("Unlock amount must be positive")
10161092 else {
10171093 let suspicious = checkSuspicious()
10181094 if (suspicious._1)
10191095 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10201096 else {
10211097 let pmtAmount = if ((size(msg.payments) > 0))
10221098 then if ((size(msg.payments) != 1))
10231099 then throw("size(payments) != 1")
10241100 else {
10251101 let pmtAssetId = msg.payments[0].assetId
10261102 if ((shareAssetId != pmtAssetId))
10271103 then throw("unknown payment token")
10281104 else msg.payments[0].amount
10291105 }
10301106 else 0
10311107 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
10321108 if ((unlock == unlock))
10331109 then {
10341110 let withdrawAmount = (pmtAmount + unlockAmount)
10351111 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
10361112 if ((inv == inv))
10371113 then nil
10381114 else throw("Strict value is not equal to itself.")
10391115 }
10401116 else throw("Strict value is not equal to itself.")
10411117 }
10421118 })
10431119
10441120
10451121
10461122 @Callable(msg)
10471123 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
10481124 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10491125 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
10501126 }
10511127
10521128
10531129
10541130 @Callable(msg)
10551131 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10561132 then throw("size(payments) != 1")
10571133 else {
10581134 let suspicious = checkSuspicious()
10591135 if (suspicious._1)
10601136 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10611137 else {
10621138 let pmtAmount = msg.payments[0].amount
10631139 let pmtAssetId = msg.payments[0].assetId
10641140 if ((pmtAssetId != shareAssetId))
10651141 then throw("unknown token")
10661142 else {
10671143 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1144+ let tokenOutB58 = fromBase58String(tokenOut)
10681145 let xp = _xp()
1069- let $t02600526087 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1070- let dy = $t02600526087._1
1071- let dy_fee = $t02600526087._2
1146+ let $t02773727819 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1147+ let dy = $t02773727819._1
1148+ let dy_fee = $t02773727819._2
10721149 if (assert((dy >= minAmount)))
10731150 then throw("Not enough coins removed")
10741151 else {
10751152 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10761153 let dy_and_fee = (dy + dy_fee)
10771154 func makeNewBalances (acc,tokenBalance) = {
1078- let $t02634526371 = acc
1079- let newBalances = $t02634526371._1
1080- let i = $t02634526371._2
1155+ let $t02807728103 = acc
1156+ let newBalances = $t02807728103._1
1157+ let i = $t02807728103._2
10811158 if ((i == outIndex))
10821159 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10831160 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10841161 }
10851162
1086- let $t02653826599 = {
1163+ let $t02827028331 = {
10871164 let $l = xp
10881165 let $s = size($l)
10891166 let $acc0 = $Tuple2(nil, 0)
10901167 func $f0_1 ($a,$i) = if (($i >= $s))
10911168 then $a
10921169 else makeNewBalances($a, $l[$i])
10931170
10941171 func $f0_2 ($a,$i) = if (($i >= $s))
10951172 then $a
10961173 else throw("List size exceeds 15")
10971174
10981175 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10991176 }
1100- let newBalances = $t02653826599._1
1101- let v = $t02653826599._2
1177+ let newBalances = $t02827028331._1
1178+ let v = $t02827028331._2
11021179 if (checkDAppThreshold(newBalances))
11031180 then throw()
11041181 else {
11051182 let us = unstake(dy_and_fee, tokenOut)
11061183 if ((us == us))
1107- then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1184+ then {
1185+ let lpFees = (dy_fee - governanceFees)
1186+ let airdrop = if ((lpFees > 0))
1187+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1188+ else 0
1189+ if ((airdrop == airdrop))
1190+ 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))]
1191+ else throw("Strict value is not equal to itself.")
1192+ }
11081193 else throw("Strict value is not equal to itself.")
11091194 }
11101195 }
11111196 }
11121197 }
11131198 })
11141199
11151200
11161201
11171202 @Callable(msg)
11181203 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
11191204 then throw("Unlock amount must be positive")
11201205 else {
11211206 let suspicious = checkSuspicious()
11221207 if (suspicious._1)
11231208 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11241209 else {
11251210 let pmtAmount = if ((size(msg.payments) > 0))
11261211 then if ((size(msg.payments) != 1))
11271212 then throw("size(payments) != 1")
11281213 else {
11291214 let pmtAssetId = msg.payments[0].assetId
11301215 if ((shareAssetId != pmtAssetId))
11311216 then throw("unknown payment token")
11321217 else msg.payments[0].amount
11331218 }
11341219 else 0
11351220 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11361221 if ((unlock == unlock))
11371222 then {
11381223 let withdrawAmount = (pmtAmount + unlockAmount)
11391224 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
11401225 if ((inv == inv))
11411226 then nil
11421227 else throw("Strict value is not equal to itself.")
11431228 }
11441229 else throw("Strict value is not equal to itself.")
11451230 }
11461231 })
11471232
11481233
11491234
11501235 @Callable(msg)
11511236 func A () = $Tuple2(nil, _A())
11521237
11531238
11541239
11551240 @Callable(msg)
11561241 func getVirtualPrice () = {
11571242 let D = get_D(_xp(), _A())
11581243 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
11591244 }
11601245
11611246
11621247
11631248 @Callable(msg)
11641249 func calcTokenAmount (amounts,deposit) = {
11651250 let amp = _A()
11661251 let balances = _xp()
11671252 let D0 = getDMem(balances, amp)
11681253 func calcNewBalances (acc,balance) = {
1169- let $t02852328549 = acc
1170- let newBalances = $t02852328549._1
1171- let i = $t02852328549._2
1254+ let $t03034830374 = acc
1255+ let newBalances = $t03034830374._1
1256+ let i = $t03034830374._2
11721257 let newBalance = (balance + (if (deposit)
11731258 then amounts[i]
11741259 else -(amounts[i])))
11751260 $Tuple2((newBalances :+ newBalance), (i + 1))
11761261 }
11771262
11781263 let newBalances = ( let $l = balances
11791264 let $s = size($l)
11801265 let $acc0 = $Tuple2(nil, 0)
11811266 func $f0_1 ($a,$i) = if (($i >= $s))
11821267 then $a
11831268 else calcNewBalances($a, $l[$i])
11841269
11851270 func $f0_2 ($a,$i) = if (($i >= $s))
11861271 then $a
11871272 else throw("List size exceeds 15")
11881273
11891274 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15))._1
11901275 let D1 = getDMem(newBalances, amp)
11911276 let diff = if (deposit)
11921277 then (D1 - D0)
11931278 else (D0 - D1)
11941279 $Tuple2(nil, fraction(diff, shareSupply, D0))
11951280 }
11961281
11971282
11981283
11991284 @Callable(msg)
12001285 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12011286 then throw("too often")
12021287 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12031288 then throw("insufficient time")
12041289 else {
12051290 let _initial_A = _A()
12061291 if (assert(if ((_futureA > 0))
12071292 then (MAX_A > _futureA)
12081293 else false))
12091294 then throw("out of base range")
12101295 else if (assert(if (if ((_futureA >= _initial_A))
12111296 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12121297 else false)
12131298 then true
12141299 else if ((_initial_A > _futureA))
12151300 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12161301 else false))
12171302 then throw("out of range")
12181303 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12191304 }))
12201305
12211306
12221307
12231308 @Callable(msg)
12241309 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
12251310 let currentA = _A()
12261311 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
12271312 }))
12281313
12291314
12301315
12311316 @Callable(msg)
12321317 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
12331318 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
12341319 else suspend("Paused by admin"))
12351320
12361321
12371322
12381323 @Callable(msg)
12391324 func activate () = valueOrElse(isAdminCall(msg), if (active)
12401325 then throwIsActive()
12411326 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
12421327
12431328
12441329
12451330 @Callable(msg)
12461331 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
12471332
12481333
12491334 @Verifier(tx)
12501335 func verify () = {
12511336 let multiSignedByAdmins = {
12521337 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12531338 then 1
12541339 else 0
12551340 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
12561341 then 1
12571342 else 0
12581343 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
12591344 then 1
12601345 else 0
12611346 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
12621347 }
12631348 match tx {
12641349 case inv: InvokeScriptTransaction =>
12651350 let callTakeIntoAccount = if ((inv.dApp == this))
12661351 then (inv.function == "takeIntoAccountExtraFunds")
12671352 else false
12681353 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12691354 then true
12701355 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
12711356 then true
12721357 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
12731358 then true
12741359 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
12751360 if (if (callTakeIntoAccount)
12761361 then signedByAdmin
12771362 else false)
12781363 then true
12791364 else multiSignedByAdmins
12801365 case _ =>
12811366 multiSignedByAdmins
12821367 }
12831368 }
12841369

github/deemru/w8io/873ac7e 
214.95 ms