tx · 4DFiukmYwHTe1G8UzAn8FbnajE8LfPhkoXJyenxpdBJP

3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS:  -0.10000000 Waves

2023.01.24 12:05 [2418837] smart account 3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS > SELF 0.00000000 Waves

{ "type": 13, "id": "4DFiukmYwHTe1G8UzAn8FbnajE8LfPhkoXJyenxpdBJP", "fee": 10000000, "feeAssetId": null, "timestamp": 1674551203526, "version": 2, "chainId": 84, "sender": "3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS", "senderPublicKey": "C7xgcYqQ8qV8rmvzAjhQWq4cz82F6VJfXMNygvrTXsfW", "proofs": [ "4dt6ioSAsqj9CU9vLWSNJ7sQuVCbXgmGPuiYYSJz1xb95BxqSfqJ2TCvxg4SLUMmVGj2fFKGkNWk394wtaYicWUt", "3ZbLFWnSYrjZzdxG7gJACMJCBeBFHoTi66GM79Gq31B6DtTN3mUAyEAEvU7KMRDeotA2XCKb5z7D14LCNZHtRbkJ" ], "script": "base64:BgJmCAISBAoCEQESBQoDCAEBEgUKAwEEARIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIAXwAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMAC2tEZXByZWNhdGVkAgtkZXByZWNhdGVkXwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQAEWtTaGFyZUFzc2V0U3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkABGtGZWUCCmNvbW1pc3Npb24AEmtEQXBwVGhyZXNob2xkQ29lZgIRZEFwcFRocmVzaG9sZENvZWYADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AA9rVXNlckdTd29wSW5Hb3YCDV9HU3dvcF9hbW91bnQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwAPa0Zhcm1pbmdBZGRyZXNzAg9mYXJtaW5nX2FkZHJlc3MAEWtMUEZhcm1pbmdBZGRyZXNzAgpscF9mYXJtaW5nAAZvcmFjbGUJAQdBZGRyZXNzAQEaAVRIE5cMwNMzzCUygLYp96dkaICr48x7S5kBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMAEWFkbWluUHViS2V5SW52b2tlCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEmtBZG1pbkludm9rZVB1YktleQAPbW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUQa01vbmV5Qm94QWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAOZmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rRmFybWluZ0FkZHJlc3MAEGxwRmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRFrTFBGYXJtaW5nQWRkcmVzcwAEVVNETgEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEADXN0YWtpbmdBc3NldHMJAMwIAgkA2AQBBQRVU0ROBQNuaWwABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgAOZGVwcmVjYXRlZFBvb2wJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlCQCsAgIFC2tEZXByZWNhdGVkCQClCAEFBHRoaXMHAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEMaXNEZXByaWNhdGVkAAMJAQEhAQUOZGVwcmVjYXRlZFBvb2wFBHVuaXQJAAIBAjFQb29sIGlzIGRlcHJlY2F0ZWQuIE9ubHkgd2l0aGRyYXcgYWN0aW9uIGFsbG93ZWQuAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAGaXRlcjEwCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQUDbmlsAAZpdGVyMTUJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAAGaXRlcjE2CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwUDbmlsAA5ibG9ja1RpbWVzdGFtcAUGaGVpZ2h0AQZhc3NlcnQBAWEDBQFhBwYBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQh1c2VyQWRkcgQEdXNlcgQHJG1hdGNoMAUIdXNlckFkZHIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBdQUHJG1hdGNoMAkApQgBBQF1AwkAAQIFByRtYXRjaDACBlN0cmluZwQBdQUHJG1hdGNoMAUBdQkAAgECGFVua25vdyB0eXBlIG9mIHVzZXIgQWRkcgQKc3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHVzZXIFD2tVc2VyR1N3b3BJbkdvdgAABAtnU3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHVzZXIFD2tVc2VyR1N3b3BJbkdvdgUKc3dvcEFtb3VudAQOZGlzY291bnRWYWx1ZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ9rRGlzY291bnRWYWx1ZXMCASwECWRpc2NvdW50cwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFCmtEaXNjb3VudHMCASwDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAIDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAE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aWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPeHBfcmVkdWNlZF9wcm9jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAp4cF9yZWR1Y2VkCAUNJHQwMTA0NDExMDUwNQJfMQQFaW5kZXgIBQ0kdDAxMDQ0MTEwNTA1Al8yBAx4cF9yZWR1Y2VkX2kJAJEDAgUKeHBfcmVkdWNlZAUBaQQCZHkJAGUCCQBlAgUMeHBfcmVkdWNlZF9pCQEHZ2V0X3lfRAQFA2FtcAUBaQUKeHBfcmVkdWNlZAUCRDEAAQkAlAoCBQJkeQkAZQIFBGR5XzAFAmR5AQ1nZXRTdHJBc3NldElkAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBXN0YWtlB2Fzc2V0SWQDBQVzdGFrZQkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAg51bmxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzARFjYWxjU3Rha2luZ1BhcmFtcwMFc3Rha2UGYW1vdW50B2Fzc2V0SWQDBQVzdGFrZQQNJHQwMTEwNjkxMTEzNQkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTEwNjkxMTEzNQJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMTA2OTExMTM1Al8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsBA0kdDAxMTIyMTExMjg3CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTIyMTExMjg3Al8xBAtzdGFraW5nQWRkcggFDSR0MDExMjIxMTEyODcCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIJAMwIAgUGYW1vdW50CQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwBBXN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTQ3NDExNTc2CQERY2FsY1N0YWtpbmdQYXJhbXMDBgUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTQ3NDExNTc2Al8xBARhZGRyCAUNJHQwMTE0NzQxMTU3NgJfMgQGcGFyYW1zCAUNJHQwMTE0NzQxMTU3NgJfMwQIcGF5bWVudHMIBQ0kdDAxMTQ3NDExNTc2Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEHdW5zdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTE3NjExMTg2NAkBEWNhbGNTdGFraW5nUGFyYW1zAwcFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTE3NjExMTg2NAJfMQQEYWRkcggFDSR0MDExNzYxMTE4NjQCXzIEBnBhcmFtcwgFDSR0MDExNzYxMTE4NjQCXzMECHBheW1lbnRzCAUNJHQwMTE3NjExMTg2NAJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABDHN0YWtlZEFtb3VudAEHYXNzZXRJZAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQR0aGlzAAADCQABAgUHJG1hdGNoMAIEVW5pdAAACQACAQILTWF0Y2ggZXJyb3IEByRtYXRjaDAFFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpAAABD2NoZWNrU3VzcGljaW91cwAEEGNvbnRyYWN0QmFsYW5jZXMJAQNfeHAACgEMY2hlY2tCYWxhbmNlAgNhY2MHYXNzZXRJZAQNJHQwMTI0NzUxMjUwMAUDYWNjBApzdXNwaWNpb3VzCAUNJHQwMTI0NzUxMjUwMAJfMQQBaQgFDSR0MDEyNDc1MTI1MDACXzIDBQpzdXNwaWNpb3VzCQCUCgIFCnN1c3BpY2lvdXMFAWkECGFCYWxhbmNlCQBkAgkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQJAQxzdGFrZWRBbW91bnQBCQDZBAEFB2Fzc2V0SWQDCQBmAgkAkQMCBRBjb250cmFjdEJhbGFuY2VzBQFpBQhhQmFsYW5jZQkAlAoCBgUBaQkAlAoCBwkAZAIFAWkAAQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgcAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY2hlY2tCYWxhbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgESY2hlY2tEQXBwVGhyZXNob2xkAQtuZXdCYWxhbmNlcwQRZEFwcFRocmVzaG9sZENvZWYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBRJrREFwcFRocmVzaG9sZENvZWYCGE5vIGRBcHBUaHJlc2hvbGRDb2VmIGtleQQOdGhyZXNob2xkU2NhbGUAkE4ECm1heEJhbGFuY2UJAJYDAQULbmV3QmFsYW5jZXMECm1pbkJhbGFuY2UJAJcDAQULbmV3QmFsYW5jZXMEBXJhdGlvCQBrAwUKbWF4QmFsYW5jZQUOdGhyZXNob2xkU2NhbGUFCm1pbkJhbGFuY2UDCQBmAgUFcmF0aW8JAGgCBRFkQXBwVGhyZXNob2xkQ29lZgUOdGhyZXNob2xkU2NhbGUJAAIBAjhOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZAcBCmNoZWNrQ29pbnMBCGFzc2V0SWRzBAVjb2lucwkAtQkCBQhhc3NldElkcwIBLAMJAGYCCQCQAwEFBWNvaW5zAAoJAAIBAiBUbyBtYW55IGNvaW5zLCBtYXggY29pbnMgc2l6ZSAxMAoBCWNoZWNrQ29pbgIFZXJyb3IHYXNzZXRJZAQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQdhc3NldElkCQCsAgICEmZyb21CYXNlNThTdHJpbmc6IAUHYXNzZXRJZAQIZGVjaW1hbHMICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUFYXNzZXQJAKwCAgILYXNzZXRJbmZvOiAFB2Fzc2V0SWQIZGVjaW1hbHMDCQECIT0CBQhkZWNpbWFscwUIREVDSU1BTFMJAAIBAg53cm9uZyBkZWNpbWFscwcKAAIkbAUFY29pbnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJY2hlY2tDb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQxjYWxjV2l0aGRyYXcDA21zZwptaW5BbW91bnRzDHVubG9ja0Ftb3VudAQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMECXBtdEFtb3VudAMJAGYCCQCQAwEIBQNtc2cIcGF5bWVudHMAAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQAAAQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAoBEWNhbGNTY3JpcHRBY3Rpb25zAgNhY2MHYmFsYW5jZQQNJHQwMTQ5MTYxNDk0NAUDYWNjBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTQ5MTYxNDk0NAJfMQQBaQgFDSR0MDE0OTE2MTQ5NDQCXzIEB3dBbW91bnQJAGsDBQdiYWxhbmNlBQ53aXRoZHJhd0Ftb3VudAULc2hhcmVTdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMTU0MzMxNTUwMQoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTU0MzMxNTUwMQJfMQQBaQgFDSR0MDE1NDMzMTU1MDECXzIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFDndpdGhkcmF3QW1vdW50BQNuaWwBGmNhbGNXaXRoZHJhd09uZUNvaW5FbnRyaWVzBANtc2cIdG9rZW5PdXQJbWluQW1vdW50DHVubG9ja0Ftb3VudAQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwxvcmlnaW5DYWxsZXIIBQNtc2cIcGF5bWVudHMECXBtdEFtb3VudAMJAGYCCQCQAwEIBQNtc2cIcGF5bWVudHMAAAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQAAAQIb3V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQCeHAJAQNfeHAABA0kdDAxNjM2MzE2NDUwCQEUX2NhbGNXaXRoZHJhd09uZUNvaW4EBQJ4cAUOd2l0aGRyYXdBbW91bnQFCG91dEluZGV4CAUDbXNnDG9yaWdpbkNhbGxlcgQCZHkIBQ0kdDAxNjM2MzE2NDUwAl8xBAZkeV9mZWUIBQ0kdDAxNjM2MzE2NDUwAl8yAwkBBmFzc2VydAEJAGcCBQJkeQUJbWluQW1vdW50CQACAQIYTm90IGVub3VnaCBjb2lucyByZW1vdmVkBA5nb3Zlcm5hbmNlRmVlcwkAawMFBmR5X2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BApkeV9hbmRfZmVlCQBkAgUCZHkFBmR5X2ZlZQoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMTY3MDgxNjczNAUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDE2NzA4MTY3MzQCXzEEAWkIBQ0kdDAxNjcwODE2NzM0Al8yAwkAAAIFAWkFCG91dEluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGUCBQx0b2tlbkJhbGFuY2UFCmR5X2FuZF9mZWUJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAxNjkwMTE2OTYyCgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDE2OTAxMTY5NjICXzEEAXYIBQ0kdDAxNjkwMTE2OTYyAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFDndpdGhkcmF3QW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4UA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDCGFzc2V0SWRzAl9BEl9kQXBwVGhyZXNob2xkQ29lZgMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAMJAGcCAAAFAl9BCQACAQIUQW1wIG11c3QgYmUgbXVzdCA+IDADCQBnAgAABRJfZEFwcFRocmVzaG9sZENvZWYJAAIBAh9kQXBwIFRocmVzaG9sZCBDb2VmIG11c3QgYmUgPiAwBAlzaGFyZU5hbWUCC3NfTXVsdGlfVVNEBBBzaGFyZURlc2NyaXB0aW9uCQCsAgICQlNoYXJlVG9rZW4gb2YgU3dvcEZpIHByb3RvY29sIGZvciBNdWx0aVN0YWJsZSBVU0QgcG9vbCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBAppc3N1ZVRva2VuCQDCCAUFCXNoYXJlTmFtZQUQc2hhcmVEZXNjcmlwdGlvbgAAAAYGBAd0b2tlbklkCQC4CAEFCmlzc3VlVG9rZW4DCQEKY2hlY2tDb2lucwEFCGFzc2V0SWRzCQEFdGhyb3cACQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgUSX2RBcHBUaHJlc2hvbGRDb2VmCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDbXNnAQxhZGRMaXF1aWRpdHkDDW1pbk1pbnRBbW91bnQMc3Rha2VGYXJtaW5nCGxvY2tUeXBlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEMaXNEZXByaWNhdGVkAAQDYW1wCQECX0EABAJ4cAkBA194cAAEAkQwAwkAAAIFC3NoYXJlU3VwcGx5AAAAAAkBB2dldERNZW0CBQJ4cAUDYW1wBA0kdDAxOTEzMTE5Mzg1AwMJAGYCBQhsb2NrVHlwZQAACQAAAggJAJEDAggFA21zZwhwYXltZW50cwkAZQIJAJADAQgFA21zZwhwYXltZW50cwABB2Fzc2V0SWQFBHVuaXQHCQCUCgIJANEIAggFA21zZwhwYXltZW50cwkAZQIJAJADAQgFA21zZwhwYXltZW50cwABCQDMCAIJAJEDAggFA21zZwhwYXltZW50cwkAZQIJAJADAQgFA21zZwhwYXltZW50cwABBQNuaWwJAJQKAggFA21zZwhwYXltZW50cwUDbmlsBAhwYXltZW50cwgFDSR0MDE5MTMxMTkzODUCXzEEB2xvY2tGZWUIBQ0kdDAxOTEzMTE5Mzg1Al8yBAxwYXltZW50c1NpemUJAJADAQUIcGF5bWVudHMKAQ12YWxpZFBheW1lbnRzAQFuAwkAZgIFDHBheW1lbnRzU2l6ZQUGbkNvaW5zCQACAQkArAICAhBwYXltZW50cyBzaXplID4gCQCkAwEFBm5Db2lucwMJAGYCAAEFDHBheW1lbnRzU2l6ZQkAAgECEXBheW1lbnRzIHNpemUgPCAxAwMJAAACBQtzaGFyZVN1cHBseQAACQECIT0CBQZuQ29pbnMFDHBheW1lbnRzU2l6ZQcJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zCgEMcGF5bWFudFZhbGlkAgNhY2MHcGF5bWVudAMJAQ9jb250YWluc0VsZW1lbnQCBQhhc3NldElkcwkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBgkAAgECGEludmFsaWQgYXNzZXQgaW4gcGF5bWVudAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxwYXltYW50VmFsaWQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQEBIQEJAQ12YWxpZFBheW1lbnRzAQUMcGF5bWVudHNTaXplCQEFdGhyb3cABApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcgUIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHYXNzZXRJZAQNJHQwMjAyNTUyMDI4MQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDIwMjU1MjAyODECXzEEAWkIBQ0kdDAyMDI1NTIwMjgxAl8yCgEMcGFyc2VQYXltZW50AgpuZXdCYWxhbmNlB3BheW1lbnQDCQAAAgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBQdhc3NldElkCQBkAgUKbmV3QmFsYW5jZQgFB3BheW1lbnQGYW1vdW50BQpuZXdCYWxhbmNlBAluZXdCYWxhY2UKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCRAwIFAnhwBQFpCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxwYXJzZVBheW1lbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUJbmV3QmFsYWNlCQBkAgUBaQABBA0kdDAyMDYzMTIwNjk4CgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLbmV3QmFsYW5jZXMIBQ0kdDAyMDYzMTIwNjk4Al8xBAFrCAUNJHQwMjA2MzEyMDY5OAJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAMJAQZhc3NlcnQBCQBmAgUCRDEFAkQwCQACAQIHRDEgPiBEMAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIBQNtc2cGY2FsbGVyCgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwpuZXdCYWxhbmNlBA0kdDAyMTAxODIxMDU5BQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMjEwMTgyMTA1OQJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDIxMDE4MjEwNTkCXzIEAWkIBQ0kdDAyMTAxODIxMDU5Al8zAwkAZgIFC3NoYXJlU3VwcGx5AAAEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEDmdvdmVybmFuY2VGZWVzCQBrAwUEZmVlcwUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BAxmaW5hbEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwQDcG10CQBlAgUKbmV3QmFsYW5jZQkAkQMCBQJ4cAUBaQQGbHBGZWVzCQBlAgUEZmVlcwUOZ292ZXJuYW5jZUZlZXMEA2ludgMJAGYCBQNwbXQAAAkBBXN0YWtlAgkAZQIFA3BtdAUEZmVlcwkAkQMCBQhhc3NldElkcwUBaQkBB3Vuc3Rha2UCBQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52BAdhaXJkcm9wAwkAZgIFBmxwRmVlcwAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpBQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUQaW52YXJpYW50QmFsYW5jZQkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQxmaW5hbEJhbGFuY2UFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDaW52CQEFc3Rha2UCBQpuZXdCYWxhbmNlCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52CQCVCgMJAM0IAgULaW52QmFsYW5jZXMFCm5ld0JhbGFuY2UJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQUKbmV3QmFsYW5jZQkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjI3NjQyMjg1MgoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEC2ludkJhbGFuY2VzCAUNJHQwMjI3NjQyMjg1MgJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDIyNzY0MjI4NTICXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIXbG9ja1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAggIBQNtc2cGY2FsbGVyBWJ5dGVzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQhsb2NrVHlwZQUDbmlsCQDOCAIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQFA25pbAUHbG9ja0ZlZQMJAAACBQFzBQFzCQDNCAIFDXNjcmlwdEFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFC21pbnRfYW1vdW50BQxzaGFyZUFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50BQNuaWwDbXNnAQ5jYWxjTWludEFtb3VudAILbmV3QmFsYW5jZXMEdXNlcgQDYW1wCQECX0EABAJ4cAkBA194cAAEAkQxCQEHZ2V0RE1lbQIFC25ld0JhbGFuY2VzBQNhbXADCQAAAgULc2hhcmVTdXBwbHkAAAkAlAoCBQNuaWwFAkQxBAJEMAkBB2dldERNZW0CBQJ4cAUDYW1wBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQUEdXNlcgoBD2NhbGNJbnZCYWxhbmNlcwIDYWNjCm5ld0JhbGFuY2UEDSR0MDI0MTMwMjQxNTYFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAyNDEzMDI0MTU2Al8xBAFpCAUNJHQwMjQxMzAyNDE1NgJfMgQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQQaW52YXJpYW50QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMJAJQKAgkAzQgCBQtpbnZCYWxhbmNlcwUQaW52YXJpYW50QmFsYW5jZQkAZAIFAWkAAQQNJHQwMjQ3NTgyNDgyOAoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNJbnZCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLaW52QmFsYW5jZXMIBQ0kdDAyNDc1ODI0ODI4Al8xBAFrCAUNJHQwMjQ3NTgyNDgyOAJfMgQCRDIJAQdnZXRETWVtAgULaW52QmFsYW5jZXMFA2FtcAQKbWludEFtb3VudAkAawMFC3NoYXJlU3VwcGx5CQBlAgUCRDIFAkQwBQJEMAkAlAoCBQNuaWwFCm1pbnRBbW91bnQDbXNnAQxyZWlzc3VlU2hhcmUBBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQNtc2cJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFBmFtb3VudAYFA25pbANtc2cBBWdldER5BAlhc3NldEZyb20HYXNzZXRUbwJkeAt1c2VyQWRkcmVzcwQCeHAJAQNfeHAABAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUJYXNzZXRGcm9tAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB2Fzc2V0VG8CEXVua25vd24gdG9rZW4gb3V0BAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBAJkeQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCQEHQWRkcmVzcwEJANkEAQULdXNlckFkZHJlc3MEBF9mZWUJAGsDCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQJkeQUJZmVlU2NhbGU2CQCUCgIFA25pbAkAlAoCCQBlAgUCZHkFBF9mZWUFBF9mZWUDbXNnAQhleGNoYW5nZQIIdG9rZW5PdXQGbWluX2R5CQELdmFsdWVPckVsc2UCCQEMaXNEZXByaWNhdGVkAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQEC3Rva2VuT3V0QjU4CQDZBAEFCHRva2VuT3V0BAJkeAgFB3BheW1lbnQGYW1vdW50BAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHdG9rZW5JbgIQdW5rbm93biB0b2tlbiBpbgQHdG9JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQEAnhwCQEDX3hwAAQBeAkAZAIJAJEDAgUCeHAFCWZyb21JbmRleAUCZHgEAXkJAQRnZXRZBAUJZnJvbUluZGV4BQd0b0luZGV4BQF4BQJ4cAQDX2R5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIBQNtc2cMb3JpZ2luQ2FsbGVyBARfZmVlCQBrAwUDX2R5CQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQlmZWVTY2FsZTYEAmR5CQBlAgUDX2R5BQRfZmVlBA5nb3Zlcm5hbmNlRmVlcwkAawMFBF9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgMJAQZhc3NlcnQBCQBnAgUCZHkFBm1pbl9keQkAAgECLkV4Y2hhbmdlIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDI2OTk4MjcwMjQFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNjk5ODI3MDI0Al8xBAFpCAUNJHQwMjY5OTgyNzAyNAJfMgMJAAACBQFpBQlmcm9tSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZAIFDHRva2VuQmFsYW5jZQUCZHgJAGQCBQFpAAEDCQAAAgUBaQUHdG9JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQNfZHkJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyNzMwNzI3MzY4CgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDI3MzA3MjczNjgCXzEEAWkIBQ0kdDAyNzMwNzI3MzY4Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAFzCQEFc3Rha2UCCAUHcGF5bWVudAZhbW91bnQJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAMJAAACBQFzBQFzBAJ1cwkBB3Vuc3Rha2UCBQNfZHkFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwQGbHBGZWVzCQBlAgUEX2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JbgUNa0Fzc2V0QmFsYW5jZQUBeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQh0b2tlbk91dAUNa0Fzc2V0QmFsYW5jZQkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFA19keQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4BQNuaWwJAMwIAgUCZHkJAMwIAgULdG9rZW5PdXRCNTgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBCHdpdGhkcmF3AQptaW5BbW91bnRzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQEMY2FsY1dpdGhkcmF3AwUDbXNnBQptaW5BbW91bnRzAAADbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCG3dpdGhkcmF3U2hhcmVUb2tlbnNGcm9tUG9vbAkAzAgCCAgFA21zZwZjYWxsZXIFYnl0ZXMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sJAQxjYWxjV2l0aGRyYXcDBQNtc2cFCm1pbkFtb3VudHMFDHVubG9ja0Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBE2NhbGNXaXRoZHJhd09uZUNvaW4DC3Rva2VuQW1vdW50CHRva2VuT3V0BHVzZXIDCQBnAgAABQt0b2tlbkFtb3VudAkAAgECF0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlBAFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAkAlAoCBQNuaWwICQEUX2NhbGNXaXRoZHJhd09uZUNvaW4ECQEDX3hwAAULdG9rZW5BbW91bnQFAWkJAQdBZGRyZXNzAQkA2QQBBQR1c2VyAl8xA21zZwEPd2l0aGRyYXdPbmVDb2luAgh0b2tlbk91dAltaW5BbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQxpc0RlcHJpY2F0ZWQACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxCQEaY2FsY1dpdGhkcmF3T25lQ29pbkVudHJpZXMEBQNtc2cFCHRva2VuT3V0BQltaW5BbW91bnQAAANtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQxpc0RlcHJpY2F0ZWQACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZgIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCG3dpdGhkcmF3U2hhcmVUb2tlbnNGcm9tUG9vbAkAzAgCCAgFA21zZwZjYWxsZXIFYnl0ZXMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sJARpjYWxjV2l0aGRyYXdPbmVDb2luRW50cmllcwQFA21zZwUIdG9rZW5PdXQFCW1pbkFtb3VudAUMdW5sb2NrQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEBQQAJAJQKAgUDbmlsCQECX0EAA21zZwEPZ2V0VmlydHVhbFByaWNlAAQBRAkBBWdldF9EAgkBA194cAAJAQJfQQAJAJQKAgUDbmlsCQBrAwUBRAUJUFJFQ0lTSU9OBQtzaGFyZVN1cHBseQNtc2cBD2NhbGNUb2tlbkFtb3VudAIHYW1vdW50cwdkZXBvc2l0BANhbXAJAQJfQQAECGJhbGFuY2VzCQEDX3hwAAQCRDAJAQdnZXRETWVtAgUIYmFsYW5jZXMFA2FtcAoBD2NhbGNOZXdCYWxhbmNlcwIDYWNjB2JhbGFuY2UEDSR0MDMwMTU4MzAxODQFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAzMDE1ODMwMTg0Al8xBAFpCAUNJHQwMzAxNTgzMDE4NAJfMgQKbmV3QmFsYW5jZQkAZAIFB2JhbGFuY2UDBQdkZXBvc2l0CQCRAwIFB2Ftb3VudHMFAWkJAQEtAQkAkQMCBQdhbW91bnRzBQFpCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFCm5ld0JhbGFuY2UJAGQCBQFpAAEEC25ld0JhbGFuY2VzCAoAAiRsBQhiYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQFY2xhaW0DCQEPY29udGFpbnNFbGVtZW50AgUIYXNzZXRJZHMJANgEAQUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGNsYWltUmV3YXJkcwUDbmlsBQNuaWwAAAMJAAACBQVjbGFpbQUFY2xhaW0DCQECIT0CCAUDbXNnBmNhbGxlcgUPbW9uZXlCb3hBZGRyZXNzCQACAQImT25seSB0aGUgd2FsbGV0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ECGJhbGFuY2VzCQEDX3hwAAoBDnRha2VFeHRyYUZ1bmRzAgNhY2MHYXNzZXRJZAQNJHQwMzI3NjkzMjc4NwUDYWNjBANzdW0IBQ0kdDAzMjc2OTMyNzg3Al8xBAFpCAUNJHQwMzI3NjkzMjc4NwJfMgQIdG9rZW5CNTgJANkEAQUHYXNzZXRJZAQIckJhbGFuY2UJAGQCCQDwBwIFBHRoaXMFCHRva2VuQjU4CQEMc3Rha2VkQW1vdW50AQUIdG9rZW5CNTgEDGVucm9sbEFtb3VudAkAZQIFCHJCYWxhbmNlCQCRAwIFCGJhbGFuY2VzBQFpAwkAZgIAAAUMZW5yb2xsQW1vdW50CQEHc3VzcGVuZAEJAKwCAgIgRW5yb2xsIGFtb3VudCBuZWdhdGl2ZSBmb3IgYXNzZXQFB2Fzc2V0SWQEB2FpcmRyb3ADCQBmAgUMZW5yb2xsQW1vdW50AAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQh0b2tlbkI1OAUMZW5yb2xsQW1vdW50BQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQCUCgIJAGQCBQNzdW0FDGVucm9sbEFtb3VudAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQBawoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDnRha2VFeHRyYUZ1bmRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIIBQFrAl8xAAAJAAIBAhBObyBtb25leSB0byB0YWtlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluUHViS2V5SW52b2tlAwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWlucy2FIkY=", "height": 2418837, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6qhLkDFqMWisAhKUqnDMTwSTqtb6G7RCXdQuQytgVba5 Next: 21Pqs7asD3hspdVaKqbXq3g3CHDzTX7fRkED1NnrG4rN Diff:
OldNewDifferences
2222 let kActive = "active"
2323
2424 let kActiveGlob = "active_all_contracts"
25+
26+let kDeprecated = "deprecated_"
2527
2628 let kCause = "shutdown_cause"
2729
9193
9294 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9395
94-let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
96+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
9597
9698 let stakingAssets = [toBase58String(USDN)]
9799
98100 let active = getBooleanValue(this, kActive)
99101
100102 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
103+
104+let deprecatedPool = valueOrElse(getBoolean(oracle, (kDeprecated + toString(this))), false)
101105
102106 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
103107
132136 else false)
133137 then unit
134138 else throw("DApp is inactive at this moment")
139+
140+
141+func isDepricated () = if (!(deprecatedPool))
142+ then unit
143+ else throw("Pool is deprecated. Only withdraw action allowed.")
135144
136145
137146 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
294303 else $Tuple2(D, false)
295304 }
296305
297- let $t065826648 = {
306+ let $t068206886 = {
298307 let $l = iter15
299308 let $s = size($l)
300309 let $acc0 = $Tuple2(toBigInt(S), false)
308317
309318 $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)
310319 }
311- let D = $t065826648._1
312- let finished = $t065826648._2
320+ let D = $t068206886._1
321+ let finished = $t068206886._2
313322 if ((finished == false))
314323 then throw(("get_D() not finished with " + toString(D)))
315324 else toInt(D)
335344 let D = get_D(xp_, amp)
336345 let Ann = (amp * nCoins)
337346 func S_c (acc,i) = {
338- let $t072197236 = acc
339- let S_ = $t072197236._1
340- let c = $t072197236._2
347+ let $t074577474 = acc
348+ let S_ = $t074577474._1
349+ let c = $t074577474._2
341350 let x_ = if ((in == i))
342351 then x
343352 else xp_[i]
348357 else $Tuple2(S_, c)
349358 }
350359
351- let $t074447499 = {
360+ let $t076827737 = {
352361 let $l = iter10
353362 let $s = size($l)
354363 let $acc0 = $Tuple2(0, toBigInt(D))
362371
363372 $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)
364373 }
365- let S_ = $t074447499._1
366- let c_ = $t074447499._2
374+ let S_ = $t076827737._1
375+ let c_ = $t076827737._2
367376 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
368377 let bD = toBigInt(((S_ + (D / Ann)) - D))
369378 func y_proc (acc,_i) = if ((acc._2 == true))
380389 else $Tuple2(y, false)
381390 }
382391
383- let $t079818048 = {
392+ let $t082198286 = {
384393 let $l = iter16
385394 let $s = size($l)
386395 let $acc0 = $Tuple2(toBigInt(D), false)
394403
395404 $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)
396405 }
397- let y = $t079818048._1
398- let finished = $t079818048._2
406+ let y = $t082198286._1
407+ let finished = $t082198286._2
399408 if ((finished == false))
400409 then throw(("getY() not finished with " + toString(y)))
401410 else toInt(y)
409418 else {
410419 let Ann = (A_ * nCoins)
411420 func S_c (acc,i) = {
412- let $t084278444 = acc
413- let S_ = $t084278444._1
414- let c = $t084278444._2
421+ let $t086658682 = acc
422+ let S_ = $t086658682._1
423+ let c = $t086658682._2
415424 let x_ = if (if ((in != i))
416425 then (nCoins > i)
417426 else false)
424433 else $Tuple2(S_, c)
425434 }
426435
427- let $t086648719 = {
436+ let $t089028957 = {
428437 let $l = iter10
429438 let $s = size($l)
430439 let $acc0 = $Tuple2(0, toBigInt(D))
438447
439448 $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)
440449 }
441- let S_ = $t086648719._1
442- let c_ = $t086648719._2
450+ let S_ = $t089028957._1
451+ let c_ = $t089028957._2
443452 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
444453 let bD = toBigInt(((S_ + (D / Ann)) - D))
445454 func y_D_proc (acc,i) = if ((acc._2 == true))
456465 else $Tuple2(y, false)
457466 }
458467
459- let $t092029271 = {
468+ let $t094409509 = {
460469 let $l = iter16
461470 let $s = size($l)
462471 let $acc0 = $Tuple2(toBigInt(D), false)
470479
471480 $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)
472481 }
473- let y = $t092029271._1
474- let finished = $t092029271._2
482+ let y = $t094409509._1
483+ let finished = $t094409509._2
475484 if ((finished == false))
476485 then throw(("get_y_D() not finished with " + toString(y)))
477486 else toInt(y)
488497 let new_y = get_y_D(amp, i, xp, D1)
489498 let dy_0 = (xp[i] - new_y)
490499 func xp_reduced_proc (acc,xp_j) = {
491- let $t099129941 = acc
492- let xp_reduced = $t099129941._1
493- let index = $t099129941._2
500+ let $t01015010179 = acc
501+ let xp_reduced = $t01015010179._1
502+ let index = $t01015010179._2
494503 let dx_expected = if ((index == i))
495504 then (fraction(xp_j, D1, D0) - new_y)
496505 else (xp_j - fraction(xp_j, D1, D0))
497506 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
498507 }
499508
500- let $t01020310267 = {
509+ let $t01044110505 = {
501510 let $l = xp
502511 let $s = size($l)
503512 let $acc0 = $Tuple2(nil, 0)
511520
512521 $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)
513522 }
514- let xp_reduced = $t01020310267._1
515- let index = $t01020310267._2
523+ let xp_reduced = $t01044110505._1
524+ let index = $t01044110505._2
516525 let xp_reduced_i = xp_reduced[i]
517526 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
518527 $Tuple2(dy, (dy_0 - dy))
536545
537546 func calcStakingParams (stake,amount,assetId) = if (stake)
538547 then {
539- let $t01083110897 = calcStakingFuncAndAddres(stake, assetId)
540- let call = $t01083110897._1
541- let stakingAddr = $t01083110897._2
548+ let $t01106911135 = calcStakingFuncAndAddres(stake, assetId)
549+ let call = $t01106911135._1
550+ let stakingAddr = $t01106911135._2
542551 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
543552 }
544553 else {
545- let $t01098311049 = calcStakingFuncAndAddres(stake, assetId)
546- let call = $t01098311049._1
547- let stakingAddr = $t01098311049._2
554+ let $t01122111287 = calcStakingFuncAndAddres(stake, assetId)
555+ let call = $t01122111287._1
556+ let stakingAddr = $t01122111287._2
548557 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
549558 }
550559
551560
552561 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
553562 then {
554- let $t01123611338 = calcStakingParams(true, amount, fromBase58String(assetIdString))
555- let call = $t01123611338._1
556- let addr = $t01123611338._2
557- let params = $t01123611338._3
558- let payments = $t01123611338._4
563+ let $t01147411576 = calcStakingParams(true, amount, fromBase58String(assetIdString))
564+ let call = $t01147411576._1
565+ let addr = $t01147411576._2
566+ let params = $t01147411576._3
567+ let payments = $t01147411576._4
559568 invoke(addr, call, params, payments)
560569 }
561570 else 0
563572
564573 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
565574 then {
566- let $t01152311626 = calcStakingParams(false, amount, fromBase58String(assetIdString))
567- let call = $t01152311626._1
568- let addr = $t01152311626._2
569- let params = $t01152311626._3
570- let payments = $t01152311626._4
575+ let $t01176111864 = calcStakingParams(false, amount, fromBase58String(assetIdString))
576+ let call = $t01176111864._1
577+ let addr = $t01176111864._2
578+ let params = $t01176111864._3
579+ let payments = $t01176111864._4
571580 invoke(addr, call, params, payments)
572581 }
573582 else 0
596605 func checkSuspicious () = {
597606 let contractBalances = _xp()
598607 func checkBalance (acc,assetId) = {
599- let $t01223712262 = acc
600- let suspicious = $t01223712262._1
601- let i = $t01223712262._2
608+ let $t01247512500 = acc
609+ let suspicious = $t01247512500._1
610+ let i = $t01247512500._2
602611 if (suspicious)
603612 then $Tuple2(suspicious, i)
604613 else {
703712 else 0
704713 let withdrawAmount = (pmtAmount + unlockAmount)
705714 func calcScriptActions (acc,balance) = {
706- let $t01467814706 = acc
707- let scriptActions = $t01467814706._1
708- let i = $t01467814706._2
715+ let $t01491614944 = acc
716+ let scriptActions = $t01491614944._1
717+ let i = $t01491614944._2
709718 let wAmount = fraction(balance, withdrawAmount, shareSupply)
710719 if (assert((wAmount >= minAmounts[i])))
711720 then throw("Withdrawal resulted in fewer coins than expected")
717726 }
718727 }
719728
720- let $t01519515263 = {
729+ let $t01543315501 = {
721730 let $l = _xp()
722731 let $s = size($l)
723732 let $acc0 = $Tuple2(nil, 0)
731740
732741 $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)
733742 }
734- let scriptActions = $t01519515263._1
735- let i = $t01519515263._2
743+ let scriptActions = $t01543315501._1
744+ let i = $t01543315501._2
736745 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
737746 }
738747 }
755764 let tokenOutB58 = fromBase58String(tokenOut)
756765 let withdrawAmount = (pmtAmount + unlockAmount)
757766 let xp = _xp()
758- let $t01612516212 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
759- let dy = $t01612516212._1
760- let dy_fee = $t01612516212._2
767+ let $t01636316450 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
768+ let dy = $t01636316450._1
769+ let dy_fee = $t01636316450._2
761770 if (assert((dy >= minAmount)))
762771 then throw("Not enough coins removed")
763772 else {
764773 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
765774 let dy_and_fee = (dy + dy_fee)
766775 func makeNewBalances (acc,tokenBalance) = {
767- let $t01647016496 = acc
768- let newBalances = $t01647016496._1
769- let i = $t01647016496._2
776+ let $t01670816734 = acc
777+ let newBalances = $t01670816734._1
778+ let i = $t01670816734._2
770779 if ((i == outIndex))
771780 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
772781 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
773782 }
774783
775- let $t01666316724 = {
784+ let $t01690116962 = {
776785 let $l = xp
777786 let $s = size($l)
778787 let $acc0 = $Tuple2(nil, 0)
786795
787796 $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)
788797 }
789- let newBalances = $t01666316724._1
790- let v = $t01666316724._2
798+ let newBalances = $t01690116962._1
799+ let v = $t01690116962._2
791800 if (checkDAppThreshold(newBalances))
792801 then throw()
793802 else {
837846
838847
839848 @Callable(msg)
840-func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), {
849+func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), valueOrElse(isDepricated(), {
841850 let amp = _A()
842851 let xp = _xp()
843852 let D0 = if ((shareSupply == 0))
844853 then 0
845854 else getDMem(xp, amp)
846- let $t01886419118 = if (if ((lockType > 0))
855+ let $t01913119385 = if (if ((lockType > 0))
847856 then (msg.payments[(size(msg.payments) - 1)].assetId == unit)
848857 else false)
849858 then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
850859 else $Tuple2(msg.payments, nil)
851- let payments = $t01886419118._1
852- let lockFee = $t01886419118._2
860+ let payments = $t01913119385._1
861+ let lockFee = $t01913119385._2
853862 let paymentsSize = size(payments)
854863 func validPayments (n) = if ((paymentsSize > nCoins))
855864 then throw(("payments size > " + toString(nCoins)))
886895 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
887896 else {
888897 func parsePayments (acc,assetId) = {
889- let $t01998820014 = acc
890- let newBalances = $t01998820014._1
891- let i = $t01998820014._2
898+ let $t02025520281 = acc
899+ let newBalances = $t02025520281._1
900+ let i = $t02025520281._2
892901 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
893902 then (newBalance + payment.amount)
894903 else newBalance
910919 $Tuple2((newBalances :+ newBalace), (i + 1))
911920 }
912921
913- let $t02036420431 = {
922+ let $t02063120698 = {
914923 let $l = assetIds
915924 let $s = size($l)
916925 let $acc0 = $Tuple2(nil, 0)
924933
925934 $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)
926935 }
927- let newBalances = $t02036420431._1
928- let k = $t02036420431._2
936+ let newBalances = $t02063120698._1
937+ let k = $t02063120698._2
929938 if (checkDAppThreshold(newBalances))
930939 then throw()
931940 else {
935944 else {
936945 let feeDiscount = calculateFeeDiscount(msg.caller)
937946 func calcScriptActions (acc,newBalance) = {
938- let $t02075120792 = acc
939- let invBalances = $t02075120792._1
940- let scriptActions = $t02075120792._2
941- let i = $t02075120792._3
947+ let $t02101821059 = acc
948+ let invBalances = $t02101821059._1
949+ let scriptActions = $t02101821059._2
950+ let i = $t02101821059._3
942951 if ((shareSupply > 0))
943952 then {
944953 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
976985 }
977986 }
978987
979- let $t02249722585 = {
988+ let $t02276422852 = {
980989 let $l = newBalances
981990 let $s = size($l)
982991 let $acc0 = $Tuple3(nil, nil, 0)
990999
9911000 $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)
9921001 }
993- let invBalances = $t02249722585._1
994- let scriptActions = $t02249722585._2
1002+ let invBalances = $t02276422852._1
1003+ let scriptActions = $t02276422852._2
9951004 let D2 = getDMem(invBalances, amp)
9961005 let mint_amount = if ((shareSupply == 0))
9971006 then D1
10151024 }
10161025 }
10171026 }
1018- })
1027+ }))
10191028
10201029
10211030
10301039 let D0 = getDMem(xp, amp)
10311040 let feeDiscount = calculateFeeDiscount(user)
10321041 func calcInvBalances (acc,newBalance) = {
1033- let $t02386123887 = acc
1034- let invBalances = $t02386123887._1
1035- let i = $t02386123887._2
1042+ let $t02413024156 = acc
1043+ let invBalances = $t02413024156._1
1044+ let i = $t02413024156._2
10361045 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
10371046 let fees = {
10381047 let idealBalance = fraction(D1, xp[i], D0)
10451054 $Tuple2((invBalances :+ invariantBalance), (i + 1))
10461055 }
10471056
1048- let $t02448924559 = {
1057+ let $t02475824828 = {
10491058 let $l = newBalances
10501059 let $s = size($l)
10511060 let $acc0 = $Tuple2(nil, 0)
10591068
10601069 $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)
10611070 }
1062- let invBalances = $t02448924559._1
1063- let k = $t02448924559._2
1071+ let invBalances = $t02475824828._1
1072+ let k = $t02475824828._2
10641073 let D2 = getDMem(invBalances, amp)
10651074 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
10661075 $Tuple2(nil, mintAmount)
10901099
10911100
10921101 @Callable(msg)
1093-func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1102+func exchange (tokenOut,min_dy) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
10941103 then throw("size(payments) != 1")
10951104 else {
10961105 let suspicious = checkSuspicious()
11151124 then throw("Exchange resulted in fewer coins than expected")
11161125 else {
11171126 func makeNewBalances (acc,tokenBalance) = {
1118- let $t02660026626 = acc
1119- let newBalances = $t02660026626._1
1120- let i = $t02660026626._2
1127+ let $t02699827024 = acc
1128+ let newBalances = $t02699827024._1
1129+ let i = $t02699827024._2
11211130 if ((i == fromIndex))
11221131 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
11231132 else if ((i == toIndex))
11251134 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11261135 }
11271136
1128- let $t02687726938 = {
1137+ let $t02730727368 = {
11291138 let $l = xp
11301139 let $s = size($l)
11311140 let $acc0 = $Tuple2(nil, 0)
11391148
11401149 $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)
11411150 }
1142- let newBalances = $t02687726938._1
1143- let i = $t02687726938._2
1151+ let newBalances = $t02730727368._1
1152+ let i = $t02730727368._2
11441153 if (checkDAppThreshold(newBalances))
11451154 then throw()
11461155 else {
11641173 }
11651174 }
11661175 }
1167- })
1176+ }))
11681177
11691178
11701179
11961205
11971206
11981207 @Callable(msg)
1199-func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1208+func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
12001209 then throw("size(payments) != 1")
1201- else calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, 0))
1210+ else calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, 0)))
12021211
12031212
12041213
12051214 @Callable(msg)
1206-func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 > unlockAmount))
1215+func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((0 > unlockAmount))
12071216 then throw("Unlock amount must be positive")
12081217 else {
12091218 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
12101219 if ((unlock == unlock))
12111220 then calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, unlockAmount)
12121221 else throw("Strict value is not equal to itself.")
1213- })
1222+ }))
12141223
12151224
12161225
12331242 let balances = _xp()
12341243 let D0 = getDMem(balances, amp)
12351244 func calcNewBalances (acc,balance) = {
1236- let $t02951529541 = acc
1237- let newBalances = $t02951529541._1
1238- let i = $t02951529541._2
1245+ let $t03015830184 = acc
1246+ let newBalances = $t03015830184._1
1247+ let i = $t03015830184._2
12391248 let newBalance = (balance + (if (deposit)
12401249 then amounts[i]
12411250 else -(amounts[i])))
13101319
13111320
13121321 @Callable(msg)
1313-func takeIntoAccountExtraFunds () = valueOrElse(isActive(), if ((msg.caller != moneyBoxAddress))
1314- then throw("Only the wallet can call this function")
1315- else {
1316- let balances = _xp()
1317- func takeExtraFunds (acc,assetId) = {
1318- let $t03188331901 = acc
1319- let sum = $t03188331901._1
1320- let i = $t03188331901._2
1321- let tokenB58 = fromBase58String(assetId)
1322- let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
1323- let enrollAmount = (rBalance - balances[i])
1324- if ((0 > enrollAmount))
1325- then suspend(("Enroll amount negative for asset" + assetId))
1326- else {
1327- let airdrop = if ((enrollAmount > 0))
1328- then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
1329- else 0
1330- if ((airdrop == airdrop))
1331- then $Tuple2((sum + enrollAmount), (i + 1))
1332- else throw("Strict value is not equal to itself.")
1322+func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
1323+ let claim = if (containsElement(assetIds, toBase58String(USDN)))
1324+ then invoke(stakingUSDNAddress, "claimRewards", nil, nil)
1325+ else 0
1326+ if ((claim == claim))
1327+ then if ((msg.caller != moneyBoxAddress))
1328+ then throw("Only the wallet can call this function")
1329+ else {
1330+ let balances = _xp()
1331+ func takeExtraFunds (acc,assetId) = {
1332+ let $t03276932787 = acc
1333+ let sum = $t03276932787._1
1334+ let i = $t03276932787._2
1335+ let tokenB58 = fromBase58String(assetId)
1336+ let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
1337+ let enrollAmount = (rBalance - balances[i])
1338+ if ((0 > enrollAmount))
1339+ then suspend(("Enroll amount negative for asset" + assetId))
1340+ else {
1341+ let airdrop = if ((enrollAmount > 0))
1342+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
1343+ else 0
1344+ if ((airdrop == airdrop))
1345+ then $Tuple2((sum + enrollAmount), (i + 1))
1346+ else throw("Strict value is not equal to itself.")
1347+ }
13331348 }
1334- }
13351349
1336- let k = {
1337- let $l = assetIds
1338- let $s = size($l)
1339- let $acc0 = $Tuple2(0, 0)
1340- func $f0_1 ($a,$i) = if (($i >= $s))
1341- then $a
1342- else takeExtraFunds($a, $l[$i])
1350+ let k = {
1351+ let $l = assetIds
1352+ let $s = size($l)
1353+ let $acc0 = $Tuple2(0, 0)
1354+ func $f0_1 ($a,$i) = if (($i >= $s))
1355+ then $a
1356+ else takeExtraFunds($a, $l[$i])
13431357
1344- func $f0_2 ($a,$i) = if (($i >= $s))
1345- then $a
1346- else throw("List size exceeds 10")
1358+ func $f0_2 ($a,$i) = if (($i >= $s))
1359+ then $a
1360+ else throw("List size exceeds 10")
13471361
1348- $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)
1349- }
1350- if ((k._1 == 0))
1351- then throw("No money to take")
1352- else nil
1353- })
1362+ $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)
1363+ }
1364+ if ((k._1 == 0))
1365+ then throw("No money to take")
1366+ else nil
1367+ }
1368+ else throw("Strict value is not equal to itself.")
1369+ })
13541370
13551371
13561372 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let version = "3.0.0"
1515
1616 let kVersion = "version"
1717
1818 let kAssets = "asset_ids"
1919
2020 let kAssetBalance = "_balance"
2121
2222 let kActive = "active"
2323
2424 let kActiveGlob = "active_all_contracts"
25+
26+let kDeprecated = "deprecated_"
2527
2628 let kCause = "shutdown_cause"
2729
2830 let kShareAssetId = "share_asset_id"
2931
3032 let kShareAssetSupply = "share_asset_supply"
3133
3234 let kFee = "commission"
3335
3436 let kDAppThresholdCoef = "dAppThresholdCoef"
3537
3638 let kUSDNAddress = "staking_usdnnsbt_address"
3739
3840 let kDiscounts = "discounts"
3941
4042 let kDiscountValues = "discount_values"
4143
4244 let kUserSwopInGov = "_SWOP_amount"
4345
4446 let kUserGSwopInGov = "_GSwop_amount"
4547
4648 let kAdminPubKey1 = "admin_pub_1"
4749
4850 let kAdminPubKey2 = "admin_pub_2"
4951
5052 let kAdminPubKey3 = "admin_pub_3"
5153
5254 let kAdminInvokePubKey = "admin_invoke_pub"
5355
5456 let kMoneyBoxAddress = "money_box_address"
5557
5658 let kGovAddress = "governance_address"
5759
5860 let kVotingAddress = "voting_address"
5961
6062 let kFarmingAddress = "farming_address"
6163
6264 let kLPFarmingAddress = "lp_farming"
6365
6466 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
6567
6668 func getBase58FromOracle (key) = match getString(oracle, key) {
6769 case string: String =>
6870 fromBase58String(string)
6971 case nothing =>
7072 throw((key + "is empty"))
7173 }
7274
7375
7476 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7577
7678 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7779
7880 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7981
8082 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8183
8284 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8385
8486 let govAddress = Address(getBase58FromOracle(kGovAddress))
8587
8688 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8789
8890 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
8991
9092 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9193
9294 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9395
94-let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
96+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
9597
9698 let stakingAssets = [toBase58String(USDN)]
9799
98100 let active = getBooleanValue(this, kActive)
99101
100102 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
103+
104+let deprecatedPool = valueOrElse(getBoolean(oracle, (kDeprecated + toString(this))), false)
101105
102106 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
103107
104108 let shareSupply = getIntegerValue(this, kShareAssetSupply)
105109
106110 let feeScale6 = 1000000
107111
108112 let fee = getIntegerValue(this, kFee)
109113
110114 let feeGovernance = fraction(40, feeScale6, 100)
111115
112116 let initial_A = getIntegerValue(this, "initial_A")
113117
114118 let future_A = getIntegerValue(this, "future_A")
115119
116120 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
117121
118122 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
119123
120124 let assetIds = split(getStringValue(this, kAssets), ",")
121125
122126 let nCoins = size(assetIds)
123127
124128 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
125129
126130
127131 func throwIsActive () = throw("DApp is already active")
128132
129133
130134 func isActive () = if (if (active)
131135 then activeGlob
132136 else false)
133137 then unit
134138 else throw("DApp is inactive at this moment")
139+
140+
141+func isDepricated () = if (!(deprecatedPool))
142+ then unit
143+ else throw("Pool is deprecated. Only withdraw action allowed.")
135144
136145
137146 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
138147 then unit
139148 else throw("Only admin can call this function")
140149
141150
142151 func isSelfCall (i) = if ((this == i.caller))
143152 then unit
144153 else throw("Only contract itself can call this function")
145154
146155
147156 let big2 = toBigInt(2)
148157
149158 let iter10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
150159
151160 let iter15 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
152161
153162 let iter16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
154163
155164 let blockTimestamp = height
156165
157166 func assert (a) = if (a)
158167 then false
159168 else true
160169
161170
162171 func calculateFeeDiscount (userAddr) = {
163172 let user = match userAddr {
164173 case u: Address =>
165174 toString(u)
166175 case u: String =>
167176 u
168177 case _ =>
169178 throw("Unknow type of user Addr")
170179 }
171180 let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), 0)
172181 let gSwopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), swopAmount)
173182 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
174183 let discounts = split(getStringValue(oracle, kDiscounts), ",")
175184 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
176185 then (parseIntValue(discountValues[1]) > gSwopAmount)
177186 else false)
178187 then (feeScale6 - parseIntValue(discounts[0]))
179188 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
180189 then (parseIntValue(discountValues[2]) > gSwopAmount)
181190 else false)
182191 then (feeScale6 - parseIntValue(discounts[1]))
183192 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
184193 then (parseIntValue(discountValues[3]) > gSwopAmount)
185194 else false)
186195 then (feeScale6 - parseIntValue(discounts[2]))
187196 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
188197 then (parseIntValue(discountValues[4]) > gSwopAmount)
189198 else false)
190199 then (feeScale6 - parseIntValue(discounts[3]))
191200 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
192201 then (feeScale6 - parseIntValue(discounts[4]))
193202 else feeScale6
194203 }
195204
196205
197206 func _A () = {
198207 let t1 = future_A_time
199208 let A1 = future_A
200209 if ((t1 > blockTimestamp))
201210 then {
202211 let A0 = initial_A
203212 let t0 = initial_A_time
204213 if ((A1 > A0))
205214 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
206215 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
207216 }
208217 else A1
209218 }
210219
211220
212221 func _xp () = {
213222 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
214223
215224 let $l = assetIds
216225 let $s = size($l)
217226 let $acc0 = nil
218227 func $f0_1 ($a,$i) = if (($i >= $s))
219228 then $a
220229 else assetBalances($a, $l[$i])
221230
222231 func $f0_2 ($a,$i) = if (($i >= $s))
223232 then $a
224233 else throw("List size exceeds 10")
225234
226235 $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)
227236 }
228237
229238
230239 func _xp_mem (xp) = xp
231240
232241
233242 func sumList (acc,element) = (acc + element)
234243
235244
236245 func get_D (xp,amp) = {
237246 let @ = invoke(this, "D", [xp, amp], nil)
238247 if ($isInstanceOf(@, "Int"))
239248 then @
240249 else throw(($getType(@) + " couldn't be cast to Int"))
241250 }
242251
243252
244253 func get_D_internal (xp,amp) = {
245254 let S = {
246255 let $l = xp
247256 let $s = size($l)
248257 let $acc0 = 0
249258 func $f0_1 ($a,$i) = if (($i >= $s))
250259 then $a
251260 else sumList($a, $l[$i])
252261
253262 func $f0_2 ($a,$i) = if (($i >= $s))
254263 then $a
255264 else throw("List size exceeds 10")
256265
257266 $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)
258267 }
259268 if ((S == 0))
260269 then 0
261270 else {
262271 let Ann = (amp * nCoins)
263272 let AnnS = (toBigInt(Ann) * toBigInt(S))
264273 let Ann1 = toBigInt((Ann - 1))
265274 func Dproc (acc,i) = if ((acc._2 == true))
266275 then acc
267276 else {
268277 let Dprev = acc._1
269278 func D_PProc (D_P,i) = if ((nCoins > i))
270279 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
271280 else D_P
272281
273282 let D_P = {
274283 let $l = iter10
275284 let $s = size($l)
276285 let $acc0 = Dprev
277286 func $f1_1 ($a,$i) = if (($i >= $s))
278287 then $a
279288 else D_PProc($a, $l[$i])
280289
281290 func $f1_2 ($a,$i) = if (($i >= $s))
282291 then $a
283292 else throw("List size exceeds 10")
284293
285294 $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)
286295 }
287296 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
288297 if ((D > Dprev))
289298 then if ((1 >= toInt((D - Dprev))))
290299 then $Tuple2(D, true)
291300 else $Tuple2(D, false)
292301 else if ((1 >= toInt((Dprev - D))))
293302 then $Tuple2(D, true)
294303 else $Tuple2(D, false)
295304 }
296305
297- let $t065826648 = {
306+ let $t068206886 = {
298307 let $l = iter15
299308 let $s = size($l)
300309 let $acc0 = $Tuple2(toBigInt(S), false)
301310 func $f1_1 ($a,$i) = if (($i >= $s))
302311 then $a
303312 else Dproc($a, $l[$i])
304313
305314 func $f1_2 ($a,$i) = if (($i >= $s))
306315 then $a
307316 else throw("List size exceeds 15")
308317
309318 $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)
310319 }
311- let D = $t065826648._1
312- let finished = $t065826648._2
320+ let D = $t068206886._1
321+ let finished = $t068206886._2
313322 if ((finished == false))
314323 then throw(("get_D() not finished with " + toString(D)))
315324 else toInt(D)
316325 }
317326 }
318327
319328
320329 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
321330
322331
323332 func getY (in,out,x,xp_) = if (assert((in != out)))
324333 then throw("same coin")
325334 else if (assert(if ((out >= 0))
326335 then (in >= 0)
327336 else false))
328337 then throw("below zero")
329338 else if (assert(if ((nCoins > out))
330339 then (nCoins > in)
331340 else false))
332341 then throw("above N_COINS")
333342 else {
334343 let amp = _A()
335344 let D = get_D(xp_, amp)
336345 let Ann = (amp * nCoins)
337346 func S_c (acc,i) = {
338- let $t072197236 = acc
339- let S_ = $t072197236._1
340- let c = $t072197236._2
347+ let $t074577474 = acc
348+ let S_ = $t074577474._1
349+ let c = $t074577474._2
341350 let x_ = if ((in == i))
342351 then x
343352 else xp_[i]
344353 if (if ((i != out))
345354 then (nCoins > i)
346355 else false)
347356 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
348357 else $Tuple2(S_, c)
349358 }
350359
351- let $t074447499 = {
360+ let $t076827737 = {
352361 let $l = iter10
353362 let $s = size($l)
354363 let $acc0 = $Tuple2(0, toBigInt(D))
355364 func $f0_1 ($a,$i) = if (($i >= $s))
356365 then $a
357366 else S_c($a, $l[$i])
358367
359368 func $f0_2 ($a,$i) = if (($i >= $s))
360369 then $a
361370 else throw("List size exceeds 10")
362371
363372 $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)
364373 }
365- let S_ = $t074447499._1
366- let c_ = $t074447499._2
374+ let S_ = $t076827737._1
375+ let c_ = $t076827737._2
367376 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
368377 let bD = toBigInt(((S_ + (D / Ann)) - D))
369378 func y_proc (acc,_i) = if ((acc._2 == true))
370379 then acc
371380 else {
372381 let y_prev = acc._1
373382 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
374383 if ((y > y_prev))
375384 then if ((1 >= toInt((y - y_prev))))
376385 then $Tuple2(y, true)
377386 else $Tuple2(y, false)
378387 else if ((1 >= toInt((y_prev - y))))
379388 then $Tuple2(y, true)
380389 else $Tuple2(y, false)
381390 }
382391
383- let $t079818048 = {
392+ let $t082198286 = {
384393 let $l = iter16
385394 let $s = size($l)
386395 let $acc0 = $Tuple2(toBigInt(D), false)
387396 func $f1_1 ($a,$i) = if (($i >= $s))
388397 then $a
389398 else y_proc($a, $l[$i])
390399
391400 func $f1_2 ($a,$i) = if (($i >= $s))
392401 then $a
393402 else throw("List size exceeds 16")
394403
395404 $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)
396405 }
397- let y = $t079818048._1
398- let finished = $t079818048._2
406+ let y = $t082198286._1
407+ let finished = $t082198286._2
399408 if ((finished == false))
400409 then throw(("getY() not finished with " + toString(y)))
401410 else toInt(y)
402411 }
403412
404413
405414 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
406415 then throw("i below zero")
407416 else if (assert((nCoins > in)))
408417 then throw("i above N_COINS")
409418 else {
410419 let Ann = (A_ * nCoins)
411420 func S_c (acc,i) = {
412- let $t084278444 = acc
413- let S_ = $t084278444._1
414- let c = $t084278444._2
421+ let $t086658682 = acc
422+ let S_ = $t086658682._1
423+ let c = $t086658682._2
415424 let x_ = if (if ((in != i))
416425 then (nCoins > i)
417426 else false)
418427 then xp[i]
419428 else 0
420429 if (if ((nCoins > i))
421430 then (in != i)
422431 else false)
423432 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
424433 else $Tuple2(S_, c)
425434 }
426435
427- let $t086648719 = {
436+ let $t089028957 = {
428437 let $l = iter10
429438 let $s = size($l)
430439 let $acc0 = $Tuple2(0, toBigInt(D))
431440 func $f0_1 ($a,$i) = if (($i >= $s))
432441 then $a
433442 else S_c($a, $l[$i])
434443
435444 func $f0_2 ($a,$i) = if (($i >= $s))
436445 then $a
437446 else throw("List size exceeds 10")
438447
439448 $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)
440449 }
441- let S_ = $t086648719._1
442- let c_ = $t086648719._2
450+ let S_ = $t089028957._1
451+ let c_ = $t089028957._2
443452 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
444453 let bD = toBigInt(((S_ + (D / Ann)) - D))
445454 func y_D_proc (acc,i) = if ((acc._2 == true))
446455 then acc
447456 else {
448457 let y_prev = acc._1
449458 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
450459 if ((y > y_prev))
451460 then if ((1 >= toInt((y - y_prev))))
452461 then $Tuple2(y, true)
453462 else $Tuple2(y, false)
454463 else if ((1 >= toInt((y_prev - y))))
455464 then $Tuple2(y, true)
456465 else $Tuple2(y, false)
457466 }
458467
459- let $t092029271 = {
468+ let $t094409509 = {
460469 let $l = iter16
461470 let $s = size($l)
462471 let $acc0 = $Tuple2(toBigInt(D), false)
463472 func $f1_1 ($a,$i) = if (($i >= $s))
464473 then $a
465474 else y_D_proc($a, $l[$i])
466475
467476 func $f1_2 ($a,$i) = if (($i >= $s))
468477 then $a
469478 else throw("List size exceeds 16")
470479
471480 $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)
472481 }
473- let y = $t092029271._1
474- let finished = $t092029271._2
482+ let y = $t094409509._1
483+ let finished = $t094409509._2
475484 if ((finished == false))
476485 then throw(("get_y_D() not finished with " + toString(y)))
477486 else toInt(y)
478487 }
479488
480489
481490 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
482491 let feeDiscount = calculateFeeDiscount(caller)
483492 let amp = _A()
484493 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
485494 let total_supply = shareSupply
486495 let D0 = get_D(xp, amp)
487496 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
488497 let new_y = get_y_D(amp, i, xp, D1)
489498 let dy_0 = (xp[i] - new_y)
490499 func xp_reduced_proc (acc,xp_j) = {
491- let $t099129941 = acc
492- let xp_reduced = $t099129941._1
493- let index = $t099129941._2
500+ let $t01015010179 = acc
501+ let xp_reduced = $t01015010179._1
502+ let index = $t01015010179._2
494503 let dx_expected = if ((index == i))
495504 then (fraction(xp_j, D1, D0) - new_y)
496505 else (xp_j - fraction(xp_j, D1, D0))
497506 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
498507 }
499508
500- let $t01020310267 = {
509+ let $t01044110505 = {
501510 let $l = xp
502511 let $s = size($l)
503512 let $acc0 = $Tuple2(nil, 0)
504513 func $f0_1 ($a,$i) = if (($i >= $s))
505514 then $a
506515 else xp_reduced_proc($a, $l[$i])
507516
508517 func $f0_2 ($a,$i) = if (($i >= $s))
509518 then $a
510519 else throw("List size exceeds 10")
511520
512521 $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)
513522 }
514- let xp_reduced = $t01020310267._1
515- let index = $t01020310267._2
523+ let xp_reduced = $t01044110505._1
524+ let index = $t01044110505._2
516525 let xp_reduced_i = xp_reduced[i]
517526 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
518527 $Tuple2(dy, (dy_0 - dy))
519528 }
520529
521530
522531 func getStrAssetId (assetId) = match assetId {
523532 case id: ByteVector =>
524533 toBase58String(id)
525534 case waves: Unit =>
526535 "WAVES"
527536 case _ =>
528537 throw("Match error")
529538 }
530539
531540
532541 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
533542 then $Tuple2("lockNeutrino", stakingUSDNAddress)
534543 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
535544
536545
537546 func calcStakingParams (stake,amount,assetId) = if (stake)
538547 then {
539- let $t01083110897 = calcStakingFuncAndAddres(stake, assetId)
540- let call = $t01083110897._1
541- let stakingAddr = $t01083110897._2
548+ let $t01106911135 = calcStakingFuncAndAddres(stake, assetId)
549+ let call = $t01106911135._1
550+ let stakingAddr = $t01106911135._2
542551 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
543552 }
544553 else {
545- let $t01098311049 = calcStakingFuncAndAddres(stake, assetId)
546- let call = $t01098311049._1
547- let stakingAddr = $t01098311049._2
554+ let $t01122111287 = calcStakingFuncAndAddres(stake, assetId)
555+ let call = $t01122111287._1
556+ let stakingAddr = $t01122111287._2
548557 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
549558 }
550559
551560
552561 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
553562 then {
554- let $t01123611338 = calcStakingParams(true, amount, fromBase58String(assetIdString))
555- let call = $t01123611338._1
556- let addr = $t01123611338._2
557- let params = $t01123611338._3
558- let payments = $t01123611338._4
563+ let $t01147411576 = calcStakingParams(true, amount, fromBase58String(assetIdString))
564+ let call = $t01147411576._1
565+ let addr = $t01147411576._2
566+ let params = $t01147411576._3
567+ let payments = $t01147411576._4
559568 invoke(addr, call, params, payments)
560569 }
561570 else 0
562571
563572
564573 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
565574 then {
566- let $t01152311626 = calcStakingParams(false, amount, fromBase58String(assetIdString))
567- let call = $t01152311626._1
568- let addr = $t01152311626._2
569- let params = $t01152311626._3
570- let payments = $t01152311626._4
575+ let $t01176111864 = calcStakingParams(false, amount, fromBase58String(assetIdString))
576+ let call = $t01176111864._1
577+ let addr = $t01176111864._2
578+ let params = $t01176111864._3
579+ let payments = $t01176111864._4
571580 invoke(addr, call, params, payments)
572581 }
573582 else 0
574583
575584
576585 func stakedAmount (assetId) = {
577586 let stakedAmountCalculated = match assetId {
578587 case aId: ByteVector =>
579588 if ((aId == USDN))
580589 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
581590 else 0
582591 case _: Unit =>
583592 0
584593 case _ =>
585594 throw("Match error")
586595 }
587596 match stakedAmountCalculated {
588597 case i: Int =>
589598 i
590599 case _ =>
591600 0
592601 }
593602 }
594603
595604
596605 func checkSuspicious () = {
597606 let contractBalances = _xp()
598607 func checkBalance (acc,assetId) = {
599- let $t01223712262 = acc
600- let suspicious = $t01223712262._1
601- let i = $t01223712262._2
608+ let $t01247512500 = acc
609+ let suspicious = $t01247512500._1
610+ let i = $t01247512500._2
602611 if (suspicious)
603612 then $Tuple2(suspicious, i)
604613 else {
605614 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
606615 if ((contractBalances[i] > aBalance))
607616 then $Tuple2(true, i)
608617 else $Tuple2(false, (i + 1))
609618 }
610619 }
611620
612621 let $l = assetIds
613622 let $s = size($l)
614623 let $acc0 = $Tuple2(false, 0)
615624 func $f0_1 ($a,$i) = if (($i >= $s))
616625 then $a
617626 else checkBalance($a, $l[$i])
618627
619628 func $f0_2 ($a,$i) = if (($i >= $s))
620629 then $a
621630 else throw("List size exceeds 10")
622631
623632 $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)
624633 }
625634
626635
627636 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
628637
629638
630639 func returnPayments (caller,payments) = {
631640 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
632641
633642 let $l = payments
634643 let $s = size($l)
635644 let $acc0 = nil
636645 func $f0_1 ($a,$i) = if (($i >= $s))
637646 then $a
638647 else parsePayments($a, $l[$i])
639648
640649 func $f0_2 ($a,$i) = if (($i >= $s))
641650 then $a
642651 else throw("List size exceeds 10")
643652
644653 $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)
645654 }
646655
647656
648657 func checkDAppThreshold (newBalances) = {
649658 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
650659 let thresholdScale = 10000
651660 let maxBalance = max(newBalances)
652661 let minBalance = min(newBalances)
653662 let ratio = fraction(maxBalance, thresholdScale, minBalance)
654663 if ((ratio > (dAppThresholdCoef * thresholdScale)))
655664 then throw("New balance in assets of the DApp is less than threshold")
656665 else false
657666 }
658667
659668
660669 func checkCoins (assetIds) = {
661670 let coins = split(assetIds, ",")
662671 if ((size(coins) > 10))
663672 then throw("To many coins, max coins size 10")
664673 else {
665674 func checkCoin (error,assetId) = {
666675 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
667676 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
668677 if ((decimals != DECIMALS))
669678 then throw("wrong decimals")
670679 else false
671680 }
672681
673682 let $l = coins
674683 let $s = size($l)
675684 let $acc0 = false
676685 func $f0_1 ($a,$i) = if (($i >= $s))
677686 then $a
678687 else checkCoin($a, $l[$i])
679688
680689 func $f0_2 ($a,$i) = if (($i >= $s))
681690 then $a
682691 else throw("List size exceeds 10")
683692
684693 $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)
685694 }
686695 }
687696
688697
689698 func calcWithdraw (msg,minAmounts,unlockAmount) = {
690699 let suspicious = checkSuspicious()
691700 if (suspicious._1)
692701 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
693702 else {
694703 let pmtAmount = if ((size(msg.payments) > 0))
695704 then if ((size(msg.payments) != 1))
696705 then throw("size(payments) != 1")
697706 else {
698707 let pmtAssetId = msg.payments[0].assetId
699708 if ((shareAssetId != pmtAssetId))
700709 then throw("unknown payment token")
701710 else msg.payments[0].amount
702711 }
703712 else 0
704713 let withdrawAmount = (pmtAmount + unlockAmount)
705714 func calcScriptActions (acc,balance) = {
706- let $t01467814706 = acc
707- let scriptActions = $t01467814706._1
708- let i = $t01467814706._2
715+ let $t01491614944 = acc
716+ let scriptActions = $t01491614944._1
717+ let i = $t01491614944._2
709718 let wAmount = fraction(balance, withdrawAmount, shareSupply)
710719 if (assert((wAmount >= minAmounts[i])))
711720 then throw("Withdrawal resulted in fewer coins than expected")
712721 else {
713722 let us = unstake(wAmount, assetIds[i])
714723 if ((us == us))
715724 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
716725 else throw("Strict value is not equal to itself.")
717726 }
718727 }
719728
720- let $t01519515263 = {
729+ let $t01543315501 = {
721730 let $l = _xp()
722731 let $s = size($l)
723732 let $acc0 = $Tuple2(nil, 0)
724733 func $f0_1 ($a,$i) = if (($i >= $s))
725734 then $a
726735 else calcScriptActions($a, $l[$i])
727736
728737 func $f0_2 ($a,$i) = if (($i >= $s))
729738 then $a
730739 else throw("List size exceeds 10")
731740
732741 $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)
733742 }
734- let scriptActions = $t01519515263._1
735- let i = $t01519515263._2
743+ let scriptActions = $t01543315501._1
744+ let i = $t01543315501._2
736745 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
737746 }
738747 }
739748
740749
741750 func calcWithdrawOneCoinEntries (msg,tokenOut,minAmount,unlockAmount) = {
742751 let suspicious = checkSuspicious()
743752 if (suspicious._1)
744753 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
745754 else {
746755 let pmtAmount = if ((size(msg.payments) > 0))
747756 then {
748757 let pmtAssetId = msg.payments[0].assetId
749758 if ((shareAssetId != pmtAssetId))
750759 then throw("unknown payment token")
751760 else msg.payments[0].amount
752761 }
753762 else 0
754763 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
755764 let tokenOutB58 = fromBase58String(tokenOut)
756765 let withdrawAmount = (pmtAmount + unlockAmount)
757766 let xp = _xp()
758- let $t01612516212 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
759- let dy = $t01612516212._1
760- let dy_fee = $t01612516212._2
767+ let $t01636316450 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
768+ let dy = $t01636316450._1
769+ let dy_fee = $t01636316450._2
761770 if (assert((dy >= minAmount)))
762771 then throw("Not enough coins removed")
763772 else {
764773 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
765774 let dy_and_fee = (dy + dy_fee)
766775 func makeNewBalances (acc,tokenBalance) = {
767- let $t01647016496 = acc
768- let newBalances = $t01647016496._1
769- let i = $t01647016496._2
776+ let $t01670816734 = acc
777+ let newBalances = $t01670816734._1
778+ let i = $t01670816734._2
770779 if ((i == outIndex))
771780 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
772781 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
773782 }
774783
775- let $t01666316724 = {
784+ let $t01690116962 = {
776785 let $l = xp
777786 let $s = size($l)
778787 let $acc0 = $Tuple2(nil, 0)
779788 func $f0_1 ($a,$i) = if (($i >= $s))
780789 then $a
781790 else makeNewBalances($a, $l[$i])
782791
783792 func $f0_2 ($a,$i) = if (($i >= $s))
784793 then $a
785794 else throw("List size exceeds 10")
786795
787796 $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)
788797 }
789- let newBalances = $t01666316724._1
790- let v = $t01666316724._2
798+ let newBalances = $t01690116962._1
799+ let v = $t01690116962._2
791800 if (checkDAppThreshold(newBalances))
792801 then throw()
793802 else {
794803 let us = unstake(dy_and_fee, tokenOut)
795804 if ((us == us))
796805 then {
797806 let lpFees = (dy_fee - governanceFees)
798807 let airdrop = if ((lpFees > 0))
799808 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
800809 else 0
801810 if ((airdrop == airdrop))
802811 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))]
803812 else throw("Strict value is not equal to itself.")
804813 }
805814 else throw("Strict value is not equal to itself.")
806815 }
807816 }
808817 }
809818 }
810819
811820
812821 @Callable(msg)
813822 func D (xp,amp) = {
814823 let D = get_D_internal(xp, amp)
815824 $Tuple2([IntegerEntry("D", D)], D)
816825 }
817826
818827
819828
820829 @Callable(msg)
821830 func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
822831 then throw("Already initialized")
823832 else if ((0 >= _A))
824833 then throw("Amp must be must > 0")
825834 else if ((0 >= _dAppThresholdCoef))
826835 then throw("dApp Threshold Coef must be > 0")
827836 else {
828837 let shareName = "s_Multi_USD"
829838 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
830839 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
831840 let tokenId = calculateAssetId(issueToken)
832841 if (checkCoins(assetIds))
833842 then throw()
834843 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]
835844 }
836845
837846
838847
839848 @Callable(msg)
840-func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), {
849+func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), valueOrElse(isDepricated(), {
841850 let amp = _A()
842851 let xp = _xp()
843852 let D0 = if ((shareSupply == 0))
844853 then 0
845854 else getDMem(xp, amp)
846- let $t01886419118 = if (if ((lockType > 0))
855+ let $t01913119385 = if (if ((lockType > 0))
847856 then (msg.payments[(size(msg.payments) - 1)].assetId == unit)
848857 else false)
849858 then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
850859 else $Tuple2(msg.payments, nil)
851- let payments = $t01886419118._1
852- let lockFee = $t01886419118._2
860+ let payments = $t01913119385._1
861+ let lockFee = $t01913119385._2
853862 let paymentsSize = size(payments)
854863 func validPayments (n) = if ((paymentsSize > nCoins))
855864 then throw(("payments size > " + toString(nCoins)))
856865 else if ((1 > paymentsSize))
857866 then throw("payments size < 1")
858867 else if (if ((shareSupply == 0))
859868 then (nCoins != paymentsSize)
860869 else false)
861870 then throw("initial deposit requires all coins")
862871 else {
863872 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
864873 then true
865874 else throw("Invalid asset in payment")
866875
867876 let $l = payments
868877 let $s = size($l)
869878 let $acc0 = false
870879 func $f0_1 ($a,$i) = if (($i >= $s))
871880 then $a
872881 else paymantValid($a, $l[$i])
873882
874883 func $f0_2 ($a,$i) = if (($i >= $s))
875884 then $a
876885 else throw("List size exceeds 10")
877886
878887 $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)
879888 }
880889
881890 if (!(validPayments(paymentsSize)))
882891 then throw()
883892 else {
884893 let suspicious = checkSuspicious()
885894 if (suspicious._1)
886895 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
887896 else {
888897 func parsePayments (acc,assetId) = {
889- let $t01998820014 = acc
890- let newBalances = $t01998820014._1
891- let i = $t01998820014._2
898+ let $t02025520281 = acc
899+ let newBalances = $t02025520281._1
900+ let i = $t02025520281._2
892901 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
893902 then (newBalance + payment.amount)
894903 else newBalance
895904
896905 let newBalace = {
897906 let $l = payments
898907 let $s = size($l)
899908 let $acc0 = xp[i]
900909 func $f0_1 ($a,$i) = if (($i >= $s))
901910 then $a
902911 else parsePayment($a, $l[$i])
903912
904913 func $f0_2 ($a,$i) = if (($i >= $s))
905914 then $a
906915 else throw("List size exceeds 10")
907916
908917 $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)
909918 }
910919 $Tuple2((newBalances :+ newBalace), (i + 1))
911920 }
912921
913- let $t02036420431 = {
922+ let $t02063120698 = {
914923 let $l = assetIds
915924 let $s = size($l)
916925 let $acc0 = $Tuple2(nil, 0)
917926 func $f0_1 ($a,$i) = if (($i >= $s))
918927 then $a
919928 else parsePayments($a, $l[$i])
920929
921930 func $f0_2 ($a,$i) = if (($i >= $s))
922931 then $a
923932 else throw("List size exceeds 10")
924933
925934 $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)
926935 }
927- let newBalances = $t02036420431._1
928- let k = $t02036420431._2
936+ let newBalances = $t02063120698._1
937+ let k = $t02063120698._2
929938 if (checkDAppThreshold(newBalances))
930939 then throw()
931940 else {
932941 let D1 = getDMem(newBalances, amp)
933942 if (assert((D1 > D0)))
934943 then throw("D1 > D0")
935944 else {
936945 let feeDiscount = calculateFeeDiscount(msg.caller)
937946 func calcScriptActions (acc,newBalance) = {
938- let $t02075120792 = acc
939- let invBalances = $t02075120792._1
940- let scriptActions = $t02075120792._2
941- let i = $t02075120792._3
947+ let $t02101821059 = acc
948+ let invBalances = $t02101821059._1
949+ let scriptActions = $t02101821059._2
950+ let i = $t02101821059._3
942951 if ((shareSupply > 0))
943952 then {
944953 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
945954 let fees = {
946955 let idealBalance = fraction(D1, xp[i], D0)
947956 let difference = if ((idealBalance > newBalance))
948957 then (idealBalance - newBalance)
949958 else (newBalance - idealBalance)
950959 fraction(_fee, difference, feeScale6)
951960 }
952961 let governanceFees = fraction(fees, feeGovernance, feeScale6)
953962 let finalBalance = (newBalance - fees)
954963 let invariantBalance = (newBalance - fees)
955964 let pmt = (newBalance - xp[i])
956965 let lpFees = (fees - governanceFees)
957966 let inv = if ((pmt > 0))
958967 then stake((pmt - fees), assetIds[i])
959968 else unstake(fees, assetIds[i])
960969 if ((inv == inv))
961970 then {
962971 let airdrop = if ((lpFees > 0))
963972 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
964973 else 0
965974 if ((airdrop == airdrop))
966975 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
967976 else throw("Strict value is not equal to itself.")
968977 }
969978 else throw("Strict value is not equal to itself.")
970979 }
971980 else {
972981 let inv = stake(newBalance, assetIds[i])
973982 if ((inv == inv))
974983 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
975984 else throw("Strict value is not equal to itself.")
976985 }
977986 }
978987
979- let $t02249722585 = {
988+ let $t02276422852 = {
980989 let $l = newBalances
981990 let $s = size($l)
982991 let $acc0 = $Tuple3(nil, nil, 0)
983992 func $f1_1 ($a,$i) = if (($i >= $s))
984993 then $a
985994 else calcScriptActions($a, $l[$i])
986995
987996 func $f1_2 ($a,$i) = if (($i >= $s))
988997 then $a
989998 else throw("List size exceeds 10")
990999
9911000 $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)
9921001 }
993- let invBalances = $t02249722585._1
994- let scriptActions = $t02249722585._2
1002+ let invBalances = $t02276422852._1
1003+ let scriptActions = $t02276422852._2
9951004 let D2 = getDMem(invBalances, amp)
9961005 let mint_amount = if ((shareSupply == 0))
9971006 then D1
9981007 else fraction(shareSupply, (D2 - D0), D0)
9991008 if (assert((mint_amount >= minMintAmount)))
10001009 then throw("Slippage screwed you")
10011010 else if (stakeFarming)
10021011 then {
10031012 let re = invoke(this, "reissueShare", [mint_amount], nil)
10041013 if ((re == re))
10051014 then {
10061015 let s = invoke(farmingAddress, "lockShareTokensFromPool", [msg.caller.bytes, toString(this), lockType], ([AttachedPayment(shareAssetId, mint_amount)] ++ lockFee))
10071016 if ((s == s))
10081017 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
10091018 else throw("Strict value is not equal to itself.")
10101019 }
10111020 else throw("Strict value is not equal to itself.")
10121021 }
10131022 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
10141023 }
10151024 }
10161025 }
10171026 }
1018- })
1027+ }))
10191028
10201029
10211030
10221031 @Callable(msg)
10231032 func calcMintAmount (newBalances,user) = {
10241033 let amp = _A()
10251034 let xp = _xp()
10261035 let D1 = getDMem(newBalances, amp)
10271036 if ((shareSupply == 0))
10281037 then $Tuple2(nil, D1)
10291038 else {
10301039 let D0 = getDMem(xp, amp)
10311040 let feeDiscount = calculateFeeDiscount(user)
10321041 func calcInvBalances (acc,newBalance) = {
1033- let $t02386123887 = acc
1034- let invBalances = $t02386123887._1
1035- let i = $t02386123887._2
1042+ let $t02413024156 = acc
1043+ let invBalances = $t02413024156._1
1044+ let i = $t02413024156._2
10361045 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
10371046 let fees = {
10381047 let idealBalance = fraction(D1, xp[i], D0)
10391048 let difference = if ((idealBalance > newBalance))
10401049 then (idealBalance - newBalance)
10411050 else (newBalance - idealBalance)
10421051 fraction(_fee, difference, feeScale6)
10431052 }
10441053 let invariantBalance = (newBalance - fees)
10451054 $Tuple2((invBalances :+ invariantBalance), (i + 1))
10461055 }
10471056
1048- let $t02448924559 = {
1057+ let $t02475824828 = {
10491058 let $l = newBalances
10501059 let $s = size($l)
10511060 let $acc0 = $Tuple2(nil, 0)
10521061 func $f0_1 ($a,$i) = if (($i >= $s))
10531062 then $a
10541063 else calcInvBalances($a, $l[$i])
10551064
10561065 func $f0_2 ($a,$i) = if (($i >= $s))
10571066 then $a
10581067 else throw("List size exceeds 10")
10591068
10601069 $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)
10611070 }
1062- let invBalances = $t02448924559._1
1063- let k = $t02448924559._2
1071+ let invBalances = $t02475824828._1
1072+ let k = $t02475824828._2
10641073 let D2 = getDMem(invBalances, amp)
10651074 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
10661075 $Tuple2(nil, mintAmount)
10671076 }
10681077 }
10691078
10701079
10711080
10721081 @Callable(msg)
10731082 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
10741083
10751084
10761085
10771086 @Callable(msg)
10781087 func getDy (assetFrom,assetTo,dx,userAddress) = {
10791088 let xp = _xp()
10801089 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
10811090 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
10821091 let x = (xp[fromIndex] + dx)
10831092 let y = getY(fromIndex, toIndex, x, xp)
10841093 let dy = ((xp[toIndex] - y) - 1)
10851094 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
10861095 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
10871096 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
10881097 }
10891098
10901099
10911100
10921101 @Callable(msg)
1093-func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1102+func exchange (tokenOut,min_dy) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
10941103 then throw("size(payments) != 1")
10951104 else {
10961105 let suspicious = checkSuspicious()
10971106 if (suspicious._1)
10981107 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10991108 else {
11001109 let payment = msg.payments[0]
11011110 let tokenIn = getStrAssetId(payment.assetId)
11021111 let tokenOutB58 = fromBase58String(tokenOut)
11031112 let dx = payment.amount
11041113 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
11051114 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11061115 let xp = _xp()
11071116 let x = (xp[fromIndex] + dx)
11081117 let y = getY(fromIndex, toIndex, x, xp)
11091118 let _dy = ((xp[toIndex] - y) - 1)
11101119 let feeDiscount = calculateFeeDiscount(msg.originCaller)
11111120 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
11121121 let dy = (_dy - _fee)
11131122 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
11141123 if (assert((dy >= min_dy)))
11151124 then throw("Exchange resulted in fewer coins than expected")
11161125 else {
11171126 func makeNewBalances (acc,tokenBalance) = {
1118- let $t02660026626 = acc
1119- let newBalances = $t02660026626._1
1120- let i = $t02660026626._2
1127+ let $t02699827024 = acc
1128+ let newBalances = $t02699827024._1
1129+ let i = $t02699827024._2
11211130 if ((i == fromIndex))
11221131 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
11231132 else if ((i == toIndex))
11241133 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
11251134 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11261135 }
11271136
1128- let $t02687726938 = {
1137+ let $t02730727368 = {
11291138 let $l = xp
11301139 let $s = size($l)
11311140 let $acc0 = $Tuple2(nil, 0)
11321141 func $f0_1 ($a,$i) = if (($i >= $s))
11331142 then $a
11341143 else makeNewBalances($a, $l[$i])
11351144
11361145 func $f0_2 ($a,$i) = if (($i >= $s))
11371146 then $a
11381147 else throw("List size exceeds 10")
11391148
11401149 $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)
11411150 }
1142- let newBalances = $t02687726938._1
1143- let i = $t02687726938._2
1151+ let newBalances = $t02730727368._1
1152+ let i = $t02730727368._2
11441153 if (checkDAppThreshold(newBalances))
11451154 then throw()
11461155 else {
11471156 let s = stake(payment.amount, getStrAssetId(payment.assetId))
11481157 if ((s == s))
11491158 then {
11501159 let us = unstake(_dy, tokenOut)
11511160 if ((us == us))
11521161 then {
11531162 let lpFees = (_fee - governanceFees)
11541163 let airdrop = if ((lpFees > 0))
11551164 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11561165 else 0
11571166 if ((airdrop == airdrop))
11581167 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
11591168 else throw("Strict value is not equal to itself.")
11601169 }
11611170 else throw("Strict value is not equal to itself.")
11621171 }
11631172 else throw("Strict value is not equal to itself.")
11641173 }
11651174 }
11661175 }
1167- })
1176+ }))
11681177
11691178
11701179
11711180 @Callable(msg)
11721181 func withdraw (minAmounts) = valueOrElse(isActive(), calcWithdraw(msg, minAmounts, 0))
11731182
11741183
11751184
11761185 @Callable(msg)
11771186 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
11781187 then throw("Unlock amount must be positive")
11791188 else {
11801189 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
11811190 if ((unlock == unlock))
11821191 then calcWithdraw(msg, minAmounts, unlockAmount)
11831192 else throw("Strict value is not equal to itself.")
11841193 })
11851194
11861195
11871196
11881197 @Callable(msg)
11891198 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = if ((0 >= tokenAmount))
11901199 then throw("Amount must be positive")
11911200 else {
11921201 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11931202 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
11941203 }
11951204
11961205
11971206
11981207 @Callable(msg)
1199-func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1208+func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
12001209 then throw("size(payments) != 1")
1201- else calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, 0))
1210+ else calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, 0)))
12021211
12031212
12041213
12051214 @Callable(msg)
1206-func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 > unlockAmount))
1215+func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((0 > unlockAmount))
12071216 then throw("Unlock amount must be positive")
12081217 else {
12091218 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
12101219 if ((unlock == unlock))
12111220 then calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, unlockAmount)
12121221 else throw("Strict value is not equal to itself.")
1213- })
1222+ }))
12141223
12151224
12161225
12171226 @Callable(msg)
12181227 func A () = $Tuple2(nil, _A())
12191228
12201229
12211230
12221231 @Callable(msg)
12231232 func getVirtualPrice () = {
12241233 let D = get_D(_xp(), _A())
12251234 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12261235 }
12271236
12281237
12291238
12301239 @Callable(msg)
12311240 func calcTokenAmount (amounts,deposit) = {
12321241 let amp = _A()
12331242 let balances = _xp()
12341243 let D0 = getDMem(balances, amp)
12351244 func calcNewBalances (acc,balance) = {
1236- let $t02951529541 = acc
1237- let newBalances = $t02951529541._1
1238- let i = $t02951529541._2
1245+ let $t03015830184 = acc
1246+ let newBalances = $t03015830184._1
1247+ let i = $t03015830184._2
12391248 let newBalance = (balance + (if (deposit)
12401249 then amounts[i]
12411250 else -(amounts[i])))
12421251 $Tuple2((newBalances :+ newBalance), (i + 1))
12431252 }
12441253
12451254 let newBalances = ( let $l = balances
12461255 let $s = size($l)
12471256 let $acc0 = $Tuple2(nil, 0)
12481257 func $f0_1 ($a,$i) = if (($i >= $s))
12491258 then $a
12501259 else calcNewBalances($a, $l[$i])
12511260
12521261 func $f0_2 ($a,$i) = if (($i >= $s))
12531262 then $a
12541263 else throw("List size exceeds 10")
12551264
12561265 $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
12571266 let D1 = getDMem(newBalances, amp)
12581267 let diff = if (deposit)
12591268 then (D1 - D0)
12601269 else (D0 - D1)
12611270 $Tuple2(nil, fraction(diff, shareSupply, D0))
12621271 }
12631272
12641273
12651274
12661275 @Callable(msg)
12671276 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12681277 then throw("too often")
12691278 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12701279 then throw("insufficient time")
12711280 else {
12721281 let _initial_A = _A()
12731282 if (assert(if ((_futureA > 0))
12741283 then (MAX_A > _futureA)
12751284 else false))
12761285 then throw("out of base range")
12771286 else if (assert(if (if ((_futureA >= _initial_A))
12781287 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12791288 else false)
12801289 then true
12811290 else if ((_initial_A > _futureA))
12821291 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12831292 else false))
12841293 then throw("out of range")
12851294 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12861295 }))
12871296
12881297
12891298
12901299 @Callable(msg)
12911300 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
12921301 let currentA = _A()
12931302 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
12941303 }))
12951304
12961305
12971306
12981307 @Callable(msg)
12991308 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13001309 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13011310 else suspend("Paused by admin"))
13021311
13031312
13041313
13051314 @Callable(msg)
13061315 func activate () = valueOrElse(isAdminCall(msg), if (active)
13071316 then throwIsActive()
13081317 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13091318
13101319
13111320
13121321 @Callable(msg)
1313-func takeIntoAccountExtraFunds () = valueOrElse(isActive(), if ((msg.caller != moneyBoxAddress))
1314- then throw("Only the wallet can call this function")
1315- else {
1316- let balances = _xp()
1317- func takeExtraFunds (acc,assetId) = {
1318- let $t03188331901 = acc
1319- let sum = $t03188331901._1
1320- let i = $t03188331901._2
1321- let tokenB58 = fromBase58String(assetId)
1322- let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
1323- let enrollAmount = (rBalance - balances[i])
1324- if ((0 > enrollAmount))
1325- then suspend(("Enroll amount negative for asset" + assetId))
1326- else {
1327- let airdrop = if ((enrollAmount > 0))
1328- then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
1329- else 0
1330- if ((airdrop == airdrop))
1331- then $Tuple2((sum + enrollAmount), (i + 1))
1332- else throw("Strict value is not equal to itself.")
1322+func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
1323+ let claim = if (containsElement(assetIds, toBase58String(USDN)))
1324+ then invoke(stakingUSDNAddress, "claimRewards", nil, nil)
1325+ else 0
1326+ if ((claim == claim))
1327+ then if ((msg.caller != moneyBoxAddress))
1328+ then throw("Only the wallet can call this function")
1329+ else {
1330+ let balances = _xp()
1331+ func takeExtraFunds (acc,assetId) = {
1332+ let $t03276932787 = acc
1333+ let sum = $t03276932787._1
1334+ let i = $t03276932787._2
1335+ let tokenB58 = fromBase58String(assetId)
1336+ let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
1337+ let enrollAmount = (rBalance - balances[i])
1338+ if ((0 > enrollAmount))
1339+ then suspend(("Enroll amount negative for asset" + assetId))
1340+ else {
1341+ let airdrop = if ((enrollAmount > 0))
1342+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
1343+ else 0
1344+ if ((airdrop == airdrop))
1345+ then $Tuple2((sum + enrollAmount), (i + 1))
1346+ else throw("Strict value is not equal to itself.")
1347+ }
13331348 }
1334- }
13351349
1336- let k = {
1337- let $l = assetIds
1338- let $s = size($l)
1339- let $acc0 = $Tuple2(0, 0)
1340- func $f0_1 ($a,$i) = if (($i >= $s))
1341- then $a
1342- else takeExtraFunds($a, $l[$i])
1350+ let k = {
1351+ let $l = assetIds
1352+ let $s = size($l)
1353+ let $acc0 = $Tuple2(0, 0)
1354+ func $f0_1 ($a,$i) = if (($i >= $s))
1355+ then $a
1356+ else takeExtraFunds($a, $l[$i])
13431357
1344- func $f0_2 ($a,$i) = if (($i >= $s))
1345- then $a
1346- else throw("List size exceeds 10")
1358+ func $f0_2 ($a,$i) = if (($i >= $s))
1359+ then $a
1360+ else throw("List size exceeds 10")
13471361
1348- $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)
1349- }
1350- if ((k._1 == 0))
1351- then throw("No money to take")
1352- else nil
1353- })
1362+ $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)
1363+ }
1364+ if ((k._1 == 0))
1365+ then throw("No money to take")
1366+ else nil
1367+ }
1368+ else throw("Strict value is not equal to itself.")
1369+ })
13541370
13551371
13561372 @Verifier(tx)
13571373 func verify () = {
13581374 let multiSignedByAdmins = {
13591375 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13601376 then 1
13611377 else 0
13621378 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13631379 then 1
13641380 else 0
13651381 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13661382 then 1
13671383 else 0
13681384 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13691385 }
13701386 match tx {
13711387 case inv: InvokeScriptTransaction =>
13721388 let callTakeIntoAccount = if ((inv.dApp == this))
13731389 then (inv.function == "takeIntoAccountExtraFunds")
13741390 else false
13751391 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13761392 then true
13771393 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13781394 then true
13791395 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13801396 then true
13811397 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
13821398 if (if (callTakeIntoAccount)
13831399 then signedByAdmin
13841400 else false)
13851401 then true
13861402 else multiSignedByAdmins
13871403 case _ =>
13881404 multiSignedByAdmins
13891405 }
13901406 }
13911407

github/deemru/w8io/3ef1775 
302.40 ms