tx · J4rZQ13haGytUsNtNpMkzazxrdaJDiXZXRrx2W54PNxB

3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS:  -0.03800000 Waves

2023.03.17 17:11 [2494096] smart account 3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS > SELF 0.00000000 Waves

{ "type": 13, "id": "J4rZQ13haGytUsNtNpMkzazxrdaJDiXZXRrx2W54PNxB", "fee": 3800000, "feeAssetId": null, "timestamp": 1679062353759, "version": 2, "chainId": 84, "sender": "3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS", "senderPublicKey": "C7xgcYqQ8qV8rmvzAjhQWq4cz82F6VJfXMNygvrTXsfW", "proofs": [ "GWfdWBc8rynWfF6D4RuNVTn2AtKdsrLeTqHtXCmJUXc69LgM6eY1u7TJw8aFbFKzNqYj5kYK7JoCtb6fVwEGfQS", "2VoviyinxvdfQ5PiypkL9irPb23V5wxf36Fkfvf11HsR2n1bPR2UCKvP3qEuZeFxUKzZZpdxH7gmZfB7FCnqBmsN" ], "script": "base64:BgJmCAISBAoCEQESBQoDCAEBEgUKAwEEARIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIAYgAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMAC2tEZXByZWNhdGVkAgtkZXByZWNhdGVkXwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQAEWtTaGFyZUFzc2V0U3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkABGtGZWUCCmNvbW1pc3Npb24AEmtEQXBwVGhyZXNob2xkQ29lZgIRZEFwcFRocmVzaG9sZENvZWYADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AA9rVXNlckdTd29wSW5Hb3YCDV9HU3dvcF9hbW91bnQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MAD2tUZWFtQm94QWRkcmVzcwIQdGVhbV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAA50ZWFtQm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tUZWFtQm94QWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAOZmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rRmFybWluZ0FkZHJlc3MAEGxwRmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRFrTFBGYXJtaW5nQWRkcmVzcwAEVVNETgEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEADXN0YWtpbmdBc3NldHMJAMwIAgkA2AQBBQRVU0ROBQNuaWwABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgAOZGVwcmVjYXRlZFBvb2wJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlCQCsAgIFC2tEZXByZWNhdGVkCQClCAEFBHRoaXMHAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACMFCWZlZVNjYWxlNgBkAAdmZWVUZWFtCQBrAwAKBQlmZWVTY2FsZTYAZAAJaW5pdGlhbF9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglpbml0aWFsX0EACGZ1dHVyZV9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAghmdXR1cmVfQQAOaW5pdGlhbF9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIOaW5pdGlhbF9BX3RpbWUAAAANZnV0dXJlX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg1mdXR1cmVfQV90aW1lAAAACGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tBc3NldHMCASwABm5Db2lucwkAkAMBBQhhc3NldElkcwEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENdGhyb3dJc0FjdGl2ZQAJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQhpc0FjdGl2ZQADAwUGYWN0aXZlBQphY3RpdmVHbG9iBwUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBDGlzRGVwcmljYXRlZAADCQEBIQEFDmRlcHJlY2F0ZWRQb29sBQR1bml0CQACAQIxUG9vbCBpcyBkZXByZWNhdGVkLiBPbmx5IHdpdGhkcmF3IGFjdGlvbiBhbGxvd2VkLgELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAgUEdGhpcwgFAWkGY2FsbGVyBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgAEYmlnMgkAtgIBAAIABml0ZXIxMAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkFA25pbAAGaXRlcjE1CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwABml0ZXIxNgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgkAzAgCAA8FA25pbAAOYmxvY2tUaW1lc3RhbXAFBmhlaWdodAEGYXNzZXJ0AQFhAwUBYQcGARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIdXNlckFkZHIEBHVzZXIEByRtYXRjaDAFCHVzZXJBZGRyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAXUFByRtYXRjaDAJAKUIAQUBdQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXUFByRtYXRjaDAFAXUJAAIBAhhVbmtub3cgdHlwZSBvZiB1c2VyIEFkZHIECnN3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQR1c2VyBQ9rVXNlckdTd29wSW5Hb3YAAAQLZ1N3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQR1c2VyBQ9rVXNlckdTd29wSW5Hb3YFCnN3b3BBbW91bnQEDmRpc2NvdW50VmFsdWVzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUPa0Rpc2NvdW50VmFsdWVzAgEsBAlkaXNjb3VudHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQprRGlzY291bnRzAgEsAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAADAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwACAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAECQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAQFCWZlZVNjYWxlNgECX0EABAJ0MQUNZnV0dXJlX0FfdGltZQQCQTEFCGZ1dHVyZV9BAwkAZgIFAnQxBQ5ibG9ja1RpbWVzdGFtcAQCQTAFCWluaXRpYWxfQQQCdDAFDmluaXRpYWxfQV90aW1lAwkAZgIFAkExBQJBMAkAZAIFAkEwCQBpAgkAaAIJAGUCBQJBMQUCQTAJAGUCBQ5ibG9ja1RpbWVzdGFtcAUCdDAJAGUCBQJ0MQUCdDAJAGUCBQJBMAkAaQIJAGgCCQBlAgUCQTAFAkExCQBlAgUOYmxvY2tUaW1lc3RhbXAFAnQwCQBlAgUCdDEFAnQwBQJBMQEDX3hwAAoBDWFzc2V0QmFsYW5jZXMCA2FjYwdhc3NldElkCQDNCAIFA2FjYwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB2Fzc2V0SWQFDWtBc3NldEJhbGFuY2UAAAoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENYXNzZXRCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUk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CgIJAM0IAgUKeHBfcmVkdWNlZAkAZQIFBHhwX2oJAGsDBQRfZmVlBQtkeF9leHBlY3RlZAUJZmVlU2NhbGU2CQBkAgUFaW5kZXgAAQQNJHQwMTA2MjUxMDY4OQoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD3hwX3JlZHVjZWRfcHJvYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQKeHBfcmVkdWNlZAgFDSR0MDEwNjI1MTA2ODkCXzEEBWluZGV4CAUNJHQwMTA2MjUxMDY4OQJfMgQMeHBfcmVkdWNlZF9pCQCRAwIFCnhwX3JlZHVjZWQFAWkEAmR5CQBlAgkAZQIFDHhwX3JlZHVjZWRfaQkBB2dldF95X0QEBQNhbXAFAWkFCnhwX3JlZHVjZWQFAkQxAAEJAJQKAgUCZHkJAGUCBQRkeV8wBQJkeQENZ2V0U3RyQXNzZXRJZAEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgVzdGFrZQdhc3NldElkAwUFc3Rha2UJAJQKAgIMbG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgIOdW5sb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UEDSR0MDExMjUzMTEzMTkJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExMjUzMTEzMTkCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTEyNTMxMTMxOQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQNJHQwMTE0MDUxMTQ3MQkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTE0MDUxMTQ3MQJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMTQwNTExNDcxAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQVzdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTE2NTgxMTc2MAkBEWNhbGNTdGFraW5nUGFyYW1zAwYFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTE2NTgxMTc2MAJfMQQEYWRkcggFDSR0MDExNjU4MTE3NjACXzIEBnBhcmFtcwgFDSR0MDExNjU4MTE3NjACXzMECHBheW1lbnRzCAUNJHQwMTE2NTgxMTc2MAJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABB3Vuc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExOTQ1MTIwNDgJARFjYWxjU3Rha2luZ1BhcmFtcwMHBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExOTQ1MTIwNDgCXzEEBGFkZHIIBQ0kdDAxMTk0NTEyMDQ4Al8yBAZwYXJhbXMIBQ0kdDAxMTk0NTEyMDQ4Al8zBAhwYXltZW50cwgFDSR0MDExOTQ1MTIwNDgCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQxzdGFrZWRBbW91bnQBB2Fzc2V0SWQEFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDYUlkBQckbWF0Y2gwAwkAAAIFA2FJZAUEVVNETgkAmggCBRJzdGFraW5nVVNETkFkZHJlc3MJAKwCAgkArAICCQCsAgICDHJwZF9iYWxhbmNlXwkA2AQBBQNhSWQCAV8JAKUIAQUEdGhpcwAAAwkAAQIFByRtYXRjaDACBFVuaXQAAAkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gwBRZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQAAAQ9jaGVja1N1c3BpY2lvdXMABBBjb250cmFjdEJhbGFuY2VzCQEDX3hwAAoBDGNoZWNrQmFsYW5jZQIDYWNjB2Fzc2V0SWQEDSR0MDEyNjU5MTI2ODQFA2FjYwQKc3VzcGljaW91cwgFDSR0MDEyNjU5MTI2ODQCXzEEAWkIBQ0kdDAxMjY1OTEyNjg0Al8yAwUKc3VzcGljaW91cwkAlAoCBQpzdXNwaWNpb3VzBQFpBAhhQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwkA2QQBBQdhc3NldElkCQEMc3Rha2VkQW1vdW50AQkA2QQBBQdhc3NldElkAwkAZgIJAJEDAgUQY29udHJhY3RCYWxhbmNlcwUBaQUIYUJhbGFuY2UJAJQKAgYFAWkJAJQKAgcJAGQCBQFpAAEKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIHAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGNoZWNrQmFsYW5jZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgERc3VzcGVuZFN1c3BpY2lvdXMBAWkJAQdzdXNwZW5kAQkArAICAh1TdXNwaWNpb3VzIHN0YXRlIHdpdGggYXNzZXQ6IAkAkQMCBQhhc3NldElkcwUBaQEOcmV0dXJuUGF5bWVudHMCBmNhbGxlcghwYXltZW50cwoBDXBhcnNlUGF5bWVudHMCA2FjYwdwYXltZW50CQDNCAIFA2FjYwkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCAUHcGF5bWVudAZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXBhcnNlUGF5bWVudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEmNoZWNrREFwcFRocmVzaG9sZAELbmV3QmFsYW5jZXMEEWRBcHBUaHJlc2hvbGRDb2VmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUSa0RBcHBUaHJlc2hvbGRDb2VmAhhObyBkQXBwVGhyZXNob2xkQ29lZiBrZXkEDnRocmVzaG9sZFNjYWxlAJBOBAptYXhCYWxhbmNlCQCWAwEFC25ld0JhbGFuY2VzBAptaW5CYWxhbmNlCQCXAwEFC25ld0JhbGFuY2VzBAVyYXRpbwkAawMFCm1heEJhbGFuY2UFDnRocmVzaG9sZFNjYWxlBQptaW5CYWxhbmNlAwkAZgIFBXJhdGlvCQBoAgURZEFwcFRocmVzaG9sZENvZWYFDnRocmVzaG9sZFNjYWxlCQACAQI4TmV3IGJhbGFuY2UgaW4gYXNzZXRzIG9mIHRoZSBEQXBwIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQHAQpjaGVja0NvaW5zAQhhc3NldElkcwQFY29pbnMJALUJAgUIYXNzZXRJZHMCASwDCQBmAgkAkAMBBQVjb2lucwAKCQACAQIgVG8gbWFueSBjb2lucywgbWF4IGNvaW5zIHNpemUgMTAKAQljaGVja0NvaW4CBWVycm9yB2Fzc2V0SWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQUHYXNzZXRJZAkArAICAhJmcm9tQmFzZTU4U3RyaW5nOiAFB2Fzc2V0SWQECGRlY2ltYWxzCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFBWFzc2V0CQCsAgICC2Fzc2V0SW5mbzogBQdhc3NldElkCGRlY2ltYWxzAwkBAiE9AgUIZGVjaW1hbHMFCERFQ0lNQUxTCQACAQIOd3JvbmcgZGVjaW1hbHMHCgACJGwFBWNvaW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWNoZWNrQ29pbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEMY2FsY1dpdGhkcmF3AwNtc2cKbWluQW1vdW50cwx1bmxvY2tBbW91bnQECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjB2JhbGFuY2UEDSR0MDE1MTAwMTUxMjgFA2FjYwQNc2NyaXB0QWN0aW9ucwgFDSR0MDE1MTAwMTUxMjgCXzEEAWkIBQ0kdDAxNTEwMDE1MTI4Al8yBAd3QW1vdW50CQBrAwUHYmFsYW5jZQUOd2l0aGRyYXdBbW91bnQFC3NoYXJlU3VwcGx5AwkBBmFzc2VydAEJAGcCBQd3QW1vdW50CQCRAwIFCm1pbkFtb3VudHMFAWkJAAIBAjBXaXRoZHJhd2FsIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQEAnVzCQEHdW5zdGFrZQIFB3dBbW91bnQJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUCdXMFAnVzCQCUCgIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlCQBlAgUHYmFsYW5jZQUHd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUHd0Ftb3VudAkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpBQNuaWwJAGQCBQFpAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDE1NjE3MTU2ODUKAAIkbAkBA194cAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQNc2NyaXB0QWN0aW9ucwgFDSR0MDE1NjE3MTU2ODUCXzEEAWkIBQ0kdDAxNTYxNzE1Njg1Al8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFDndpdGhkcmF3QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQ53aXRoZHJhd0Ftb3VudAUDbmlsARpjYWxjV2l0aGRyYXdPbmVDb2luRW50cmllcwQDbXNnCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAAECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAECG91dEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEAnhwCQEDX3hwAAQNJHQwMTY1NDcxNjYzNAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFDndpdGhkcmF3QW1vdW50BQhvdXRJbmRleAgFA21zZwxvcmlnaW5DYWxsZXIEAmR5CAUNJHQwMTY1NDcxNjYzNAJfMQQGZHlfZmVlCAUNJHQwMTY1NDcxNjYzNAJfMgMJAQZhc3NlcnQBCQBnAgUCZHkFCW1pbkFtb3VudAkAAgECGE5vdCBlbm91Z2ggY29pbnMgcmVtb3ZlZAQOZ292ZXJuYW5jZUZlZXMJAGsDBQZkeV9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgQIdGVhbUZlZXMJAGsDBQZkeV9mZWUFB2ZlZVRlYW0FCWZlZVNjYWxlNgQKZHlfYW5kX2ZlZQkAZAIFAmR5BQZkeV9mZWUKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDE2OTQ4MTY5NzQFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAxNjk0ODE2OTc0Al8xBAFpCAUNJHQwMTY5NDgxNjk3NAJfMgMJAAACBQFpBQhvdXRJbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQpkeV9hbmRfZmVlCQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMTcxNDExNzIwMgoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLbmV3QmFsYW5jZXMIBQ0kdDAxNzE0MTE3MjAyAl8xBAF2CAUNJHQwMTcxNDExNzIwMgJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQCdXMJAQd1bnN0YWtlAgUKZHlfYW5kX2ZlZQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzBAZscEZlZXMJAGUCCQBlAgUGZHlfZmVlBQ5nb3Zlcm5hbmNlRmVlcwUIdGVhbUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOdGVhbUJveEFkZHJlc3MFCHRlYW1GZWVzBQt0b2tlbk91dEI1OAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUOd2l0aGRyYXdBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhQDbXNnAQFEAgJ4cANhbXAEAUQJAQ5nZXRfRF9pbnRlcm5hbAIFAnhwBQNhbXAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIBRAUBRAUDbmlsBQFEA21zZwEEaW5pdAMIYXNzZXRJZHMCX0ESX2RBcHBUaHJlc2hvbGRDb2VmAwkBASEBCQCeCAEFBHRoaXMJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkAwkAZwIAAAUCX0EJAAIBAhRBbXAgbXVzdCBiZSBtdXN0ID4gMAMJAGcCAAAFEl9kQXBwVGhyZXNob2xkQ29lZgkAAgECH2RBcHAgVGhyZXNob2xkIENvZWYgbXVzdCBiZSA+IDAECXNoYXJlTmFtZQILc19NdWx0aV9VU0QEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgJCU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIE11bHRpU3RhYmxlIFVTRCBwb29sIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMECmlzc3VlVG9rZW4JAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uAAAABgYEB3Rva2VuSWQJALgIAQUKaXNzdWVUb2tlbgMJAQpjaGVja0NvaW5zAQUIYXNzZXRJZHMJAQV0aHJvdwAJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgUHa0Fzc2V0cwUIYXNzZXRJZHMJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUEa0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAg1iYXNlX2ZlZV9mbGF0CQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa0RBcHBUaHJlc2hvbGRDb2VmBRJfZEFwcFRocmVzaG9sZENvZWYJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIFCmlzc3VlVG9rZW4FA25pbANtc2cBDGFkZExpcXVpZGl0eQMNbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcIbG9ja1R5cGUJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQxpc0RlcHJpY2F0ZWQABANhbXAJAQJfQQAEAnhwCQEDX3hwAAQCRDADCQAAAgULc2hhcmVTdXBwbHkAAAAACQEHZ2V0RE1lbQIFAnhwBQNhbXAEDSR0MDE5NDQ1MTk2OTkDAwkAZgIFCGxvY2tUeXBlAAAJAAACCAkAkQMCCAUDbXNnCHBheW1lbnRzCQBlAgkAkAMBCAUDbXNnCHBheW1lbnRzAAEHYXNzZXRJZAUEdW5pdAcJAJQKAgkA0QgCCAUDbXNnCHBheW1lbnRzCQBlAgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAMwIAgkAkQMCCAUDbXNnCHBheW1lbnRzCQBlAgkAkAMBCAUDbXNnCHBheW1lbnRzAAEFA25pbAkAlAoCCAUDbXNnCHBheW1lbnRzBQNuaWwECHBheW1lbnRzCAUNJHQwMTk0NDUxOTY5OQJfMQQHbG9ja0ZlZQgFDSR0MDE5NDQ1MTk2OTkCXzIEDHBheW1lbnRzU2l6ZQkAkAMBBQhwYXltZW50cwoBDXZhbGlkUGF5bWVudHMBAW4DCQBmAgUMcGF5bWVudHNTaXplBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUMcGF5bWVudHNTaXplCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUMcGF5bWVudHNTaXplBwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMKAQxwYXltYW50VmFsaWQCA2FjYwdwYXltZW50AwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQGCQACAQIYSW52YWxpZCBhc3NldCBpbiBwYXltZW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBheW1hbnRWYWxpZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAQEhAQkBDXZhbGlkUGF5bWVudHMBBQxwYXltZW50c1NpemUJAQV0aHJvdwAECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyBQhwYXltZW50cwoBDXBhcnNlUGF5bWVudHMCA2FjYwdhc3NldElkBA0kdDAyMDU2OTIwNTk1BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjA1NjkyMDU5NQJfMQQBaQgFDSR0MDIwNTY5MjA1OTUCXzIKAQxwYXJzZVBheW1lbnQCCm5ld0JhbGFuY2UHcGF5bWVudAMJAAACCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAGQCBQpuZXdCYWxhbmNlCAUHcGF5bWVudAZhbW91bnQFCm5ld0JhbGFuY2UECW5ld0JhbGFjZQoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJEDAgUCeHAFAWkKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBhcnNlUGF5bWVudAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQluZXdCYWxhY2UJAGQCBQFpAAEEDSR0MDIwOTQ1MjEwMTIKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDIwOTQ1MjEwMTICXzEEAWsIBQ0kdDAyMDk0NTIxMDEyAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDIxMzMyMjEzNzMFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAyMTMzMjIxMzczAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMjEzMzIyMTM3MwJfMgQBaQgFDSR0MDIxMzMyMjEzNzMCXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYECHRlYW1GZWVzCQBrAwUEZmVlcwUHZmVlVGVhbQUJZmVlU2NhbGU2BAxmaW5hbEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwQDcG10CQBlAgUKbmV3QmFsYW5jZQkAkQMCBQJ4cAUBaQQGbHBGZWVzCQBlAgkAZQIFBGZlZXMFDmdvdmVybmFuY2VGZWVzBQh0ZWFtRmVlcwQDaW52AwkAZgIFA3BtdAAACQEFc3Rha2UCCQBlAgUDcG10BQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnRlYW1Cb3hBZGRyZXNzBQh0ZWFtRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANpbnYJAQVzdGFrZQIFCm5ld0JhbGFuY2UJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAyMzI0NTIzMzMzCgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLaW52QmFsYW5jZXMIBQ0kdDAyMzI0NTIzMzMzAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMjMyNDUyMzMzMwJfMgQCRDIJAQdnZXRETWVtAgULaW52QmFsYW5jZXMFA2FtcAQLbWludF9hbW91bnQDCQAAAgULc2hhcmVTdXBwbHkAAAUCRDEJAGsDBQtzaGFyZVN1cHBseQkAZQIFAkQyBQJEMAUCRDADCQEGYXNzZXJ0AQkAZwIFC21pbnRfYW1vdW50BQ1taW5NaW50QW1vdW50CQACAQIUU2xpcHBhZ2Ugc2NyZXdlZCB5b3UDBQxzdGFrZUZhcm1pbmcEAnJlCQD8BwQFBHRoaXMCDHJlaXNzdWVTaGFyZQkAzAgCBQttaW50X2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUCcmUFAnJlBAFzCQD8BwQFDmZhcm1pbmdBZGRyZXNzAhdsb2NrU2hhcmVUb2tlbnNGcm9tUG9vbAkAzAgCCAgFA21zZwZjYWxsZXIFYnl0ZXMJAMwIAgkApQgBBQR0aGlzCQDMCAIFCGxvY2tUeXBlBQNuaWwJAM4IAgkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAUDbmlsBQdsb2NrRmVlAwkAAAIFAXMFAXMJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgULbWludF9hbW91bnQFDHNoYXJlQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQFA25pbANtc2cBDmNhbGNNaW50QW1vdW50AgtuZXdCYWxhbmNlcwR1c2VyBANhbXAJAQJfQQAEAnhwCQEDX3hwAAQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAMJAAACBQtzaGFyZVN1cHBseQAACQCUCgIFA25pbAUCRDEEAkQwCQEHZ2V0RE1lbQIFAnhwBQNhbXAEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBBQR1c2VyCgEPY2FsY0ludkJhbGFuY2VzAgNhY2MKbmV3QmFsYW5jZQQNJHQwMjQ2MTEyNDYzNwUDYWNjBAtpbnZCYWxhbmNlcwgFDSR0MDI0NjExMjQ2MzcCXzEEAWkIBQ0kdDAyNDYxMTI0NjM3Al8yBARfZmVlCQBpAgkAaAIJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFBm5Db2lucwkAaAIABAkAZQIFBm5Db2lucwABBARmZWVzBAxpZGVhbEJhbGFuY2UJAGsDBQJEMQkAkQMCBQJ4cAUBaQUCRDAECmRpZmZlcmVuY2UDCQBmAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUMaWRlYWxCYWxhbmNlCQBrAwUEX2ZlZQUKZGlmZmVyZW5jZQUJZmVlU2NhbGU2BBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwkAlAoCCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQBkAgUBaQABBA0kdDAyNTIzOTI1MzA5CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY0ludkJhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtpbnZCYWxhbmNlcwgFDSR0MDI1MjM5MjUzMDkCXzEEAWsIBQ0kdDAyNTIzOTI1MzA5Al8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAptaW50QW1vdW50CQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwCQCUCgIFA25pbAUKbWludEFtb3VudANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQxpc0RlcHJpY2F0ZWQACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAAEB3Rva2VuSW4JAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAmR4CAUHcGF5bWVudAZhbW91bnQECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQd0b2tlbkluAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQCeHAJAQNfeHAABAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBANfZHkJAGUCCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUBeQABBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwxvcmlnaW5DYWxsZXIEBF9mZWUJAGsDBQNfZHkJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFCWZlZVNjYWxlNgQCZHkJAGUCBQNfZHkFBF9mZWUEDmdvdmVybmFuY2VGZWVzCQBrAwUEX2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BAh0ZWFtRmVlcwkAawMFBF9mZWUFB2ZlZVRlYW0FCWZlZVNjYWxlNgMJAQZhc3NlcnQBCQBnAgUCZHkFBm1pbl9keQkAAgECLkV4Y2hhbmdlIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDI3NTM3Mjc1NjMFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNzUzNzI3NTYzAl8xBAFpCAUNJHQwMjc1MzcyNzU2MwJfMgMJAAACBQFpBQlmcm9tSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZAIFDHRva2VuQmFsYW5jZQUCZHgJAGQCBQFpAAEDCQAAAgUBaQUHdG9JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQNfZHkJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyNzg0NjI3OTA3CgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDI3ODQ2Mjc5MDcCXzEEAWkIBQ0kdDAyNzg0NjI3OTA3Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAFzCQEFc3Rha2UCCAUHcGF5bWVudAZhbW91bnQJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAMJAAACBQFzBQFzBAJ1cwkBB3Vuc3Rha2UCBQNfZHkFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwQGbHBGZWVzCQBlAgkAZQIFBF9mZWUFDmdvdmVybmFuY2VGZWVzBQh0ZWFtRmVlcwQHYWlyZHJvcAMJAGYCBQZscEZlZXMAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3Rva2VuT3V0QjU4BQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUDX2R5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOdGVhbUJveEFkZHJlc3MFCHRlYW1GZWVzBQt0b2tlbk91dEI1OAUDbmlsCQDMCAIFAmR5CQDMCAIFC3Rva2VuT3V0QjU4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQh3aXRoZHJhdwEKbWluQW1vdW50cwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBDGNhbGNXaXRoZHJhdwMFA21zZwUKbWluQW1vdW50cwAAA21zZwESd2l0aGRyYXdXaXRoVW5sb2NrAgptaW5BbW91bnRzDHVubG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAGcCAAAFDHVubG9ja0Ftb3VudAkAAgECHlVubG9jayBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQQGdW5sb2NrCQD8BwQFDmZhcm1pbmdBZGRyZXNzAht3aXRoZHJhd1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAggIBQNtc2cGY2FsbGVyBWJ5dGVzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAwkAAAIFBnVubG9jawUGdW5sb2NrCQEMY2FsY1dpdGhkcmF3AwUDbXNnBQptaW5BbW91bnRzBQx1bmxvY2tBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnARNjYWxjV2l0aGRyYXdPbmVDb2luAwt0b2tlbkFtb3VudAh0b2tlbk91dAR1c2VyAwkAZwIAAAULdG9rZW5BbW91bnQJAAIBAhdBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgIIdG9rZW5PdXQJbWluQW1vdW50CQELdmFsdWVPckVsc2UCCQEMaXNEZXByaWNhdGVkAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQkBGmNhbGNXaXRoZHJhd09uZUNvaW5FbnRyaWVzBAUDbXNnBQh0b2tlbk91dAUJbWluQW1vdW50AAADbXNnARl3aXRoZHJhd09uZUNvaW5XaXRoVW5sb2NrAwh0b2tlbk91dAltaW5BbW91bnQMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEMaXNEZXByaWNhdGVkAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAGYCAAAFDHVubG9ja0Ftb3VudAkAAgECHlVubG9jayBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQQGdW5sb2NrCQD8BwQFDmZhcm1pbmdBZGRyZXNzAht3aXRoZHJhd1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAggIBQNtc2cGY2FsbGVyBWJ5dGVzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAwkAAAIFBnVubG9jawUGdW5sb2NrCQEaY2FsY1dpdGhkcmF3T25lQ29pbkVudHJpZXMEBQNtc2cFCHRva2VuT3V0BQltaW5BbW91bnQFDHVubG9ja0Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBAUEACQCUCgIFA25pbAkBAl9BAANtc2cBD2dldFZpcnR1YWxQcmljZQAEAUQJAQVnZXRfRAIJAQNfeHAACQECX0EACQCUCgIFA25pbAkAawMFAUQFCVBSRUNJU0lPTgULc2hhcmVTdXBwbHkDbXNnAQ9jYWxjVG9rZW5BbW91bnQCB2Ftb3VudHMHZGVwb3NpdAQDYW1wCQECX0EABAhiYWxhbmNlcwkBA194cAAEAkQwCQEHZ2V0RE1lbQIFCGJhbGFuY2VzBQNhbXAKAQ9jYWxjTmV3QmFsYW5jZXMCA2FjYwdiYWxhbmNlBA0kdDAzMDc3OTMwODA1BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMzA3NzkzMDgwNQJfMQQBaQgFDSR0MDMwNzc5MzA4MDUCXzIECm5ld0JhbGFuY2UJAGQCBQdiYWxhbmNlAwUHZGVwb3NpdAkAkQMCBQdhbW91bnRzBQFpCQEBLQEJAJEDAgUHYW1vdW50cwUBaQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQpuZXdCYWxhbmNlCQBkAgUBaQABBAtuZXdCYWxhbmNlcwgKAAIkbAUIYmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoCXzEEAkQxCQEHZ2V0RE1lbQIFC25ld0JhbGFuY2VzBQNhbXAEBGRpZmYDBQdkZXBvc2l0CQBlAgUCRDEFAkQwCQBlAgUCRDAFAkQxCQCUCgIFA25pbAkAawMFBGRpZmYFC3NoYXJlU3VwcGx5BQJEMANtc2cBBXJhbXBBAghfZnV0dXJlQQtfZnV0dXJlVGltZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwkBBmFzc2VydAEJAGcCBQ5ibG9ja1RpbWVzdGFtcAkAZAIFDmluaXRpYWxfQV90aW1lBQ1NSU5fUkFNUF9USU1FCQACAQIJdG9vIG9mdGVuAwkBBmFzc2VydAEJAGcCBQtfZnV0dXJlVGltZQkAZAIFDmJsb2NrVGltZXN0YW1wBQ1NSU5fUkFNUF9USU1FCQACAQIRaW5zdWZmaWNpZW50IHRpbWUECl9pbml0aWFsX0EJAQJfQQADCQEGYXNzZXJ0AQMJAGYCBQhfZnV0dXJlQQAACQBmAgUFTUFYX0EFCF9mdXR1cmVBBwkAAgECEW91dCBvZiBiYXNlIHJhbmdlAwkBBmFzc2VydAEDAwkAZwIFCF9mdXR1cmVBBQpfaW5pdGlhbF9BCQBnAgkAaAIFCl9pbml0aWFsX0EFDE1BWF9BX0NIQU5HRQUIX2Z1dHVyZUEHBgMJAGYCBQpfaW5pdGlhbF9BBQhfZnV0dXJlQQkAZwIJAGgCBQhfZnV0dXJlQQUMTUFYX0FfQ0hBTkdFBQpfaW5pdGlhbF9BBwkAAgECDG91dCBvZiByYW5nZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQpfaW5pdGlhbF9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUIX2Z1dHVyZUEJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQULX2Z1dHVyZVRpbWUFA25pbANtc2cBCXN0b3BSYW1wQQAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwQIY3VycmVudEEJAQJfQQAJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUIY3VycmVudEEJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAUDbmlsA21zZwEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEBIQEFBmFjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrQ2F1c2UCGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkCQEHc3VzcGVuZAECD1BhdXNlZCBieSBhZG1pbgNtc2cBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwUGYWN0aXZlCQENdGhyb3dJc0FjdGl2ZQAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtEZWxldGVFbnRyeQEFBmtDYXVzZQUDbmlsA21zZwEZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBWNsYWltAwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQDYBAEFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxjbGFpbVJld2FyZHMFA25pbAUDbmlsAAADCQAAAgUFY2xhaW0FBWNsYWltAwkBAiE9AggFA21zZwZjYWxsZXIFD21vbmV5Qm94QWRkcmVzcwkAAgECJk9ubHkgdGhlIHdhbGxldCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uBAhiYWxhbmNlcwkBA194cAAKAQ50YWtlRXh0cmFGdW5kcwIDYWNjB2Fzc2V0SWQEDSR0MDMzMzkwMzM0MDgFA2FjYwQDc3VtCAUNJHQwMzMzOTAzMzQwOAJfMQQBaQgFDSR0MDMzMzkwMzM0MDgCXzIECHRva2VuQjU4CQDZBAEFB2Fzc2V0SWQECHJCYWxhbmNlCQBkAgkA8AcCBQR0aGlzBQh0b2tlbkI1OAkBDHN0YWtlZEFtb3VudAEFCHRva2VuQjU4BAxlbnJvbGxBbW91bnQJAGUCBQhyQmFsYW5jZQkAkQMCBQhiYWxhbmNlcwUBaQMJAGYCAAAFDGVucm9sbEFtb3VudAkBB3N1c3BlbmQBCQCsAgICIEVucm9sbCBhbW91bnQgbmVnYXRpdmUgZm9yIGFzc2V0BQdhc3NldElkBAdhaXJkcm9wAwkAZgIFDGVucm9sbEFtb3VudAAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIdG9rZW5CNTgFDGVucm9sbEFtb3VudAUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlAoCCQBkAgUDc3VtBQxlbnJvbGxBbW91bnQJAGQCBQFpAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAWsKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ50YWtlRXh0cmFGdW5kcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACCAUBawJfMQAACQACAQIQTm8gbW9uZXkgdG8gdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBBNjYWxsVGFrZUludG9BY2NvdW50AwkAAAIIBQNpbnYEZEFwcAUEdGhpcwkAAAIIBQNpbnYIZnVuY3Rpb24CGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMHBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRFhZG1pblB1YktleUludm9rZQMDBRNjYWxsVGFrZUludG9BY2NvdW50BQ1zaWduZWRCeUFkbWluBwYFE211bHRpU2lnbmVkQnlBZG1pbnMFE211bHRpU2lnbmVkQnlBZG1pbnNbNfbU", "height": 2494096, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3q8Z8MyQoighBNDkYYZnsmDvY3jStjuN4cibaLpegA4M Next: none Diff:
OldNewDifferences
5555
5656 let kMoneyBoxAddress = "money_box_address"
5757
58+let kTeamBoxAddress = "team_box_address"
59+
5860 let kGovAddress = "governance_address"
5961
6062 let kVotingAddress = "voting_address"
8284 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8385
8486 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
87+
88+let teamBoxAddress = Address(getBase58FromOracle(kTeamBoxAddress))
8589
8690 let govAddress = Address(getBase58FromOracle(kGovAddress))
8791
111115
112116 let fee = getIntegerValue(this, kFee)
113117
114-let feeGovernance = fraction(40, feeScale6, 100)
118+let feeGovernance = fraction(35, feeScale6, 100)
119+
120+let feeTeam = fraction(10, feeScale6, 100)
115121
116122 let initial_A = getIntegerValue(this, "initial_A")
117123
303309 else $Tuple2(D, false)
304310 }
305311
306- let $t068116877 = {
312+ let $t070047070 = {
307313 let $l = iter15
308314 let $s = size($l)
309315 let $acc0 = $Tuple2(toBigInt(S), false)
317323
318324 $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)
319325 }
320- let D = $t068116877._1
321- let finished = $t068116877._2
326+ let D = $t070047070._1
327+ let finished = $t070047070._2
322328 if ((finished == false))
323329 then throw(("get_D() not finished with " + toString(D)))
324330 else toInt(D)
344350 let D = get_D(xp_, amp)
345351 let Ann = (amp * nCoins)
346352 func S_c (acc,i) = {
347- let $t074487465 = acc
348- let S_ = $t074487465._1
349- let c = $t074487465._2
353+ let $t076417658 = acc
354+ let S_ = $t076417658._1
355+ let c = $t076417658._2
350356 let x_ = if ((in == i))
351357 then x
352358 else xp_[i]
357363 else $Tuple2(S_, c)
358364 }
359365
360- let $t076737728 = {
366+ let $t078667921 = {
361367 let $l = iter10
362368 let $s = size($l)
363369 let $acc0 = $Tuple2(0, toBigInt(D))
371377
372378 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
373379 }
374- let S_ = $t076737728._1
375- let c_ = $t076737728._2
380+ let S_ = $t078667921._1
381+ let c_ = $t078667921._2
376382 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
377383 let bD = toBigInt(((S_ + (D / Ann)) - D))
378384 func y_proc (acc,_i) = if ((acc._2 == true))
389395 else $Tuple2(y, false)
390396 }
391397
392- let $t082108277 = {
398+ let $t084038470 = {
393399 let $l = iter16
394400 let $s = size($l)
395401 let $acc0 = $Tuple2(toBigInt(D), false)
403409
404410 $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)
405411 }
406- let y = $t082108277._1
407- let finished = $t082108277._2
412+ let y = $t084038470._1
413+ let finished = $t084038470._2
408414 if ((finished == false))
409415 then throw(("getY() not finished with " + toString(y)))
410416 else toInt(y)
418424 else {
419425 let Ann = (A_ * nCoins)
420426 func S_c (acc,i) = {
421- let $t086568673 = acc
422- let S_ = $t086568673._1
423- let c = $t086568673._2
427+ let $t088498866 = acc
428+ let S_ = $t088498866._1
429+ let c = $t088498866._2
424430 let x_ = if (if ((in != i))
425431 then (nCoins > i)
426432 else false)
433439 else $Tuple2(S_, c)
434440 }
435441
436- let $t088938948 = {
442+ let $t090869141 = {
437443 let $l = iter10
438444 let $s = size($l)
439445 let $acc0 = $Tuple2(0, toBigInt(D))
447453
448454 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
449455 }
450- let S_ = $t088938948._1
451- let c_ = $t088938948._2
456+ let S_ = $t090869141._1
457+ let c_ = $t090869141._2
452458 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
453459 let bD = toBigInt(((S_ + (D / Ann)) - D))
454460 func y_D_proc (acc,i) = if ((acc._2 == true))
465471 else $Tuple2(y, false)
466472 }
467473
468- let $t094319500 = {
474+ let $t096249693 = {
469475 let $l = iter16
470476 let $s = size($l)
471477 let $acc0 = $Tuple2(toBigInt(D), false)
479485
480486 $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)
481487 }
482- let y = $t094319500._1
483- let finished = $t094319500._2
488+ let y = $t096249693._1
489+ let finished = $t096249693._2
484490 if ((finished == false))
485491 then throw(("get_y_D() not finished with " + toString(y)))
486492 else toInt(y)
497503 let new_y = get_y_D(amp, i, xp, D1)
498504 let dy_0 = (xp[i] - new_y)
499505 func xp_reduced_proc (acc,xp_j) = {
500- let $t01014110170 = acc
501- let xp_reduced = $t01014110170._1
502- let index = $t01014110170._2
506+ let $t01033410363 = acc
507+ let xp_reduced = $t01033410363._1
508+ let index = $t01033410363._2
503509 let dx_expected = if ((index == i))
504510 then (fraction(xp_j, D1, D0) - new_y)
505511 else (xp_j - fraction(xp_j, D1, D0))
506512 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
507513 }
508514
509- let $t01043210496 = {
515+ let $t01062510689 = {
510516 let $l = xp
511517 let $s = size($l)
512518 let $acc0 = $Tuple2(nil, 0)
520526
521527 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
522528 }
523- let xp_reduced = $t01043210496._1
524- let index = $t01043210496._2
529+ let xp_reduced = $t01062510689._1
530+ let index = $t01062510689._2
525531 let xp_reduced_i = xp_reduced[i]
526532 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
527533 $Tuple2(dy, (dy_0 - dy))
545551
546552 func calcStakingParams (stake,amount,assetId) = if (stake)
547553 then {
548- let $t01106011126 = calcStakingFuncAndAddres(stake, assetId)
549- let call = $t01106011126._1
550- let stakingAddr = $t01106011126._2
554+ let $t01125311319 = calcStakingFuncAndAddres(stake, assetId)
555+ let call = $t01125311319._1
556+ let stakingAddr = $t01125311319._2
551557 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
552558 }
553559 else {
554- let $t01121211278 = calcStakingFuncAndAddres(stake, assetId)
555- let call = $t01121211278._1
556- let stakingAddr = $t01121211278._2
560+ let $t01140511471 = calcStakingFuncAndAddres(stake, assetId)
561+ let call = $t01140511471._1
562+ let stakingAddr = $t01140511471._2
557563 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
558564 }
559565
560566
561567 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
562568 then {
563- let $t01146511567 = calcStakingParams(true, amount, fromBase58String(assetIdString))
564- let call = $t01146511567._1
565- let addr = $t01146511567._2
566- let params = $t01146511567._3
567- let payments = $t01146511567._4
569+ let $t01165811760 = calcStakingParams(true, amount, fromBase58String(assetIdString))
570+ let call = $t01165811760._1
571+ let addr = $t01165811760._2
572+ let params = $t01165811760._3
573+ let payments = $t01165811760._4
568574 invoke(addr, call, params, payments)
569575 }
570576 else 0
572578
573579 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
574580 then {
575- let $t01175211855 = calcStakingParams(false, amount, fromBase58String(assetIdString))
576- let call = $t01175211855._1
577- let addr = $t01175211855._2
578- let params = $t01175211855._3
579- let payments = $t01175211855._4
581+ let $t01194512048 = calcStakingParams(false, amount, fromBase58String(assetIdString))
582+ let call = $t01194512048._1
583+ let addr = $t01194512048._2
584+ let params = $t01194512048._3
585+ let payments = $t01194512048._4
580586 invoke(addr, call, params, payments)
581587 }
582588 else 0
605611 func checkSuspicious () = {
606612 let contractBalances = _xp()
607613 func checkBalance (acc,assetId) = {
608- let $t01246612491 = acc
609- let suspicious = $t01246612491._1
610- let i = $t01246612491._2
614+ let $t01265912684 = acc
615+ let suspicious = $t01265912684._1
616+ let i = $t01265912684._2
611617 if (suspicious)
612618 then $Tuple2(suspicious, i)
613619 else {
712718 else 0
713719 let withdrawAmount = (pmtAmount + unlockAmount)
714720 func calcScriptActions (acc,balance) = {
715- let $t01490714935 = acc
716- let scriptActions = $t01490714935._1
717- let i = $t01490714935._2
721+ let $t01510015128 = acc
722+ let scriptActions = $t01510015128._1
723+ let i = $t01510015128._2
718724 let wAmount = fraction(balance, withdrawAmount, shareSupply)
719725 if (assert((wAmount >= minAmounts[i])))
720726 then throw("Withdrawal resulted in fewer coins than expected")
726732 }
727733 }
728734
729- let $t01542415492 = {
735+ let $t01561715685 = {
730736 let $l = _xp()
731737 let $s = size($l)
732738 let $acc0 = $Tuple2(nil, 0)
740746
741747 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
742748 }
743- let scriptActions = $t01542415492._1
744- let i = $t01542415492._2
749+ let scriptActions = $t01561715685._1
750+ let i = $t01561715685._2
745751 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
746752 }
747753 }
764770 let tokenOutB58 = fromBase58String(tokenOut)
765771 let withdrawAmount = (pmtAmount + unlockAmount)
766772 let xp = _xp()
767- let $t01635416441 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
768- let dy = $t01635416441._1
769- let dy_fee = $t01635416441._2
773+ let $t01654716634 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
774+ let dy = $t01654716634._1
775+ let dy_fee = $t01654716634._2
770776 if (assert((dy >= minAmount)))
771777 then throw("Not enough coins removed")
772778 else {
773779 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
780+ let teamFees = fraction(dy_fee, feeTeam, feeScale6)
774781 let dy_and_fee = (dy + dy_fee)
775782 func makeNewBalances (acc,tokenBalance) = {
776- let $t01669916725 = acc
777- let newBalances = $t01669916725._1
778- let i = $t01669916725._2
783+ let $t01694816974 = acc
784+ let newBalances = $t01694816974._1
785+ let i = $t01694816974._2
779786 if ((i == outIndex))
780787 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
781788 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
782789 }
783790
784- let $t01689216953 = {
791+ let $t01714117202 = {
785792 let $l = xp
786793 let $s = size($l)
787794 let $acc0 = $Tuple2(nil, 0)
795802
796803 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
797804 }
798- let newBalances = $t01689216953._1
799- let v = $t01689216953._2
805+ let newBalances = $t01714117202._1
806+ let v = $t01714117202._2
800807 if (checkDAppThreshold(newBalances))
801808 then throw()
802809 else {
803810 let us = unstake(dy_and_fee, tokenOut)
804811 if ((us == us))
805812 then {
806- let lpFees = (dy_fee - governanceFees)
813+ let lpFees = ((dy_fee - governanceFees) - teamFees)
807814 let airdrop = if ((lpFees > 0))
808815 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
809816 else 0
810817 if ((airdrop == airdrop))
811- then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
818+ then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(teamBoxAddress, teamFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
812819 else throw("Strict value is not equal to itself.")
813820 }
814821 else throw("Strict value is not equal to itself.")
852859 let D0 = if ((shareSupply == 0))
853860 then 0
854861 else getDMem(xp, amp)
855- let $t01912219376 = if (if ((lockType > 0))
862+ let $t01944519699 = if (if ((lockType > 0))
856863 then (msg.payments[(size(msg.payments) - 1)].assetId == unit)
857864 else false)
858865 then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
859866 else $Tuple2(msg.payments, nil)
860- let payments = $t01912219376._1
861- let lockFee = $t01912219376._2
867+ let payments = $t01944519699._1
868+ let lockFee = $t01944519699._2
862869 let paymentsSize = size(payments)
863870 func validPayments (n) = if ((paymentsSize > nCoins))
864871 then throw(("payments size > " + toString(nCoins)))
895902 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
896903 else {
897904 func parsePayments (acc,assetId) = {
898- let $t02024620272 = acc
899- let newBalances = $t02024620272._1
900- let i = $t02024620272._2
905+ let $t02056920595 = acc
906+ let newBalances = $t02056920595._1
907+ let i = $t02056920595._2
901908 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
902909 then (newBalance + payment.amount)
903910 else newBalance
919926 $Tuple2((newBalances :+ newBalace), (i + 1))
920927 }
921928
922- let $t02062220689 = {
929+ let $t02094521012 = {
923930 let $l = assetIds
924931 let $s = size($l)
925932 let $acc0 = $Tuple2(nil, 0)
933940
934941 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
935942 }
936- let newBalances = $t02062220689._1
937- let k = $t02062220689._2
943+ let newBalances = $t02094521012._1
944+ let k = $t02094521012._2
938945 if (checkDAppThreshold(newBalances))
939946 then throw()
940947 else {
944951 else {
945952 let feeDiscount = calculateFeeDiscount(msg.caller)
946953 func calcScriptActions (acc,newBalance) = {
947- let $t02100921050 = acc
948- let invBalances = $t02100921050._1
949- let scriptActions = $t02100921050._2
950- let i = $t02100921050._3
954+ let $t02133221373 = acc
955+ let invBalances = $t02133221373._1
956+ let scriptActions = $t02133221373._2
957+ let i = $t02133221373._3
951958 if ((shareSupply > 0))
952959 then {
953960 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
959966 fraction(_fee, difference, feeScale6)
960967 }
961968 let governanceFees = fraction(fees, feeGovernance, feeScale6)
969+ let teamFees = fraction(fees, feeTeam, feeScale6)
962970 let finalBalance = (newBalance - fees)
963971 let invariantBalance = (newBalance - fees)
964972 let pmt = (newBalance - xp[i])
965- let lpFees = (fees - governanceFees)
973+ let lpFees = ((fees - governanceFees) - teamFees)
966974 let inv = if ((pmt > 0))
967975 then stake((pmt - fees), assetIds[i])
968976 else unstake(fees, assetIds[i])
972980 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
973981 else 0
974982 if ((airdrop == airdrop))
975- then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
983+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), ScriptTransfer(teamBoxAddress, teamFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
976984 else throw("Strict value is not equal to itself.")
977985 }
978986 else throw("Strict value is not equal to itself.")
985993 }
986994 }
987995
988- let $t02275522843 = {
996+ let $t02324523333 = {
989997 let $l = newBalances
990998 let $s = size($l)
991999 let $acc0 = $Tuple3(nil, nil, 0)
9991007
10001008 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10011009 }
1002- let invBalances = $t02275522843._1
1003- let scriptActions = $t02275522843._2
1010+ let invBalances = $t02324523333._1
1011+ let scriptActions = $t02324523333._2
10041012 let D2 = getDMem(invBalances, amp)
10051013 let mint_amount = if ((shareSupply == 0))
10061014 then D1
10391047 let D0 = getDMem(xp, amp)
10401048 let feeDiscount = calculateFeeDiscount(user)
10411049 func calcInvBalances (acc,newBalance) = {
1042- let $t02412124147 = acc
1043- let invBalances = $t02412124147._1
1044- let i = $t02412124147._2
1050+ let $t02461124637 = acc
1051+ let invBalances = $t02461124637._1
1052+ let i = $t02461124637._2
10451053 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
10461054 let fees = {
10471055 let idealBalance = fraction(D1, xp[i], D0)
10541062 $Tuple2((invBalances :+ invariantBalance), (i + 1))
10551063 }
10561064
1057- let $t02474924819 = {
1065+ let $t02523925309 = {
10581066 let $l = newBalances
10591067 let $s = size($l)
10601068 let $acc0 = $Tuple2(nil, 0)
10681076
10691077 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10701078 }
1071- let invBalances = $t02474924819._1
1072- let k = $t02474924819._2
1079+ let invBalances = $t02523925309._1
1080+ let k = $t02523925309._2
10731081 let D2 = getDMem(invBalances, amp)
10741082 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
10751083 $Tuple2(nil, mintAmount)
11201128 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
11211129 let dy = (_dy - _fee)
11221130 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
1131+ let teamFees = fraction(_fee, feeTeam, feeScale6)
11231132 if (assert((dy >= min_dy)))
11241133 then throw("Exchange resulted in fewer coins than expected")
11251134 else {
11261135 func makeNewBalances (acc,tokenBalance) = {
1127- let $t02698927015 = acc
1128- let newBalances = $t02698927015._1
1129- let i = $t02698927015._2
1136+ let $t02753727563 = acc
1137+ let newBalances = $t02753727563._1
1138+ let i = $t02753727563._2
11301139 if ((i == fromIndex))
11311140 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
11321141 else if ((i == toIndex))
11341143 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11351144 }
11361145
1137- let $t02729827359 = {
1146+ let $t02784627907 = {
11381147 let $l = xp
11391148 let $s = size($l)
11401149 let $acc0 = $Tuple2(nil, 0)
11481157
11491158 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11501159 }
1151- let newBalances = $t02729827359._1
1152- let i = $t02729827359._2
1160+ let newBalances = $t02784627907._1
1161+ let i = $t02784627907._2
11531162 if (checkDAppThreshold(newBalances))
11541163 then throw()
11551164 else {
11591168 let us = unstake(_dy, tokenOut)
11601169 if ((us == us))
11611170 then {
1162- let lpFees = (_fee - governanceFees)
1171+ let lpFees = ((_fee - governanceFees) - teamFees)
11631172 let airdrop = if ((lpFees > 0))
11641173 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11651174 else 0
11661175 if ((airdrop == airdrop))
1167- then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
1176+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(teamBoxAddress, teamFees, tokenOutB58)], [dy, tokenOutB58])
11681177 else throw("Strict value is not equal to itself.")
11691178 }
11701179 else throw("Strict value is not equal to itself.")
12421251 let balances = _xp()
12431252 let D0 = getDMem(balances, amp)
12441253 func calcNewBalances (acc,balance) = {
1245- let $t03014930175 = acc
1246- let newBalances = $t03014930175._1
1247- let i = $t03014930175._2
1254+ let $t03077930805 = acc
1255+ let newBalances = $t03077930805._1
1256+ let i = $t03077930805._2
12481257 let newBalance = (balance + (if (deposit)
12491258 then amounts[i]
12501259 else -(amounts[i])))
13291338 else {
13301339 let balances = _xp()
13311340 func takeExtraFunds (acc,assetId) = {
1332- let $t03276032778 = acc
1333- let sum = $t03276032778._1
1334- let i = $t03276032778._2
1341+ let $t03339033408 = acc
1342+ let sum = $t03339033408._1
1343+ let i = $t03339033408._2
13351344 let tokenB58 = fromBase58String(assetId)
13361345 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13371346 let enrollAmount = (rBalance - balances[i])
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let version = "3.0.0"
1515
1616 let kVersion = "version"
1717
1818 let kAssets = "asset_ids"
1919
2020 let kAssetBalance = "_balance"
2121
2222 let kActive = "active"
2323
2424 let kActiveGlob = "active_all_contracts"
2525
2626 let kDeprecated = "deprecated_"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kShareAssetId = "share_asset_id"
3131
3232 let kShareAssetSupply = "share_asset_supply"
3333
3434 let kFee = "commission"
3535
3636 let kDAppThresholdCoef = "dAppThresholdCoef"
3737
3838 let kUSDNAddress = "staking_usdnnsbt_address"
3939
4040 let kDiscounts = "discounts"
4141
4242 let kDiscountValues = "discount_values"
4343
4444 let kUserSwopInGov = "_SWOP_amount"
4545
4646 let kUserGSwopInGov = "_GSwop_amount"
4747
4848 let kAdminPubKey1 = "admin_pub_1"
4949
5050 let kAdminPubKey2 = "admin_pub_2"
5151
5252 let kAdminPubKey3 = "admin_pub_3"
5353
5454 let kAdminInvokePubKey = "admin_invoke_pub"
5555
5656 let kMoneyBoxAddress = "money_box_address"
5757
58+let kTeamBoxAddress = "team_box_address"
59+
5860 let kGovAddress = "governance_address"
5961
6062 let kVotingAddress = "voting_address"
6163
6264 let kFarmingAddress = "farming_address"
6365
6466 let kLPFarmingAddress = "lp_farming"
6567
6668 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
6769
6870 func getBase58FromOracle (key) = match getString(oracle, key) {
6971 case string: String =>
7072 fromBase58String(string)
7173 case nothing =>
7274 throw((key + "is empty"))
7375 }
7476
7577
7678 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7779
7880 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7981
8082 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8183
8284 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8385
8486 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
87+
88+let teamBoxAddress = Address(getBase58FromOracle(kTeamBoxAddress))
8589
8690 let govAddress = Address(getBase58FromOracle(kGovAddress))
8791
8892 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8993
9094 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9195
9296 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9397
9498 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9599
96100 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
97101
98102 let stakingAssets = [toBase58String(USDN)]
99103
100104 let active = getBooleanValue(this, kActive)
101105
102106 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
103107
104108 let deprecatedPool = valueOrElse(getBoolean(oracle, (kDeprecated + toString(this))), false)
105109
106110 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
107111
108112 let shareSupply = getIntegerValue(this, kShareAssetSupply)
109113
110114 let feeScale6 = 1000000
111115
112116 let fee = getIntegerValue(this, kFee)
113117
114-let feeGovernance = fraction(40, feeScale6, 100)
118+let feeGovernance = fraction(35, feeScale6, 100)
119+
120+let feeTeam = fraction(10, feeScale6, 100)
115121
116122 let initial_A = getIntegerValue(this, "initial_A")
117123
118124 let future_A = getIntegerValue(this, "future_A")
119125
120126 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
121127
122128 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
123129
124130 let assetIds = split(getStringValue(this, kAssets), ",")
125131
126132 let nCoins = size(assetIds)
127133
128134 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
129135
130136
131137 func throwIsActive () = throw("DApp is already active")
132138
133139
134140 func isActive () = if (if (active)
135141 then activeGlob
136142 else false)
137143 then unit
138144 else throw("DApp is inactive at this moment")
139145
140146
141147 func isDepricated () = if (!(deprecatedPool))
142148 then unit
143149 else throw("Pool is deprecated. Only withdraw action allowed.")
144150
145151
146152 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
147153 then unit
148154 else throw("Only admin can call this function")
149155
150156
151157 func isSelfCall (i) = if ((this == i.caller))
152158 then unit
153159 else throw("Only contract itself can call this function")
154160
155161
156162 let big2 = toBigInt(2)
157163
158164 let iter10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
159165
160166 let iter15 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
161167
162168 let iter16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
163169
164170 let blockTimestamp = height
165171
166172 func assert (a) = if (a)
167173 then false
168174 else true
169175
170176
171177 func calculateFeeDiscount (userAddr) = {
172178 let user = match userAddr {
173179 case u: Address =>
174180 toString(u)
175181 case u: String =>
176182 u
177183 case _ =>
178184 throw("Unknow type of user Addr")
179185 }
180186 let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), 0)
181187 let gSwopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), swopAmount)
182188 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
183189 let discounts = split(getStringValue(oracle, kDiscounts), ",")
184190 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
185191 then (parseIntValue(discountValues[1]) > gSwopAmount)
186192 else false)
187193 then (feeScale6 - parseIntValue(discounts[0]))
188194 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
189195 then (parseIntValue(discountValues[2]) > gSwopAmount)
190196 else false)
191197 then (feeScale6 - parseIntValue(discounts[1]))
192198 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
193199 then (parseIntValue(discountValues[3]) > gSwopAmount)
194200 else false)
195201 then (feeScale6 - parseIntValue(discounts[2]))
196202 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
197203 then (parseIntValue(discountValues[4]) > gSwopAmount)
198204 else false)
199205 then (feeScale6 - parseIntValue(discounts[3]))
200206 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
201207 then (feeScale6 - parseIntValue(discounts[4]))
202208 else feeScale6
203209 }
204210
205211
206212 func _A () = {
207213 let t1 = future_A_time
208214 let A1 = future_A
209215 if ((t1 > blockTimestamp))
210216 then {
211217 let A0 = initial_A
212218 let t0 = initial_A_time
213219 if ((A1 > A0))
214220 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
215221 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
216222 }
217223 else A1
218224 }
219225
220226
221227 func _xp () = {
222228 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
223229
224230 let $l = assetIds
225231 let $s = size($l)
226232 let $acc0 = nil
227233 func $f0_1 ($a,$i) = if (($i >= $s))
228234 then $a
229235 else assetBalances($a, $l[$i])
230236
231237 func $f0_2 ($a,$i) = if (($i >= $s))
232238 then $a
233239 else throw("List size exceeds 10")
234240
235241 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
236242 }
237243
238244
239245 func _xp_mem (xp) = xp
240246
241247
242248 func sumList (acc,element) = (acc + element)
243249
244250
245251 func get_D (xp,amp) = {
246252 let @ = invoke(this, "D", [xp, amp], nil)
247253 if ($isInstanceOf(@, "Int"))
248254 then @
249255 else throw(($getType(@) + " couldn't be cast to Int"))
250256 }
251257
252258
253259 func get_D_internal (xp,amp) = {
254260 let S = {
255261 let $l = xp
256262 let $s = size($l)
257263 let $acc0 = 0
258264 func $f0_1 ($a,$i) = if (($i >= $s))
259265 then $a
260266 else sumList($a, $l[$i])
261267
262268 func $f0_2 ($a,$i) = if (($i >= $s))
263269 then $a
264270 else throw("List size exceeds 10")
265271
266272 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
267273 }
268274 if ((S == 0))
269275 then 0
270276 else {
271277 let Ann = (amp * nCoins)
272278 let AnnS = (toBigInt(Ann) * toBigInt(S))
273279 let Ann1 = toBigInt((Ann - 1))
274280 func Dproc (acc,i) = if ((acc._2 == true))
275281 then acc
276282 else {
277283 let Dprev = acc._1
278284 func D_PProc (D_P,i) = if ((nCoins > i))
279285 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
280286 else D_P
281287
282288 let D_P = {
283289 let $l = iter10
284290 let $s = size($l)
285291 let $acc0 = Dprev
286292 func $f1_1 ($a,$i) = if (($i >= $s))
287293 then $a
288294 else D_PProc($a, $l[$i])
289295
290296 func $f1_2 ($a,$i) = if (($i >= $s))
291297 then $a
292298 else throw("List size exceeds 10")
293299
294300 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
295301 }
296302 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
297303 if ((D > Dprev))
298304 then if ((1 >= toInt((D - Dprev))))
299305 then $Tuple2(D, true)
300306 else $Tuple2(D, false)
301307 else if ((1 >= toInt((Dprev - D))))
302308 then $Tuple2(D, true)
303309 else $Tuple2(D, false)
304310 }
305311
306- let $t068116877 = {
312+ let $t070047070 = {
307313 let $l = iter15
308314 let $s = size($l)
309315 let $acc0 = $Tuple2(toBigInt(S), false)
310316 func $f1_1 ($a,$i) = if (($i >= $s))
311317 then $a
312318 else Dproc($a, $l[$i])
313319
314320 func $f1_2 ($a,$i) = if (($i >= $s))
315321 then $a
316322 else throw("List size exceeds 15")
317323
318324 $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)
319325 }
320- let D = $t068116877._1
321- let finished = $t068116877._2
326+ let D = $t070047070._1
327+ let finished = $t070047070._2
322328 if ((finished == false))
323329 then throw(("get_D() not finished with " + toString(D)))
324330 else toInt(D)
325331 }
326332 }
327333
328334
329335 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
330336
331337
332338 func getY (in,out,x,xp_) = if (assert((in != out)))
333339 then throw("same coin")
334340 else if (assert(if ((out >= 0))
335341 then (in >= 0)
336342 else false))
337343 then throw("below zero")
338344 else if (assert(if ((nCoins > out))
339345 then (nCoins > in)
340346 else false))
341347 then throw("above N_COINS")
342348 else {
343349 let amp = _A()
344350 let D = get_D(xp_, amp)
345351 let Ann = (amp * nCoins)
346352 func S_c (acc,i) = {
347- let $t074487465 = acc
348- let S_ = $t074487465._1
349- let c = $t074487465._2
353+ let $t076417658 = acc
354+ let S_ = $t076417658._1
355+ let c = $t076417658._2
350356 let x_ = if ((in == i))
351357 then x
352358 else xp_[i]
353359 if (if ((i != out))
354360 then (nCoins > i)
355361 else false)
356362 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
357363 else $Tuple2(S_, c)
358364 }
359365
360- let $t076737728 = {
366+ let $t078667921 = {
361367 let $l = iter10
362368 let $s = size($l)
363369 let $acc0 = $Tuple2(0, toBigInt(D))
364370 func $f0_1 ($a,$i) = if (($i >= $s))
365371 then $a
366372 else S_c($a, $l[$i])
367373
368374 func $f0_2 ($a,$i) = if (($i >= $s))
369375 then $a
370376 else throw("List size exceeds 10")
371377
372378 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
373379 }
374- let S_ = $t076737728._1
375- let c_ = $t076737728._2
380+ let S_ = $t078667921._1
381+ let c_ = $t078667921._2
376382 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
377383 let bD = toBigInt(((S_ + (D / Ann)) - D))
378384 func y_proc (acc,_i) = if ((acc._2 == true))
379385 then acc
380386 else {
381387 let y_prev = acc._1
382388 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
383389 if ((y > y_prev))
384390 then if ((1 >= toInt((y - y_prev))))
385391 then $Tuple2(y, true)
386392 else $Tuple2(y, false)
387393 else if ((1 >= toInt((y_prev - y))))
388394 then $Tuple2(y, true)
389395 else $Tuple2(y, false)
390396 }
391397
392- let $t082108277 = {
398+ let $t084038470 = {
393399 let $l = iter16
394400 let $s = size($l)
395401 let $acc0 = $Tuple2(toBigInt(D), false)
396402 func $f1_1 ($a,$i) = if (($i >= $s))
397403 then $a
398404 else y_proc($a, $l[$i])
399405
400406 func $f1_2 ($a,$i) = if (($i >= $s))
401407 then $a
402408 else throw("List size exceeds 16")
403409
404410 $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)
405411 }
406- let y = $t082108277._1
407- let finished = $t082108277._2
412+ let y = $t084038470._1
413+ let finished = $t084038470._2
408414 if ((finished == false))
409415 then throw(("getY() not finished with " + toString(y)))
410416 else toInt(y)
411417 }
412418
413419
414420 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
415421 then throw("i below zero")
416422 else if (assert((nCoins > in)))
417423 then throw("i above N_COINS")
418424 else {
419425 let Ann = (A_ * nCoins)
420426 func S_c (acc,i) = {
421- let $t086568673 = acc
422- let S_ = $t086568673._1
423- let c = $t086568673._2
427+ let $t088498866 = acc
428+ let S_ = $t088498866._1
429+ let c = $t088498866._2
424430 let x_ = if (if ((in != i))
425431 then (nCoins > i)
426432 else false)
427433 then xp[i]
428434 else 0
429435 if (if ((nCoins > i))
430436 then (in != i)
431437 else false)
432438 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
433439 else $Tuple2(S_, c)
434440 }
435441
436- let $t088938948 = {
442+ let $t090869141 = {
437443 let $l = iter10
438444 let $s = size($l)
439445 let $acc0 = $Tuple2(0, toBigInt(D))
440446 func $f0_1 ($a,$i) = if (($i >= $s))
441447 then $a
442448 else S_c($a, $l[$i])
443449
444450 func $f0_2 ($a,$i) = if (($i >= $s))
445451 then $a
446452 else throw("List size exceeds 10")
447453
448454 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
449455 }
450- let S_ = $t088938948._1
451- let c_ = $t088938948._2
456+ let S_ = $t090869141._1
457+ let c_ = $t090869141._2
452458 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
453459 let bD = toBigInt(((S_ + (D / Ann)) - D))
454460 func y_D_proc (acc,i) = if ((acc._2 == true))
455461 then acc
456462 else {
457463 let y_prev = acc._1
458464 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
459465 if ((y > y_prev))
460466 then if ((1 >= toInt((y - y_prev))))
461467 then $Tuple2(y, true)
462468 else $Tuple2(y, false)
463469 else if ((1 >= toInt((y_prev - y))))
464470 then $Tuple2(y, true)
465471 else $Tuple2(y, false)
466472 }
467473
468- let $t094319500 = {
474+ let $t096249693 = {
469475 let $l = iter16
470476 let $s = size($l)
471477 let $acc0 = $Tuple2(toBigInt(D), false)
472478 func $f1_1 ($a,$i) = if (($i >= $s))
473479 then $a
474480 else y_D_proc($a, $l[$i])
475481
476482 func $f1_2 ($a,$i) = if (($i >= $s))
477483 then $a
478484 else throw("List size exceeds 16")
479485
480486 $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)
481487 }
482- let y = $t094319500._1
483- let finished = $t094319500._2
488+ let y = $t096249693._1
489+ let finished = $t096249693._2
484490 if ((finished == false))
485491 then throw(("get_y_D() not finished with " + toString(y)))
486492 else toInt(y)
487493 }
488494
489495
490496 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
491497 let feeDiscount = calculateFeeDiscount(caller)
492498 let amp = _A()
493499 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
494500 let total_supply = shareSupply
495501 let D0 = get_D(xp, amp)
496502 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
497503 let new_y = get_y_D(amp, i, xp, D1)
498504 let dy_0 = (xp[i] - new_y)
499505 func xp_reduced_proc (acc,xp_j) = {
500- let $t01014110170 = acc
501- let xp_reduced = $t01014110170._1
502- let index = $t01014110170._2
506+ let $t01033410363 = acc
507+ let xp_reduced = $t01033410363._1
508+ let index = $t01033410363._2
503509 let dx_expected = if ((index == i))
504510 then (fraction(xp_j, D1, D0) - new_y)
505511 else (xp_j - fraction(xp_j, D1, D0))
506512 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
507513 }
508514
509- let $t01043210496 = {
515+ let $t01062510689 = {
510516 let $l = xp
511517 let $s = size($l)
512518 let $acc0 = $Tuple2(nil, 0)
513519 func $f0_1 ($a,$i) = if (($i >= $s))
514520 then $a
515521 else xp_reduced_proc($a, $l[$i])
516522
517523 func $f0_2 ($a,$i) = if (($i >= $s))
518524 then $a
519525 else throw("List size exceeds 10")
520526
521527 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
522528 }
523- let xp_reduced = $t01043210496._1
524- let index = $t01043210496._2
529+ let xp_reduced = $t01062510689._1
530+ let index = $t01062510689._2
525531 let xp_reduced_i = xp_reduced[i]
526532 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
527533 $Tuple2(dy, (dy_0 - dy))
528534 }
529535
530536
531537 func getStrAssetId (assetId) = match assetId {
532538 case id: ByteVector =>
533539 toBase58String(id)
534540 case waves: Unit =>
535541 "WAVES"
536542 case _ =>
537543 throw("Match error")
538544 }
539545
540546
541547 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
542548 then $Tuple2("lockNeutrino", stakingUSDNAddress)
543549 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
544550
545551
546552 func calcStakingParams (stake,amount,assetId) = if (stake)
547553 then {
548- let $t01106011126 = calcStakingFuncAndAddres(stake, assetId)
549- let call = $t01106011126._1
550- let stakingAddr = $t01106011126._2
554+ let $t01125311319 = calcStakingFuncAndAddres(stake, assetId)
555+ let call = $t01125311319._1
556+ let stakingAddr = $t01125311319._2
551557 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
552558 }
553559 else {
554- let $t01121211278 = calcStakingFuncAndAddres(stake, assetId)
555- let call = $t01121211278._1
556- let stakingAddr = $t01121211278._2
560+ let $t01140511471 = calcStakingFuncAndAddres(stake, assetId)
561+ let call = $t01140511471._1
562+ let stakingAddr = $t01140511471._2
557563 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
558564 }
559565
560566
561567 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
562568 then {
563- let $t01146511567 = calcStakingParams(true, amount, fromBase58String(assetIdString))
564- let call = $t01146511567._1
565- let addr = $t01146511567._2
566- let params = $t01146511567._3
567- let payments = $t01146511567._4
569+ let $t01165811760 = calcStakingParams(true, amount, fromBase58String(assetIdString))
570+ let call = $t01165811760._1
571+ let addr = $t01165811760._2
572+ let params = $t01165811760._3
573+ let payments = $t01165811760._4
568574 invoke(addr, call, params, payments)
569575 }
570576 else 0
571577
572578
573579 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
574580 then {
575- let $t01175211855 = calcStakingParams(false, amount, fromBase58String(assetIdString))
576- let call = $t01175211855._1
577- let addr = $t01175211855._2
578- let params = $t01175211855._3
579- let payments = $t01175211855._4
581+ let $t01194512048 = calcStakingParams(false, amount, fromBase58String(assetIdString))
582+ let call = $t01194512048._1
583+ let addr = $t01194512048._2
584+ let params = $t01194512048._3
585+ let payments = $t01194512048._4
580586 invoke(addr, call, params, payments)
581587 }
582588 else 0
583589
584590
585591 func stakedAmount (assetId) = {
586592 let stakedAmountCalculated = match assetId {
587593 case aId: ByteVector =>
588594 if ((aId == USDN))
589595 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
590596 else 0
591597 case _: Unit =>
592598 0
593599 case _ =>
594600 throw("Match error")
595601 }
596602 match stakedAmountCalculated {
597603 case i: Int =>
598604 i
599605 case _ =>
600606 0
601607 }
602608 }
603609
604610
605611 func checkSuspicious () = {
606612 let contractBalances = _xp()
607613 func checkBalance (acc,assetId) = {
608- let $t01246612491 = acc
609- let suspicious = $t01246612491._1
610- let i = $t01246612491._2
614+ let $t01265912684 = acc
615+ let suspicious = $t01265912684._1
616+ let i = $t01265912684._2
611617 if (suspicious)
612618 then $Tuple2(suspicious, i)
613619 else {
614620 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
615621 if ((contractBalances[i] > aBalance))
616622 then $Tuple2(true, i)
617623 else $Tuple2(false, (i + 1))
618624 }
619625 }
620626
621627 let $l = assetIds
622628 let $s = size($l)
623629 let $acc0 = $Tuple2(false, 0)
624630 func $f0_1 ($a,$i) = if (($i >= $s))
625631 then $a
626632 else checkBalance($a, $l[$i])
627633
628634 func $f0_2 ($a,$i) = if (($i >= $s))
629635 then $a
630636 else throw("List size exceeds 10")
631637
632638 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
633639 }
634640
635641
636642 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
637643
638644
639645 func returnPayments (caller,payments) = {
640646 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
641647
642648 let $l = payments
643649 let $s = size($l)
644650 let $acc0 = nil
645651 func $f0_1 ($a,$i) = if (($i >= $s))
646652 then $a
647653 else parsePayments($a, $l[$i])
648654
649655 func $f0_2 ($a,$i) = if (($i >= $s))
650656 then $a
651657 else throw("List size exceeds 10")
652658
653659 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
654660 }
655661
656662
657663 func checkDAppThreshold (newBalances) = {
658664 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
659665 let thresholdScale = 10000
660666 let maxBalance = max(newBalances)
661667 let minBalance = min(newBalances)
662668 let ratio = fraction(maxBalance, thresholdScale, minBalance)
663669 if ((ratio > (dAppThresholdCoef * thresholdScale)))
664670 then throw("New balance in assets of the DApp is less than threshold")
665671 else false
666672 }
667673
668674
669675 func checkCoins (assetIds) = {
670676 let coins = split(assetIds, ",")
671677 if ((size(coins) > 10))
672678 then throw("To many coins, max coins size 10")
673679 else {
674680 func checkCoin (error,assetId) = {
675681 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
676682 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
677683 if ((decimals != DECIMALS))
678684 then throw("wrong decimals")
679685 else false
680686 }
681687
682688 let $l = coins
683689 let $s = size($l)
684690 let $acc0 = false
685691 func $f0_1 ($a,$i) = if (($i >= $s))
686692 then $a
687693 else checkCoin($a, $l[$i])
688694
689695 func $f0_2 ($a,$i) = if (($i >= $s))
690696 then $a
691697 else throw("List size exceeds 10")
692698
693699 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
694700 }
695701 }
696702
697703
698704 func calcWithdraw (msg,minAmounts,unlockAmount) = {
699705 let suspicious = checkSuspicious()
700706 if (suspicious._1)
701707 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
702708 else {
703709 let pmtAmount = if ((size(msg.payments) > 0))
704710 then if ((size(msg.payments) != 1))
705711 then throw("size(payments) != 1")
706712 else {
707713 let pmtAssetId = msg.payments[0].assetId
708714 if ((shareAssetId != pmtAssetId))
709715 then throw("unknown payment token")
710716 else msg.payments[0].amount
711717 }
712718 else 0
713719 let withdrawAmount = (pmtAmount + unlockAmount)
714720 func calcScriptActions (acc,balance) = {
715- let $t01490714935 = acc
716- let scriptActions = $t01490714935._1
717- let i = $t01490714935._2
721+ let $t01510015128 = acc
722+ let scriptActions = $t01510015128._1
723+ let i = $t01510015128._2
718724 let wAmount = fraction(balance, withdrawAmount, shareSupply)
719725 if (assert((wAmount >= minAmounts[i])))
720726 then throw("Withdrawal resulted in fewer coins than expected")
721727 else {
722728 let us = unstake(wAmount, assetIds[i])
723729 if ((us == us))
724730 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
725731 else throw("Strict value is not equal to itself.")
726732 }
727733 }
728734
729- let $t01542415492 = {
735+ let $t01561715685 = {
730736 let $l = _xp()
731737 let $s = size($l)
732738 let $acc0 = $Tuple2(nil, 0)
733739 func $f0_1 ($a,$i) = if (($i >= $s))
734740 then $a
735741 else calcScriptActions($a, $l[$i])
736742
737743 func $f0_2 ($a,$i) = if (($i >= $s))
738744 then $a
739745 else throw("List size exceeds 10")
740746
741747 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
742748 }
743- let scriptActions = $t01542415492._1
744- let i = $t01542415492._2
749+ let scriptActions = $t01561715685._1
750+ let i = $t01561715685._2
745751 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
746752 }
747753 }
748754
749755
750756 func calcWithdrawOneCoinEntries (msg,tokenOut,minAmount,unlockAmount) = {
751757 let suspicious = checkSuspicious()
752758 if (suspicious._1)
753759 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
754760 else {
755761 let pmtAmount = if ((size(msg.payments) > 0))
756762 then {
757763 let pmtAssetId = msg.payments[0].assetId
758764 if ((shareAssetId != pmtAssetId))
759765 then throw("unknown payment token")
760766 else msg.payments[0].amount
761767 }
762768 else 0
763769 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
764770 let tokenOutB58 = fromBase58String(tokenOut)
765771 let withdrawAmount = (pmtAmount + unlockAmount)
766772 let xp = _xp()
767- let $t01635416441 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
768- let dy = $t01635416441._1
769- let dy_fee = $t01635416441._2
773+ let $t01654716634 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
774+ let dy = $t01654716634._1
775+ let dy_fee = $t01654716634._2
770776 if (assert((dy >= minAmount)))
771777 then throw("Not enough coins removed")
772778 else {
773779 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
780+ let teamFees = fraction(dy_fee, feeTeam, feeScale6)
774781 let dy_and_fee = (dy + dy_fee)
775782 func makeNewBalances (acc,tokenBalance) = {
776- let $t01669916725 = acc
777- let newBalances = $t01669916725._1
778- let i = $t01669916725._2
783+ let $t01694816974 = acc
784+ let newBalances = $t01694816974._1
785+ let i = $t01694816974._2
779786 if ((i == outIndex))
780787 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
781788 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
782789 }
783790
784- let $t01689216953 = {
791+ let $t01714117202 = {
785792 let $l = xp
786793 let $s = size($l)
787794 let $acc0 = $Tuple2(nil, 0)
788795 func $f0_1 ($a,$i) = if (($i >= $s))
789796 then $a
790797 else makeNewBalances($a, $l[$i])
791798
792799 func $f0_2 ($a,$i) = if (($i >= $s))
793800 then $a
794801 else throw("List size exceeds 10")
795802
796803 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
797804 }
798- let newBalances = $t01689216953._1
799- let v = $t01689216953._2
805+ let newBalances = $t01714117202._1
806+ let v = $t01714117202._2
800807 if (checkDAppThreshold(newBalances))
801808 then throw()
802809 else {
803810 let us = unstake(dy_and_fee, tokenOut)
804811 if ((us == us))
805812 then {
806- let lpFees = (dy_fee - governanceFees)
813+ let lpFees = ((dy_fee - governanceFees) - teamFees)
807814 let airdrop = if ((lpFees > 0))
808815 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
809816 else 0
810817 if ((airdrop == airdrop))
811- then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
818+ then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(teamBoxAddress, teamFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
812819 else throw("Strict value is not equal to itself.")
813820 }
814821 else throw("Strict value is not equal to itself.")
815822 }
816823 }
817824 }
818825 }
819826
820827
821828 @Callable(msg)
822829 func D (xp,amp) = {
823830 let D = get_D_internal(xp, amp)
824831 $Tuple2([IntegerEntry("D", D)], D)
825832 }
826833
827834
828835
829836 @Callable(msg)
830837 func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
831838 then throw("Already initialized")
832839 else if ((0 >= _A))
833840 then throw("Amp must be must > 0")
834841 else if ((0 >= _dAppThresholdCoef))
835842 then throw("dApp Threshold Coef must be > 0")
836843 else {
837844 let shareName = "s_Multi_USD"
838845 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
839846 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
840847 let tokenId = calculateAssetId(issueToken)
841848 if (checkCoins(assetIds))
842849 then throw()
843850 else [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
844851 }
845852
846853
847854
848855 @Callable(msg)
849856 func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), valueOrElse(isDepricated(), {
850857 let amp = _A()
851858 let xp = _xp()
852859 let D0 = if ((shareSupply == 0))
853860 then 0
854861 else getDMem(xp, amp)
855- let $t01912219376 = if (if ((lockType > 0))
862+ let $t01944519699 = if (if ((lockType > 0))
856863 then (msg.payments[(size(msg.payments) - 1)].assetId == unit)
857864 else false)
858865 then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
859866 else $Tuple2(msg.payments, nil)
860- let payments = $t01912219376._1
861- let lockFee = $t01912219376._2
867+ let payments = $t01944519699._1
868+ let lockFee = $t01944519699._2
862869 let paymentsSize = size(payments)
863870 func validPayments (n) = if ((paymentsSize > nCoins))
864871 then throw(("payments size > " + toString(nCoins)))
865872 else if ((1 > paymentsSize))
866873 then throw("payments size < 1")
867874 else if (if ((shareSupply == 0))
868875 then (nCoins != paymentsSize)
869876 else false)
870877 then throw("initial deposit requires all coins")
871878 else {
872879 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
873880 then true
874881 else throw("Invalid asset in payment")
875882
876883 let $l = payments
877884 let $s = size($l)
878885 let $acc0 = false
879886 func $f0_1 ($a,$i) = if (($i >= $s))
880887 then $a
881888 else paymantValid($a, $l[$i])
882889
883890 func $f0_2 ($a,$i) = if (($i >= $s))
884891 then $a
885892 else throw("List size exceeds 10")
886893
887894 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
888895 }
889896
890897 if (!(validPayments(paymentsSize)))
891898 then throw()
892899 else {
893900 let suspicious = checkSuspicious()
894901 if (suspicious._1)
895902 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
896903 else {
897904 func parsePayments (acc,assetId) = {
898- let $t02024620272 = acc
899- let newBalances = $t02024620272._1
900- let i = $t02024620272._2
905+ let $t02056920595 = acc
906+ let newBalances = $t02056920595._1
907+ let i = $t02056920595._2
901908 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
902909 then (newBalance + payment.amount)
903910 else newBalance
904911
905912 let newBalace = {
906913 let $l = payments
907914 let $s = size($l)
908915 let $acc0 = xp[i]
909916 func $f0_1 ($a,$i) = if (($i >= $s))
910917 then $a
911918 else parsePayment($a, $l[$i])
912919
913920 func $f0_2 ($a,$i) = if (($i >= $s))
914921 then $a
915922 else throw("List size exceeds 10")
916923
917924 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
918925 }
919926 $Tuple2((newBalances :+ newBalace), (i + 1))
920927 }
921928
922- let $t02062220689 = {
929+ let $t02094521012 = {
923930 let $l = assetIds
924931 let $s = size($l)
925932 let $acc0 = $Tuple2(nil, 0)
926933 func $f0_1 ($a,$i) = if (($i >= $s))
927934 then $a
928935 else parsePayments($a, $l[$i])
929936
930937 func $f0_2 ($a,$i) = if (($i >= $s))
931938 then $a
932939 else throw("List size exceeds 10")
933940
934941 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
935942 }
936- let newBalances = $t02062220689._1
937- let k = $t02062220689._2
943+ let newBalances = $t02094521012._1
944+ let k = $t02094521012._2
938945 if (checkDAppThreshold(newBalances))
939946 then throw()
940947 else {
941948 let D1 = getDMem(newBalances, amp)
942949 if (assert((D1 > D0)))
943950 then throw("D1 > D0")
944951 else {
945952 let feeDiscount = calculateFeeDiscount(msg.caller)
946953 func calcScriptActions (acc,newBalance) = {
947- let $t02100921050 = acc
948- let invBalances = $t02100921050._1
949- let scriptActions = $t02100921050._2
950- let i = $t02100921050._3
954+ let $t02133221373 = acc
955+ let invBalances = $t02133221373._1
956+ let scriptActions = $t02133221373._2
957+ let i = $t02133221373._3
951958 if ((shareSupply > 0))
952959 then {
953960 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
954961 let fees = {
955962 let idealBalance = fraction(D1, xp[i], D0)
956963 let difference = if ((idealBalance > newBalance))
957964 then (idealBalance - newBalance)
958965 else (newBalance - idealBalance)
959966 fraction(_fee, difference, feeScale6)
960967 }
961968 let governanceFees = fraction(fees, feeGovernance, feeScale6)
969+ let teamFees = fraction(fees, feeTeam, feeScale6)
962970 let finalBalance = (newBalance - fees)
963971 let invariantBalance = (newBalance - fees)
964972 let pmt = (newBalance - xp[i])
965- let lpFees = (fees - governanceFees)
973+ let lpFees = ((fees - governanceFees) - teamFees)
966974 let inv = if ((pmt > 0))
967975 then stake((pmt - fees), assetIds[i])
968976 else unstake(fees, assetIds[i])
969977 if ((inv == inv))
970978 then {
971979 let airdrop = if ((lpFees > 0))
972980 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
973981 else 0
974982 if ((airdrop == airdrop))
975- then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
983+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), ScriptTransfer(teamBoxAddress, teamFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
976984 else throw("Strict value is not equal to itself.")
977985 }
978986 else throw("Strict value is not equal to itself.")
979987 }
980988 else {
981989 let inv = stake(newBalance, assetIds[i])
982990 if ((inv == inv))
983991 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
984992 else throw("Strict value is not equal to itself.")
985993 }
986994 }
987995
988- let $t02275522843 = {
996+ let $t02324523333 = {
989997 let $l = newBalances
990998 let $s = size($l)
991999 let $acc0 = $Tuple3(nil, nil, 0)
9921000 func $f1_1 ($a,$i) = if (($i >= $s))
9931001 then $a
9941002 else calcScriptActions($a, $l[$i])
9951003
9961004 func $f1_2 ($a,$i) = if (($i >= $s))
9971005 then $a
9981006 else throw("List size exceeds 10")
9991007
10001008 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10011009 }
1002- let invBalances = $t02275522843._1
1003- let scriptActions = $t02275522843._2
1010+ let invBalances = $t02324523333._1
1011+ let scriptActions = $t02324523333._2
10041012 let D2 = getDMem(invBalances, amp)
10051013 let mint_amount = if ((shareSupply == 0))
10061014 then D1
10071015 else fraction(shareSupply, (D2 - D0), D0)
10081016 if (assert((mint_amount >= minMintAmount)))
10091017 then throw("Slippage screwed you")
10101018 else if (stakeFarming)
10111019 then {
10121020 let re = invoke(this, "reissueShare", [mint_amount], nil)
10131021 if ((re == re))
10141022 then {
10151023 let s = invoke(farmingAddress, "lockShareTokensFromPool", [msg.caller.bytes, toString(this), lockType], ([AttachedPayment(shareAssetId, mint_amount)] ++ lockFee))
10161024 if ((s == s))
10171025 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
10181026 else throw("Strict value is not equal to itself.")
10191027 }
10201028 else throw("Strict value is not equal to itself.")
10211029 }
10221030 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
10231031 }
10241032 }
10251033 }
10261034 }
10271035 }))
10281036
10291037
10301038
10311039 @Callable(msg)
10321040 func calcMintAmount (newBalances,user) = {
10331041 let amp = _A()
10341042 let xp = _xp()
10351043 let D1 = getDMem(newBalances, amp)
10361044 if ((shareSupply == 0))
10371045 then $Tuple2(nil, D1)
10381046 else {
10391047 let D0 = getDMem(xp, amp)
10401048 let feeDiscount = calculateFeeDiscount(user)
10411049 func calcInvBalances (acc,newBalance) = {
1042- let $t02412124147 = acc
1043- let invBalances = $t02412124147._1
1044- let i = $t02412124147._2
1050+ let $t02461124637 = acc
1051+ let invBalances = $t02461124637._1
1052+ let i = $t02461124637._2
10451053 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
10461054 let fees = {
10471055 let idealBalance = fraction(D1, xp[i], D0)
10481056 let difference = if ((idealBalance > newBalance))
10491057 then (idealBalance - newBalance)
10501058 else (newBalance - idealBalance)
10511059 fraction(_fee, difference, feeScale6)
10521060 }
10531061 let invariantBalance = (newBalance - fees)
10541062 $Tuple2((invBalances :+ invariantBalance), (i + 1))
10551063 }
10561064
1057- let $t02474924819 = {
1065+ let $t02523925309 = {
10581066 let $l = newBalances
10591067 let $s = size($l)
10601068 let $acc0 = $Tuple2(nil, 0)
10611069 func $f0_1 ($a,$i) = if (($i >= $s))
10621070 then $a
10631071 else calcInvBalances($a, $l[$i])
10641072
10651073 func $f0_2 ($a,$i) = if (($i >= $s))
10661074 then $a
10671075 else throw("List size exceeds 10")
10681076
10691077 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10701078 }
1071- let invBalances = $t02474924819._1
1072- let k = $t02474924819._2
1079+ let invBalances = $t02523925309._1
1080+ let k = $t02523925309._2
10731081 let D2 = getDMem(invBalances, amp)
10741082 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
10751083 $Tuple2(nil, mintAmount)
10761084 }
10771085 }
10781086
10791087
10801088
10811089 @Callable(msg)
10821090 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
10831091
10841092
10851093
10861094 @Callable(msg)
10871095 func getDy (assetFrom,assetTo,dx,userAddress) = {
10881096 let xp = _xp()
10891097 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
10901098 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
10911099 let x = (xp[fromIndex] + dx)
10921100 let y = getY(fromIndex, toIndex, x, xp)
10931101 let dy = ((xp[toIndex] - y) - 1)
10941102 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
10951103 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
10961104 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
10971105 }
10981106
10991107
11001108
11011109 @Callable(msg)
11021110 func exchange (tokenOut,min_dy) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
11031111 then throw("size(payments) != 1")
11041112 else {
11051113 let suspicious = checkSuspicious()
11061114 if (suspicious._1)
11071115 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11081116 else {
11091117 let payment = msg.payments[0]
11101118 let tokenIn = getStrAssetId(payment.assetId)
11111119 let tokenOutB58 = fromBase58String(tokenOut)
11121120 let dx = payment.amount
11131121 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
11141122 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11151123 let xp = _xp()
11161124 let x = (xp[fromIndex] + dx)
11171125 let y = getY(fromIndex, toIndex, x, xp)
11181126 let _dy = ((xp[toIndex] - y) - 1)
11191127 let feeDiscount = calculateFeeDiscount(msg.originCaller)
11201128 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
11211129 let dy = (_dy - _fee)
11221130 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
1131+ let teamFees = fraction(_fee, feeTeam, feeScale6)
11231132 if (assert((dy >= min_dy)))
11241133 then throw("Exchange resulted in fewer coins than expected")
11251134 else {
11261135 func makeNewBalances (acc,tokenBalance) = {
1127- let $t02698927015 = acc
1128- let newBalances = $t02698927015._1
1129- let i = $t02698927015._2
1136+ let $t02753727563 = acc
1137+ let newBalances = $t02753727563._1
1138+ let i = $t02753727563._2
11301139 if ((i == fromIndex))
11311140 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
11321141 else if ((i == toIndex))
11331142 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
11341143 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11351144 }
11361145
1137- let $t02729827359 = {
1146+ let $t02784627907 = {
11381147 let $l = xp
11391148 let $s = size($l)
11401149 let $acc0 = $Tuple2(nil, 0)
11411150 func $f0_1 ($a,$i) = if (($i >= $s))
11421151 then $a
11431152 else makeNewBalances($a, $l[$i])
11441153
11451154 func $f0_2 ($a,$i) = if (($i >= $s))
11461155 then $a
11471156 else throw("List size exceeds 10")
11481157
11491158 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11501159 }
1151- let newBalances = $t02729827359._1
1152- let i = $t02729827359._2
1160+ let newBalances = $t02784627907._1
1161+ let i = $t02784627907._2
11531162 if (checkDAppThreshold(newBalances))
11541163 then throw()
11551164 else {
11561165 let s = stake(payment.amount, getStrAssetId(payment.assetId))
11571166 if ((s == s))
11581167 then {
11591168 let us = unstake(_dy, tokenOut)
11601169 if ((us == us))
11611170 then {
1162- let lpFees = (_fee - governanceFees)
1171+ let lpFees = ((_fee - governanceFees) - teamFees)
11631172 let airdrop = if ((lpFees > 0))
11641173 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11651174 else 0
11661175 if ((airdrop == airdrop))
1167- then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
1176+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(teamBoxAddress, teamFees, tokenOutB58)], [dy, tokenOutB58])
11681177 else throw("Strict value is not equal to itself.")
11691178 }
11701179 else throw("Strict value is not equal to itself.")
11711180 }
11721181 else throw("Strict value is not equal to itself.")
11731182 }
11741183 }
11751184 }
11761185 }))
11771186
11781187
11791188
11801189 @Callable(msg)
11811190 func withdraw (minAmounts) = valueOrElse(isActive(), calcWithdraw(msg, minAmounts, 0))
11821191
11831192
11841193
11851194 @Callable(msg)
11861195 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
11871196 then throw("Unlock amount must be positive")
11881197 else {
11891198 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
11901199 if ((unlock == unlock))
11911200 then calcWithdraw(msg, minAmounts, unlockAmount)
11921201 else throw("Strict value is not equal to itself.")
11931202 })
11941203
11951204
11961205
11971206 @Callable(msg)
11981207 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = if ((0 >= tokenAmount))
11991208 then throw("Amount must be positive")
12001209 else {
12011210 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
12021211 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
12031212 }
12041213
12051214
12061215
12071216 @Callable(msg)
12081217 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
12091218 then throw("size(payments) != 1")
12101219 else calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, 0)))
12111220
12121221
12131222
12141223 @Callable(msg)
12151224 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((0 > unlockAmount))
12161225 then throw("Unlock amount must be positive")
12171226 else {
12181227 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
12191228 if ((unlock == unlock))
12201229 then calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, unlockAmount)
12211230 else throw("Strict value is not equal to itself.")
12221231 }))
12231232
12241233
12251234
12261235 @Callable(msg)
12271236 func A () = $Tuple2(nil, _A())
12281237
12291238
12301239
12311240 @Callable(msg)
12321241 func getVirtualPrice () = {
12331242 let D = get_D(_xp(), _A())
12341243 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12351244 }
12361245
12371246
12381247
12391248 @Callable(msg)
12401249 func calcTokenAmount (amounts,deposit) = {
12411250 let amp = _A()
12421251 let balances = _xp()
12431252 let D0 = getDMem(balances, amp)
12441253 func calcNewBalances (acc,balance) = {
1245- let $t03014930175 = acc
1246- let newBalances = $t03014930175._1
1247- let i = $t03014930175._2
1254+ let $t03077930805 = acc
1255+ let newBalances = $t03077930805._1
1256+ let i = $t03077930805._2
12481257 let newBalance = (balance + (if (deposit)
12491258 then amounts[i]
12501259 else -(amounts[i])))
12511260 $Tuple2((newBalances :+ newBalance), (i + 1))
12521261 }
12531262
12541263 let newBalances = ( let $l = balances
12551264 let $s = size($l)
12561265 let $acc0 = $Tuple2(nil, 0)
12571266 func $f0_1 ($a,$i) = if (($i >= $s))
12581267 then $a
12591268 else calcNewBalances($a, $l[$i])
12601269
12611270 func $f0_2 ($a,$i) = if (($i >= $s))
12621271 then $a
12631272 else throw("List size exceeds 10")
12641273
12651274 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10))._1
12661275 let D1 = getDMem(newBalances, amp)
12671276 let diff = if (deposit)
12681277 then (D1 - D0)
12691278 else (D0 - D1)
12701279 $Tuple2(nil, fraction(diff, shareSupply, D0))
12711280 }
12721281
12731282
12741283
12751284 @Callable(msg)
12761285 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12771286 then throw("too often")
12781287 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12791288 then throw("insufficient time")
12801289 else {
12811290 let _initial_A = _A()
12821291 if (assert(if ((_futureA > 0))
12831292 then (MAX_A > _futureA)
12841293 else false))
12851294 then throw("out of base range")
12861295 else if (assert(if (if ((_futureA >= _initial_A))
12871296 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12881297 else false)
12891298 then true
12901299 else if ((_initial_A > _futureA))
12911300 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12921301 else false))
12931302 then throw("out of range")
12941303 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12951304 }))
12961305
12971306
12981307
12991308 @Callable(msg)
13001309 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
13011310 let currentA = _A()
13021311 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
13031312 }))
13041313
13051314
13061315
13071316 @Callable(msg)
13081317 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13091318 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13101319 else suspend("Paused by admin"))
13111320
13121321
13131322
13141323 @Callable(msg)
13151324 func activate () = valueOrElse(isAdminCall(msg), if (active)
13161325 then throwIsActive()
13171326 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13181327
13191328
13201329
13211330 @Callable(msg)
13221331 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
13231332 let claim = if (containsElement(assetIds, toBase58String(USDN)))
13241333 then invoke(stakingUSDNAddress, "claimRewards", nil, nil)
13251334 else 0
13261335 if ((claim == claim))
13271336 then if ((msg.caller != moneyBoxAddress))
13281337 then throw("Only the wallet can call this function")
13291338 else {
13301339 let balances = _xp()
13311340 func takeExtraFunds (acc,assetId) = {
1332- let $t03276032778 = acc
1333- let sum = $t03276032778._1
1334- let i = $t03276032778._2
1341+ let $t03339033408 = acc
1342+ let sum = $t03339033408._1
1343+ let i = $t03339033408._2
13351344 let tokenB58 = fromBase58String(assetId)
13361345 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13371346 let enrollAmount = (rBalance - balances[i])
13381347 if ((0 > enrollAmount))
13391348 then suspend(("Enroll amount negative for asset" + assetId))
13401349 else {
13411350 let airdrop = if ((enrollAmount > 0))
13421351 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
13431352 else 0
13441353 if ((airdrop == airdrop))
13451354 then $Tuple2((sum + enrollAmount), (i + 1))
13461355 else throw("Strict value is not equal to itself.")
13471356 }
13481357 }
13491358
13501359 let k = {
13511360 let $l = assetIds
13521361 let $s = size($l)
13531362 let $acc0 = $Tuple2(0, 0)
13541363 func $f0_1 ($a,$i) = if (($i >= $s))
13551364 then $a
13561365 else takeExtraFunds($a, $l[$i])
13571366
13581367 func $f0_2 ($a,$i) = if (($i >= $s))
13591368 then $a
13601369 else throw("List size exceeds 10")
13611370
13621371 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
13631372 }
13641373 if ((k._1 == 0))
13651374 then throw("No money to take")
13661375 else nil
13671376 }
13681377 else throw("Strict value is not equal to itself.")
13691378 })
13701379
13711380
13721381 @Verifier(tx)
13731382 func verify () = {
13741383 let multiSignedByAdmins = {
13751384 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13761385 then 1
13771386 else 0
13781387 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13791388 then 1
13801389 else 0
13811390 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13821391 then 1
13831392 else 0
13841393 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13851394 }
13861395 match tx {
13871396 case inv: InvokeScriptTransaction =>
13881397 let callTakeIntoAccount = if ((inv.dApp == this))
13891398 then (inv.function == "takeIntoAccountExtraFunds")
13901399 else false
13911400 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13921401 then true
13931402 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13941403 then true
13951404 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13961405 then true
13971406 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
13981407 if (if (callTakeIntoAccount)
13991408 then signedByAdmin
14001409 else false)
14011410 then true
14021411 else multiSignedByAdmins
14031412 case _ =>
14041413 multiSignedByAdmins
14051414 }
14061415 }
14071416

github/deemru/w8io/873ac7e 
202.80 ms