tx · 4AuVnjMa3L4kzTpKR6YDskDiEcWCKdMEKcxwMQw6KTaA

3MwstV5kwngSR99soeemi1AV7VXiZXRHVnX:  -0.03500000 Waves

2022.08.31 13:57 [2208529] smart account 3MwstV5kwngSR99soeemi1AV7VXiZXRHVnX > SELF 0.00000000 Waves

{ "type": 13, "id": "4AuVnjMa3L4kzTpKR6YDskDiEcWCKdMEKcxwMQw6KTaA", "fee": 3500000, "feeAssetId": null, "timestamp": 1661943419616, "version": 2, "chainId": 84, "sender": "3MwstV5kwngSR99soeemi1AV7VXiZXRHVnX", "senderPublicKey": "7kYMgWAteuXyagbkwuPuripHt5mbmodGS8SuEhyXSgBY", "proofs": [ "4VVTNpQokKShF9iyrCqcuZTEog9zWwcqTMKPZo9Gtj1g3c8fMycpntf7YX9UkK8CjRhZe17ww56CgzrGnUfQBSP1", "5udq6Ewha8KweaeRMpNijDkL9sHkBQqXZeZYD3K31kc2zLXVnA5k2Q5Uc7n7yC8aFjAb44mhx4xBmfDvtevvFSvV" ], "script": "base64:BgJXCAISBAoCEQESBQoDCAEEEgQKAgEEEgMKAQESBgoECAgBCBIECgIIARIECgIRARIFCgMBCAgSBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBWwAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB2tBc3NldHMCCWFzc2V0X2lkcwANa0Fzc2V0QmFsYW5jZQIIX2JhbGFuY2UAB2tBY3RpdmUCBmFjdGl2ZQAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQAEWtTaGFyZUFzc2V0U3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkABGtGZWUCCmNvbW1pc3Npb24AEmtEQXBwVGhyZXNob2xkQ29lZgIRZEFwcFRocmVzaG9sZENvZWYADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwAPa0Zhcm1pbmdBZGRyZXNzAg9mYXJtaW5nX2FkZHJlc3MABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwASY2FwTW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEBGgFUXmlqF+mqIH0+j69gu0TO8ei+zt5lnFLzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAMc2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFDWtTaGFyZUFzc2V0SWQAC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrU2hhcmVBc3NldFN1cHBseQAJZmVlU2NhbGU2AMCEPQADZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQRrRmVlAA1mZWVHb3Zlcm5hbmNlCQBrAwAoBQlmZWVTY2FsZTYAZAAJaW5pdGlhbF9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglpbml0aWFsX0EACGZ1dHVyZV9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAghmdXR1cmVfQQAOaW5pdGlhbF9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIOaW5pdGlhbF9BX3RpbWUAAAANZnV0dXJlX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg1mdXR1cmVfQV90aW1lAAAACGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tBc3NldHMCASwABm5Db2lucwkAkAMBBQhhc3NldElkcwEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENdGhyb3dJc0FjdGl2ZQAJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQhpc0FjdGl2ZQADBQZhY3RpdmUFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAOYmxvY2tUaW1lc3RhbXAFBmhlaWdodAEGYXNzZXJ0AQFhAwUBYQcGARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIdXNlckFkZHIECnN3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEFCHVzZXJBZGRyBQ5rVXNlclN3b3BJbkdvdgAABA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEFDWZ1dHVyZV9BX3RpbWUEAkExBQhmdXR1cmVfQQMJAGYCBQJ0MQUOYmxvY2tUaW1lc3RhbXAEAkEwBQlpbml0aWFsX0EEAnQwBQ5pbml0aWFsX0FfdGltZQMJAGYCBQJBMQUCQTAJAGQCBQJBMAkAaQIJAGgCCQBlAgUCQTEFAkEwCQBlAgUOYmxvY2tUaW1lc3RhbXAFAnQwCQBlAgUCdDEFAnQwCQBlAgUCQTAJAGkCCQBoAgkAZQIFAkEwBQJBMQkAZQIFDmJsb2NrVGltZXN0YW1wBQJ0MAkAZQIF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X3JlZHVjZWRfaQkAkQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMTExNjExMTgyCQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTExNjExMTgyAl8xBAtzdGFraW5nQWRkcggFDSR0MDExMTE2MTExODICXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDExMjY4MTEzMzQJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExMjY4MTEzMzQCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTEyNjgxMTMzNAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExNTIxMTE2MjMJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExNTIxMTE2MjMCXzEEBGFkZHIIBQ0kdDAxMTUyMTExNjIzAl8yBAZwYXJhbXMIBQ0kdDAxMTUyMTExNjIzAl8zBAhwYXltZW50cwgFDSR0MDExNTIxMTE2MjMCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTgwODExOTExCQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTgwODExOTExAl8xBARhZGRyCAUNJHQwMTE4MDgxMTkxMQJfMgQGcGFyYW1zCAUNJHQwMTE4MDgxMTkxMQJfMwQIcGF5bWVudHMIBQ0kdDAxMTgwODExOTExAl80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjUyMjEyNTQ3BQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjUyMjEyNTQ3Al8xBAFpCAUNJHQwMTI1MjIxMjU0NwJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmNoZWNrREFwcFRocmVzaG9sZAELbmV3QmFsYW5jZXMEEWRBcHBUaHJlc2hvbGRDb2VmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUSa0RBcHBUaHJlc2hvbGRDb2VmAhhObyBkQXBwVGhyZXNob2xkQ29lZiBrZXkEDnRocmVzaG9sZFNjYWxlAJBOBAptYXhCYWxhbmNlCQCWAwEFC25ld0JhbGFuY2VzBAptaW5CYWxhbmNlCQCXAwEFC25ld0JhbGFuY2VzBAVyYXRpbwkAawMFCm1heEJhbGFuY2UFDnRocmVzaG9sZFNjYWxlBQptaW5CYWxhbmNlAwkAZgIFBXJhdGlvCQBoAgURZEFwcFRocmVzaG9sZENvZWYFDnRocmVzaG9sZFNjYWxlCQACAQI4TmV3IGJhbGFuY2UgaW4gYXNzZXRzIG9mIHRoZSBEQXBwIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQHAQpjaGVja0NvaW5zAQhhc3NldElkcwQFY29pbnMJALUJAgUIYXNzZXRJZHMCASwKAQljaGVja0NvaW4CBWVycm9yB2Fzc2V0SWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQUHYXNzZXRJZAkArAICAhJmcm9tQmFzZTU4U3RyaW5nOiAFB2Fzc2V0SWQECGRlY2ltYWxzCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFBWFzc2V0CQCsAgICC2Fzc2V0SW5mbzogBQdhc3NldElkCGRlY2ltYWxzAwkBAiE9AgUIZGVjaW1hbHMFCERFQ0lNQUxTCQACAQIOd3JvbmcgZGVjaW1hbHMHCgACJGwFBWNvaW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWNoZWNrQ29pbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8RA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDCGFzc2V0SWRzAl9BDGZpcnN0SGFydmVzdAMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAQJc2hhcmVOYW1lAgtzX011bHRpX1VTRAQQc2hhcmVEZXNjcmlwdGlvbgkArAICAkJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgTXVsdGlTdGFibGUgVVNEIHBvb2wgYXQgYWRkcmVzcyAJAKUIAQUEdGhpcwQKaXNzdWVUb2tlbgkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24AAAAGBgQHdG9rZW5JZAkAuAgBBQppc3N1ZVRva2VuAwkBCmNoZWNrQ29pbnMBBQhhc3NldElkcwkBBXRocm93AAQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgAPCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDBQxmaXJzdEhhcnZlc3QJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFCWJhc2VFbnRyeQNtc2cBDGFkZExpcXVpZGl0eQINbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMAMJAAACBQtzaGFyZVN1cHBseQAAAAAJAQdnZXRETWVtAgUCeHAFA2FtcAQIcGF5bWVudHMIBQNtc2cIcGF5bWVudHMEAW4JAJADAQUIcGF5bWVudHMKAQ12YWxpZFBheW1lbnRzAQFuAwkAZgIFAW4FBm5Db2lucwkAAgEJAKwCAgIQcGF5bWVudHMgc2l6ZSA+IAkApAMBBQZuQ29pbnMDCQBmAgABBQFuCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUBbgcJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zCgEMcGF5bWFudFZhbGlkAgNhY2MHcGF5bWVudAMJAQ9jb250YWluc0VsZW1lbnQCBQhhc3NldElkcwkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBgkAAgECGEludmFsaWQgYXNzZXQgaW4gcGF5bWVu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aXB0QWN0aW9ucwgFDSR0MDE3NDQ1MTc0ODYCXzIEAWkIBQ0kdDAxNzQ0NTE3NDg2Al8zAwkAZgIFC3NoYXJlU3VwcGx5AAAEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEDmdvdmVybmFuY2VGZWVzCQBrAwUEZmVlcwUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BAxmaW5hbEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQ5nb3Zlcm5hbmNlRmVlcwQQaW52YXJpYW50QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEAnVzCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUCdXMFAnVzCQCVCgMJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQxmaW5hbEJhbGFuY2UFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBQpuZXdCYWxhbmNlCQDNCAIFDXNjcmlwdEFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFCm5ld0JhbGFuY2UJAGQCBQFpAAEEDSR0MDE4ODIzMTg5MTEKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQLaW52QmFsYW5jZXMIBQ0kdDAxODgyMzE4OTExAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTg4MjMxODkxMQJfMgQCRDIJAQdnZXRETWVtAgULaW52QmFsYW5jZXMFA2FtcAQLbWludF9hbW91bnQDCQAAAgULc2hhcmVTdXBwbHkAAAUCRDEJAGsDBQtzaGFyZVN1cHBseQkAZQIFAkQyBQJEMAUCRDADCQEGYXNzZXJ0AQkAZwIFC21pbnRfYW1vdW50BQ1taW5NaW50QW1vdW50CQACAQIUU2xpcHBhZ2Ugc2NyZXdlZCB5b3UDBQxzdGFrZUZhcm1pbmcEAnJlCQD8BwQFBHRoaXMCDHJlaXNzdWVTaGFyZQkAzAgCBQttaW50X2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUCcmUFAnJlBAFzCQD8BwQFDmZhcm1pbmdBZGRyZXNzAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQFA25pbAMJAAACBQFzBQFzCQDNCAIFDXNjcmlwdEFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFC21pbnRfYW1vdW50BQxzaGFyZUFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50BQNuaWwDbXNnAQxyZWlzc3VlU2hhcmUBBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQNtc2cJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFBmFtb3VudAYFA25pbANtc2cBBWdldER5BAlhc3NldEZyb20HYXNzZXRUbwJkeAt1c2VyQWRkcmVzcwQCeHAJAQNfeHAABAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUJYXNzZXRGcm9tAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB2Fzc2V0VG8CEXVua25vd24gdG9rZW4gb3V0BAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBAJkeQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCQEHQWRkcmVzcwEJANkEAQULdXNlckFkZHJlc3MEBF9mZWUJAGsDCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQJkeQUJZmVlU2NhbGU2CQCUCgIFA25pbAkAlAoCCQBlAgUCZHkFBF9mZWUFBF9mZWUDbXNnAQhleGNoYW5nZQIIdG9rZW5PdXQGbWluX2R5CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAAEB3Rva2VuSW4JAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAmR4CAUHcGF5bWVudAZhbW91bnQECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQd0b2tlbkluAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQCeHAJAQNfeHAABAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBANfZHkJAGUCCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUBeQABBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIEBF9mZWUJAGsDBQNfZHkJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFCWZlZVNjYWxlNgQCZHkJAGUCBQNfZHkFBF9mZWUEDmdvdmVybmFuY2VGZWVzCQBrAwUEX2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2AwkBBmFzc2VydAEJAGcCBQJkeQUGbWluX2R5CQACAQIuRXhjaGFuZ2UgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMjE2MjMyMTY0OQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDIxNjIzMjE2NDkCXzEEAWkIBQ0kdDAyMTYyMzIxNjQ5Al8yAwkAAAIFAWkFCWZyb21JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBkAgUMdG9rZW5CYWxhbmNlBQJkeAkAZAIFAWkAAQMJAAACBQFpBQd0b0luZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjE4OTkyMTk2MAoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjE4OTkyMTk2MAJfMQQBaQgFDSR0MDIxODk5MjE5NjACXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAXMJAQVzdGFrZQIIBQdwYXltZW50BmFtb3VudAkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkAwkAAAIFAXMFAXMEAnVzCQEHdW5zdGFrZQIJAGQCBQJkeQUEX2ZlZQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JbgUNa0Fzc2V0QmFsYW5jZQUBeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQh0b2tlbk91dAUNa0Fzc2V0QmFsYW5jZQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQJkeQUOZ292ZXJuYW5jZUZlZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFAmR5BQt0b2tlbk91dEI1OAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFDmdvdmVybmFuY2VGZWVzBQt0b2tlbk91dEI1OAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MJAGUCBQRfZmVlBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgFA25pbAkAlAoCBQJkeQULdG9rZW5PdXRCNTgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQh3aXRoZHJhdwIKbWluQW1vdW50cwx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbggFB3BheW1lbnQHYXNzZXRJZAMJAQIhPQIFB3Rva2VuSW4FDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4EB19hbW91bnQIBQdwYXltZW50BmFtb3VudAQMdG90YWxfc3VwcGx5BQtzaGFyZVN1cHBseQQGdW5sb2NrAwkAZgIFDHVubG9ja0Ftb3VudAAACQD8BwQFDmZhcm1pbmdBZGRyZXNzAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUHX2Ftb3VudAUMdW5sb2NrQW1vdW50CgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwdiYWxhbmNlBA0kdDAyMzM2NTIzMzkzBQNhY2MEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyMzM2NTIzMzkzAl8xBAFpCAUNJHQwMjMzNjUyMzM5MwJfMgQHd0Ftb3VudAkAawMFB2JhbGFuY2UFDndpdGhkcmF3QW1vdW50BQx0b3RhbF9zdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjM4ODMyMzk1MQoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQNc2NyaXB0QWN0aW9ucwgFDSR0MDIzODgzMjM5NTECXzEEAWkIBQ0kdDAyMzg4MzIzOTUxAl8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFDndpdGhkcmF3QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQ53aXRoZHJhd0Ftb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgMIdG9rZW5PdXQJbWluQW1vdW50DHVubG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCAUHcGF5bWVudAdhc3NldElkAwkBAiE9AgUHdG9rZW5JbgUMc2hhcmVBc3NldElkCQACAQINdW5rbm93biB0b2tlbgQIb3V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAxfdG9rZW5BbW91bnQIBQdwYXltZW50BmFtb3VudAQGdW5sb2NrAwkAZgIFDHVubG9ja0Ftb3VudAAACQD8BwQFDmZhcm1pbmdBZGRyZXNzAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUMX3Rva2VuQW1vdW50BQx1bmxvY2tBbW91bnQEAnhwCQEDX3hwAAQNJHQwMjUxODIyNTI2MwkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFDndpdGhkcmF3QW1vdW50BQhvdXRJbmRleAgFA21zZwZjYWxsZXIEAmR5CAUNJHQwMjUxODIyNTI2MwJfMQQGZHlfZmVlCAUNJHQwMjUxODIyNTI2MwJfMgMJAQZhc3NlcnQBCQBnAgUCZHkFCW1pbkFtb3VudAkAAgECGE5vdCBlbm91Z2ggY29pbnMgcmVtb3ZlZAQOZ292ZXJuYW5jZUZlZXMJAGsDBQZkeV9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgQKZHlfYW5kX2ZlZQkAZAIFAmR5BQZkeV9mZWUKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDI1NTIxMjU1NDcFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNTUyMTI1NTQ3Al8xBAFpCAUNJHQwMjU1MjEyNTU0NwJfMgMJAAACBQFpBQhvdXRJbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQpkeV9hbmRfZmVlCQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjU3MTQyNTc3NQoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjU3MTQyNTc3NQJfMQQBaQgFDSR0MDI1NzE0MjU3NzUCXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAnVzCQEHdW5zdGFrZQIFCmR5X2FuZF9mZWUFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkJANkEAQUIdG9rZW5PdXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQkAZQIJAJEDAgUCeHAFAWkFCmR5X2FuZF9mZWUJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFDndpdGhkcmF3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQUIdG9rZW5PdXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUSY2FwTW9uZXlCb3hBZGRyZXNzCQBlAgUGZHlfZmVlBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBBQh0b2tlbk91dAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUOd2l0aGRyYXdBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBAUEACQCUCgIFA25pbAkBAl9BAANtc2cBD2dldFZpcnR1YWxQcmljZQAEAUQJAQVnZXRfRAIJAQNfeHAACQECX0EACQCUCgIFA25pbAkAawMFAUQFCVBSRUNJU0lPTgULc2hhcmVTdXBwbHkDbXNnAQ9jYWxjVG9rZW5BbW91bnQCB2Ftb3VudHMHZGVwb3NpdAQDYW1wCQECX0EABAhiYWxhbmNlcwkBA194cAAEAkQwCQEHZ2V0RE1lbQIFCGJhbGFuY2VzBQNhbXAKAQ9jYWxjTmV3QmFsYW5jZXMCA2FjYwdiYWxhbmNlBA0kdDAyNjczNjI2NzYyBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjY3MzYyNjc2MgJfMQQBaQgFDSR0MDI2NzM2MjY3NjICXzIECm5ld0JhbGFuY2UJAGQCBQdiYWxhbmNlAwUHZGVwb3NpdAkAkQMCBQdhbW91bnRzBQFpCQEBLQEJAJEDAgUHYW1vdW50cwUBaQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQpuZXdCYWxhbmNlCQBkAgUBaQABBAtuZXdCYWxhbmNlcwgKAAIkbAUIYmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPAl8xBAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wBARkaWZmAwUHZGVwb3NpdAkAZQIFAkQxBQJEMAkAZQIFAkQwBQJEMQkAlAoCBQNuaWwJAGsDBQRkaWZmBQtzaGFyZVN1cHBseQUCRDADbXNnAQVyYW1wQQIIX2Z1dHVyZUELX2Z1dHVyZVRpbWUJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQZhc3NlcnQBCQBnAgUOYmxvY2tUaW1lc3RhbXAJAGQCBQ5pbml0aWFsX0FfdGltZQUNTUlOX1JBTVBfVElNRQkAAgECCXRvbyBvZnRlbgMJAQZhc3NlcnQBCQBnAgULX2Z1dHVyZVRpbWUJAGQCBQ5ibG9ja1RpbWVzdGFtcAUNTUlOX1JBTVBfVElNRQkAAgECEWluc3VmZmljaWVudCB0aW1lBApfaW5pdGlhbF9BCQECX0EAAwkBBmFzc2VydAEDCQBmAgUIX2Z1dHVyZUEAAAkAZgIFBU1BWF9BBQhfZnV0dXJlQQcJAAIBAhFvdXQgb2YgYmFzZSByYW5nZQMJAQZhc3NlcnQBAwMJAGcCBQhfZnV0dXJlQQUKX2luaXRpYWxfQQkAZwIJAGgCBQpfaW5pdGlhbF9BBQxNQVhfQV9DSEFOR0UFCF9mdXR1cmVBBwYDCQBmAgUKX2luaXRpYWxfQQUIX2Z1dHVyZUEJAGcCCQBoAgUIX2Z1dHVyZUEFDE1BWF9BX0NIQU5HRQUKX2luaXRpYWxfQQcJAAIBAgxvdXQgb2YgcmFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUKX2luaXRpYWxfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCF9mdXR1cmVBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFC19mdXR1cmVUaW1lBQNuaWwDbXNnAQlzdG9wUmFtcEEACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cECGN1cnJlbnRBCQECX0EACQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUIY3VycmVudEEJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAFA25pbANtc2cBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4DbXNnAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMFBmFjdGl2ZQkBDXRocm93SXNBY3RpdmUACQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbANtc2cBGGtlZXBMaW1pdEZvckZpcnN0SGFydmVzdAEKc2hhcmVMaW1pdAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrU2hhcmVMaW1pdAUKc2hhcmVMaW1pdAUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBBNjYWxsVGFrZUludG9BY2NvdW50AwkAAAIIBQNpbnYEZEFwcAUEdGhpcwkAAAIIBQNpbnYIZnVuY3Rpb24CGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMHBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRFhZG1pblB1YktleUludm9rZQMDBRNjYWxsVGFrZUludG9BY2NvdW50BQ1zaWduZWRCeUFkbWluBwYFE211bHRpU2lnbmVkQnlBZG1pbnMFE211bHRpU2lnbmVkQnlBZG1pbnNrj+7c", "height": 2208529, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AC5nvQNEV3xTDZp4XrdVKkmYkKDXVsf7JrbU7A96AaCK Next: none Diff:
OldNewDifferences
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
9+
10+let DECIMALS = 6
911
1012 let MIN_RAMP_TIME = (86400 / 60)
1113
283285 else $Tuple2(D, false)
284286 }
285287
286- let $t066126724 = {
288+ let $t066296741 = {
287289 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
288290 let $s = size($l)
289291 let $acc0 = $Tuple2(toBigInt(S), false)
297299
298300 $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)
299301 }
300- let D = $t066126724._1
301- let finished = $t066126724._2
302+ let D = $t066296741._1
303+ let finished = $t066296741._2
302304 if ((finished == false))
303305 then throw(("get_D() not finished with " + toString(D)))
304306 else toInt(D)
324326 let D = get_D(xp_, amp)
325327 let Ann = (amp * nCoins)
326328 func S_c (acc,i) = {
327- let $t072957312 = acc
328- let S_ = $t072957312._1
329- let c = $t072957312._2
329+ let $t073127329 = acc
330+ let S_ = $t073127329._1
331+ let c = $t073127329._2
330332 let x_ = if ((in == i))
331333 then x
332334 else xp_[i]
337339 else $Tuple2(S_, c)
338340 }
339341
340- let $t075207621 = {
342+ let $t075377638 = {
341343 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
342344 let $s = size($l)
343345 let $acc0 = $Tuple2(0, toBigInt(D))
351353
352354 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
353355 }
354- let S_ = $t075207621._1
355- let c_ = $t075207621._2
356+ let S_ = $t075377638._1
357+ let c_ = $t075377638._2
356358 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
357359 let bD = toBigInt(((S_ + (D / Ann)) - D))
358360 func y_proc (acc,_i) = if ((acc._2 == true))
369371 else $Tuple2(y, false)
370372 }
371373
372- let $t081038220 = {
374+ let $t081208237 = {
373375 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
374376 let $s = size($l)
375377 let $acc0 = $Tuple2(toBigInt(D), false)
383385
384386 $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)
385387 }
386- let y = $t081038220._1
387- let finished = $t081038220._2
388+ let y = $t081208237._1
389+ let finished = $t081208237._2
388390 if ((finished == false))
389391 then throw(("getY() not finished with " + toString(y)))
390392 else toInt(y)
398400 else {
399401 let Ann = (A_ * nCoins)
400402 func S_c (acc,i) = {
401- let $t085998616 = acc
402- let S_ = $t085998616._1
403- let c = $t085998616._2
403+ let $t086168633 = acc
404+ let S_ = $t086168633._1
405+ let c = $t086168633._2
404406 let x_ = if (if ((in != i))
405407 then (nCoins > i)
406408 else false)
413415 else $Tuple2(S_, c)
414416 }
415417
416- let $t088368937 = {
418+ let $t088538954 = {
417419 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
418420 let $s = size($l)
419421 let $acc0 = $Tuple2(0, toBigInt(D))
427429
428430 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
429431 }
430- let S_ = $t088368937._1
431- let c_ = $t088368937._2
432+ let S_ = $t088538954._1
433+ let c_ = $t088538954._2
432434 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
433435 let bD = toBigInt(((S_ + (D / Ann)) - D))
434436 func y_D_proc (acc,i) = if ((acc._2 == true))
445447 else $Tuple2(y, false)
446448 }
447449
448- let $t094209539 = {
450+ let $t094379556 = {
449451 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
450452 let $s = size($l)
451453 let $acc0 = $Tuple2(toBigInt(D), false)
459461
460462 $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)
461463 }
462- let y = $t094209539._1
463- let finished = $t094209539._2
464+ let y = $t094379556._1
465+ let finished = $t094379556._2
464466 if ((finished == false))
465467 then throw(("get_y_D() not finished with " + toString(y)))
466468 else toInt(y)
477479 let new_y = get_y_D(amp, i, xp, D1)
478480 let dy_0 = (xp[i] - new_y)
479481 func xp_reduced_proc (acc,xp_j) = {
480- let $t01018010209 = acc
481- let xp_reduced = $t01018010209._1
482- let index = $t01018010209._2
482+ let $t01019710226 = acc
483+ let xp_reduced = $t01019710226._1
484+ let index = $t01019710226._2
483485 let dx_expected = if ((index == i))
484486 then (fraction(xp_j, D1, D0) - new_y)
485487 else (xp_j - fraction(xp_j, D1, D0))
486488 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
487489 }
488490
489- let $t01047110535 = {
491+ let $t01048810552 = {
490492 let $l = xp
491493 let $s = size($l)
492494 let $acc0 = $Tuple2(nil, 0)
500502
501503 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
502504 }
503- let xp_reduced = $t01047110535._1
504- let index = $t01047110535._2
505+ let xp_reduced = $t01048810552._1
506+ let index = $t01048810552._2
505507 let xp_reduced_i = xp_reduced[i]
506508 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
507509 $Tuple2(dy, (dy_0 - dy))
525527
526528 func calcStakingParams (stake,amount,assetId) = if (stake)
527529 then {
528- let $t01109911165 = calcStakingFuncAndAddres(stake, assetId)
529- let call = $t01109911165._1
530- let stakingAddr = $t01109911165._2
530+ let $t01111611182 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01111611182._1
532+ let stakingAddr = $t01111611182._2
531533 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
532534 }
533535 else {
534- let $t01125111317 = calcStakingFuncAndAddres(stake, assetId)
535- let call = $t01125111317._1
536- let stakingAddr = $t01125111317._2
536+ let $t01126811334 = calcStakingFuncAndAddres(stake, assetId)
537+ let call = $t01126811334._1
538+ let stakingAddr = $t01126811334._2
537539 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
538540 }
539541
540542
541543 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
542544 then {
543- let $t01150411606 = calcStakingParams(true, amount, fromBase58String(assetIdString))
544- let call = $t01150411606._1
545- let addr = $t01150411606._2
546- let params = $t01150411606._3
547- let payments = $t01150411606._4
545+ let $t01152111623 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546+ let call = $t01152111623._1
547+ let addr = $t01152111623._2
548+ let params = $t01152111623._3
549+ let payments = $t01152111623._4
548550 invoke(addr, call, params, payments)
549551 }
550552 else 0
552554
553555 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
554556 then {
555- let $t01179111894 = calcStakingParams(false, amount, fromBase58String(assetIdString))
556- let call = $t01179111894._1
557- let addr = $t01179111894._2
558- let params = $t01179111894._3
559- let payments = $t01179111894._4
557+ let $t01180811911 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558+ let call = $t01180811911._1
559+ let addr = $t01180811911._2
560+ let params = $t01180811911._3
561+ let payments = $t01180811911._4
560562 invoke(addr, call, params, payments)
561563 }
562564 else 0
585587 func checkSuspicious () = {
586588 let contractBalances = _xp()
587589 func checkBalance (acc,assetId) = {
588- let $t01250512530 = acc
589- let suspicious = $t01250512530._1
590- let i = $t01250512530._2
590+ let $t01252212547 = acc
591+ let suspicious = $t01252212547._1
592+ let i = $t01252212547._2
591593 if (suspicious)
592594 then $Tuple2(suspicious, i)
593595 else {
637639 func checkDAppThreshold (newBalances) = {
638640 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
639641 let thresholdScale = 10000
640- func iterAllBalances (acc,tokenBalance) = {
641- let $t01350913550 = acc
642- let thresholdError = $t01350913550._1
643- let cutedBalances = $t01350913550._2
644- func iterCutedBalances (checkRatio,checkedBalance) = {
645- let ratio = fraction(tokenBalance, thresholdScale, checkedBalance)
646- if (if ((ratio > (dAppThresholdCoef * thresholdScale)))
647- then true
648- else (fraction(1, thresholdScale, dAppThresholdCoef) > ratio))
649- then throw("New balance in assets of the DApp is less than threshold")
650- else false
651- }
642+ let maxBalance = max(newBalances)
643+ let minBalance = min(newBalances)
644+ let ratio = fraction(maxBalance, thresholdScale, minBalance)
645+ if ((ratio > (dAppThresholdCoef * thresholdScale)))
646+ then throw("New balance in assets of the DApp is less than threshold")
647+ else false
648+ }
652649
653- $Tuple2({
654- let $l = cutedBalances
655- let $s = size($l)
656- let $acc0 = thresholdError
657- func $f0_1 ($a,$i) = if (($i >= $s))
658- then $a
659- else iterCutedBalances($a, $l[$i])
660650
661- func $f0_2 ($a,$i) = if (($i >= $s))
662- then $a
663- else throw("List size exceeds 15")
664-
665- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
666- }, removeByIndex(cutedBalances, 0))
651+func checkCoins (assetIds) = {
652+ let coins = split(assetIds, ",")
653+ func checkCoin (error,assetId) = {
654+ let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
655+ let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
656+ if ((decimals != DECIMALS))
657+ then throw("wrong decimals")
658+ else false
667659 }
668660
669- let $t01407214175 = {
670- let $l = newBalances
671- let $s = size($l)
672- let $acc0 = $Tuple2(false, removeByIndex(newBalances, 0))
673- func $f0_1 ($a,$i) = if (($i >= $s))
674- then $a
675- else iterAllBalances($a, $l[$i])
661+ let $l = coins
662+ let $s = size($l)
663+ let $acc0 = false
664+ func $f0_1 ($a,$i) = if (($i >= $s))
665+ then $a
666+ else checkCoin($a, $l[$i])
676667
677- func $f0_2 ($a,$i) = if (($i >= $s))
678- then $a
679- else throw("List size exceeds 15")
668+ func $f0_2 ($a,$i) = if (($i >= $s))
669+ then $a
670+ else throw("List size exceeds 15")
680671
681- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
682- }
683- let thresholdError = $t01407214175._1
684- let b = $t01407214175._2
685- thresholdError
672+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
686673 }
687674
688675
695682
696683
697684 @Callable(msg)
698-func init (coins,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
685+func init (assetIds,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
699686 then throw("Already initialized")
700687 else {
701688 let shareName = "s_Multi_USD"
702689 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
703690 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
704691 let tokenId = calculateAssetId(issueToken)
705- let baseEntry = [StringEntry(kAssets, coins), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, 15), BooleanEntry(kActive, true), issueToken]
706- if (firstHarvest)
707- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
708- else baseEntry
692+ if (checkCoins(assetIds))
693+ then throw()
694+ else {
695+ let baseEntry = [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, 15), BooleanEntry(kActive, true), issueToken]
696+ if (firstHarvest)
697+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
698+ else baseEntry
699+ }
709700 }
710701
711702
755746 else {
756747 let paymentsSize = size(payments)
757748 func parsePayments (acc,assetId) = {
758- let $t01658116610 = acc
759- let newBalances = $t01658116610._1
760- let i = $t01658116610._2
761- let j = $t01658116610._3
749+ let $t01661916648 = acc
750+ let newBalances = $t01661916648._1
751+ let i = $t01661916648._2
752+ let j = $t01661916648._3
762753 if (if ((paymentsSize > j))
763754 then (getStrAssetId(payments[j].assetId) == assetId)
764755 else false)
771762 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
772763 }
773764
774- let $t01691617002 = {
765+ let $t01695417040 = {
775766 let $l = assetIds
776767 let $s = size($l)
777768 let $acc0 = $Tuple3(nil, 0, 0)
785776
786777 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
787778 }
788- let newBalances = $t01691617002._1
789- let k = $t01691617002._2
790- let parsedPayments = $t01691617002._3
779+ let newBalances = $t01695417040._1
780+ let k = $t01695417040._2
781+ let parsedPayments = $t01695417040._3
791782 if (((paymentsSize - 1) > parsedPayments))
792783 then throw("Incorect payments order")
793784 else if (checkDAppThreshold(newBalances))
799790 else {
800791 let feeDiscount = calculateFeeDiscount(msg.caller)
801792 func calcScriptActions (acc,newBalance) = {
802- let $t01740717448 = acc
803- let invBalances = $t01740717448._1
804- let scriptActions = $t01740717448._2
805- let i = $t01740717448._3
793+ let $t01744517486 = acc
794+ let invBalances = $t01744517486._1
795+ let scriptActions = $t01744517486._2
796+ let i = $t01744517486._3
806797 if ((shareSupply > 0))
807798 then {
808799 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
824815 else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
825816 }
826817
827- let $t01878518873 = {
818+ let $t01882318911 = {
828819 let $l = newBalances
829820 let $s = size($l)
830821 let $acc0 = $Tuple3(nil, nil, 0)
838829
839830 $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)
840831 }
841- let invBalances = $t01878518873._1
842- let scriptActions = $t01878518873._2
832+ let invBalances = $t01882318911._1
833+ let scriptActions = $t01882318911._2
843834 let D2 = getDMem(invBalances, amp)
844835 let mint_amount = if ((shareSupply == 0))
845836 then D1
913904 then throw("Exchange resulted in fewer coins than expected")
914905 else {
915906 func makeNewBalances (acc,tokenBalance) = {
916- let $t02158521611 = acc
917- let newBalances = $t02158521611._1
918- let i = $t02158521611._2
907+ let $t02162321649 = acc
908+ let newBalances = $t02162321649._1
909+ let i = $t02162321649._2
919910 if ((i == fromIndex))
920911 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
921912 else if ((i == toIndex))
923914 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
924915 }
925916
926- let $t02186121922 = {
917+ let $t02189921960 = {
927918 let $l = xp
928919 let $s = size($l)
929920 let $acc0 = $Tuple2(nil, 0)
937928
938929 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
939930 }
940- let newBalances = $t02186121922._1
941- let i = $t02186121922._2
931+ let newBalances = $t02189921960._1
932+ let i = $t02189921960._2
942933 if (checkDAppThreshold(newBalances))
943934 then throw()
944935 else {
980971 then {
981972 let withdrawAmount = (_amount + unlockAmount)
982973 func calcScriptActions (acc,balance) = {
983- let $t02332723355 = acc
984- let scriptActions = $t02332723355._1
985- let i = $t02332723355._2
974+ let $t02336523393 = acc
975+ let scriptActions = $t02336523393._1
976+ let i = $t02336523393._2
986977 let wAmount = fraction(balance, withdrawAmount, total_supply)
987978 if (assert((wAmount >= minAmounts[i])))
988979 then throw("Withdrawal resulted in fewer coins than expected")
994985 }
995986 }
996987
997- let $t02384523913 = {
988+ let $t02388323951 = {
998989 let $l = _xp()
999990 let $s = size($l)
1000991 let $acc0 = $Tuple2(nil, 0)
1008999
10091000 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10101001 }
1011- let scriptActions = $t02384523913._1
1012- let i = $t02384523913._2
1002+ let scriptActions = $t02388323951._1
1003+ let i = $t02388323951._2
10131004 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
10141005 }
10151006 else throw("Strict value is not equal to itself.")
10491040 then {
10501041 let withdrawAmount = (_tokenAmount + unlockAmount)
10511042 let xp = _xp()
1052- let $t02514425225 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1053- let dy = $t02514425225._1
1054- let dy_fee = $t02514425225._2
1043+ let $t02518225263 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1044+ let dy = $t02518225263._1
1045+ let dy_fee = $t02518225263._2
10551046 if (assert((dy >= minAmount)))
10561047 then throw("Not enough coins removed")
10571048 else {
10581049 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10591050 let dy_and_fee = (dy + dy_fee)
10601051 func makeNewBalances (acc,tokenBalance) = {
1061- let $t02548325509 = acc
1062- let newBalances = $t02548325509._1
1063- let i = $t02548325509._2
1052+ let $t02552125547 = acc
1053+ let newBalances = $t02552125547._1
1054+ let i = $t02552125547._2
10641055 if ((i == outIndex))
10651056 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10661057 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10671058 }
10681059
1069- let $t02567625737 = {
1060+ let $t02571425775 = {
10701061 let $l = xp
10711062 let $s = size($l)
10721063 let $acc0 = $Tuple2(nil, 0)
10801071
10811072 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10821073 }
1083- let newBalances = $t02567625737._1
1084- let i = $t02567625737._2
1074+ let newBalances = $t02571425775._1
1075+ let i = $t02571425775._2
10851076 if (checkDAppThreshold(newBalances))
10861077 then throw()
10871078 else {
11181109 let balances = _xp()
11191110 let D0 = getDMem(balances, amp)
11201111 func calcNewBalances (acc,balance) = {
1121- let $t02669826724 = acc
1122- let newBalances = $t02669826724._1
1123- let i = $t02669826724._2
1112+ let $t02673626762 = acc
1113+ let newBalances = $t02673626762._1
1114+ let i = $t02673626762._2
11241115 let newBalance = (balance + (if (deposit)
11251116 then amounts[i]
11261117 else -(amounts[i])))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
9+
10+let DECIMALS = 6
911
1012 let MIN_RAMP_TIME = (86400 / 60)
1113
1214 let kAssets = "asset_ids"
1315
1416 let kAssetBalance = "_balance"
1517
1618 let kActive = "active"
1719
1820 let kCause = "shutdown_cause"
1921
2022 let kShareAssetId = "share_asset_id"
2123
2224 let kShareAssetSupply = "share_asset_supply"
2325
2426 let kFee = "commission"
2527
2628 let kDAppThresholdCoef = "dAppThresholdCoef"
2729
2830 let kUSDNAddress = "staking_usdnnsbt_address"
2931
3032 let kDiscounts = "discounts"
3133
3234 let kDiscountValues = "discount_values"
3335
3436 let kUserSwopInGov = "_SWOP_amount"
3537
3638 let kFirstHarvest = "first_harvest"
3739
3840 let kFirstHarvestHeight = "first_harvest_height"
3941
4042 let kShareLimit = "share_limit_on_first_harvest"
4143
4244 let kBasePeriod = "base_period"
4345
4446 let kPeriodLength = "period_length"
4547
4648 let kStartHeight = "start_height"
4749
4850 let kAdminPubKey1 = "admin_pub_1"
4951
5052 let kAdminPubKey2 = "admin_pub_2"
5153
5254 let kAdminPubKey3 = "admin_pub_3"
5355
5456 let kAdminInvokePubKey = "admin_invoke_pub"
5557
5658 let kMoneyBoxAddress = "money_box_address"
5759
5860 let kGovAddress = "governance_address"
5961
6062 let kVotingAddress = "voting_address"
6163
6264 let kFarmingAddress = "farming_address"
6365
6466 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
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 capMoneyBoxAddress = Address(base58'3MxXHaGvmKQHH3kNrPBunhve1sDXf7M5RZt')
9395
9496 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
9597
9698 let stakingAssets = [toBase58String(USDN)]
9799
98100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
99101
100102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
101103
102104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
103105
104106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
105107
106108 let active = getBooleanValue(this, kActive)
107109
108110 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
109111
110112 let shareSupply = getIntegerValue(this, kShareAssetSupply)
111113
112114 let feeScale6 = 1000000
113115
114116 let fee = getIntegerValue(this, kFee)
115117
116118 let feeGovernance = fraction(40, feeScale6, 100)
117119
118120 let initial_A = getIntegerValue(this, "initial_A")
119121
120122 let future_A = getIntegerValue(this, "future_A")
121123
122124 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
123125
124126 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
125127
126128 let assetIds = split(getStringValue(this, kAssets), ",")
127129
128130 let nCoins = size(assetIds)
129131
130132 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
131133
132134
133135 func throwIsActive () = throw("DApp is already active")
134136
135137
136138 func isActive () = if (active)
137139 then unit
138140 else throw("DApp is inactive at this moment")
139141
140142
141143 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
142144 then unit
143145 else throw("Only admin can call this function")
144146
145147
146148 func isSelfCall (i) = if ((this == i.caller))
147149 then unit
148150 else throw("Only contract itself can call this function")
149151
150152
151153 let big2 = toBigInt(2)
152154
153155 let blockTimestamp = height
154156
155157 func assert (a) = if (a)
156158 then false
157159 else true
158160
159161
160162 func calculateFeeDiscount (userAddr) = {
161163 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
162164 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
163165 let discounts = split(getStringValue(oracle, kDiscounts), ",")
164166 if (if ((swopAmount >= parseIntValue(discountValues[0])))
165167 then (parseIntValue(discountValues[1]) > swopAmount)
166168 else false)
167169 then (feeScale6 - parseIntValue(discounts[0]))
168170 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
169171 then (parseIntValue(discountValues[2]) > swopAmount)
170172 else false)
171173 then (feeScale6 - parseIntValue(discounts[1]))
172174 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
173175 then (parseIntValue(discountValues[3]) > swopAmount)
174176 else false)
175177 then (feeScale6 - parseIntValue(discounts[2]))
176178 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
177179 then (parseIntValue(discountValues[4]) > swopAmount)
178180 else false)
179181 then (feeScale6 - parseIntValue(discounts[3]))
180182 else if ((swopAmount >= parseIntValue(discountValues[4])))
181183 then (feeScale6 - parseIntValue(discounts[4]))
182184 else feeScale6
183185 }
184186
185187
186188 func _A () = {
187189 let t1 = future_A_time
188190 let A1 = future_A
189191 if ((t1 > blockTimestamp))
190192 then {
191193 let A0 = initial_A
192194 let t0 = initial_A_time
193195 if ((A1 > A0))
194196 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
195197 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
196198 }
197199 else A1
198200 }
199201
200202
201203 func _xp () = {
202204 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
203205
204206 let $l = assetIds
205207 let $s = size($l)
206208 let $acc0 = nil
207209 func $f0_1 ($a,$i) = if (($i >= $s))
208210 then $a
209211 else assetBalances($a, $l[$i])
210212
211213 func $f0_2 ($a,$i) = if (($i >= $s))
212214 then $a
213215 else throw("List size exceeds 15")
214216
215217 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
216218 }
217219
218220
219221 func _xp_mem (xp) = xp
220222
221223
222224 func sumList (acc,element) = (acc + element)
223225
224226
225227 func get_D (xp,amp) = {
226228 let @ = invoke(this, "D", [xp, amp], nil)
227229 if ($isInstanceOf(@, "Int"))
228230 then @
229231 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
230232 }
231233
232234
233235 func get_D_internal (xp,amp) = {
234236 let S = {
235237 let $l = xp
236238 let $s = size($l)
237239 let $acc0 = 0
238240 func $f0_1 ($a,$i) = if (($i >= $s))
239241 then $a
240242 else sumList($a, $l[$i])
241243
242244 func $f0_2 ($a,$i) = if (($i >= $s))
243245 then $a
244246 else throw("List size exceeds 15")
245247
246248 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
247249 }
248250 if ((S == 0))
249251 then 0
250252 else {
251253 let Ann = (amp * nCoins)
252254 let AnnS = (toBigInt(Ann) * toBigInt(S))
253255 let Ann1 = toBigInt((Ann - 1))
254256 func Dproc (acc,i) = if ((acc._2 == true))
255257 then acc
256258 else {
257259 let Dprev = acc._1
258260 func D_PProc (D_P,i) = if ((nCoins > i))
259261 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
260262 else D_P
261263
262264 let D_P = {
263265 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
264266 let $s = size($l)
265267 let $acc0 = Dprev
266268 func $f1_1 ($a,$i) = if (($i >= $s))
267269 then $a
268270 else D_PProc($a, $l[$i])
269271
270272 func $f1_2 ($a,$i) = if (($i >= $s))
271273 then $a
272274 else throw("List size exceeds 15")
273275
274276 $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)
275277 }
276278 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
277279 if ((D > Dprev))
278280 then if ((1 >= toInt((D - Dprev))))
279281 then $Tuple2(D, true)
280282 else $Tuple2(D, false)
281283 else if ((1 >= toInt((Dprev - D))))
282284 then $Tuple2(D, true)
283285 else $Tuple2(D, false)
284286 }
285287
286- let $t066126724 = {
288+ let $t066296741 = {
287289 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
288290 let $s = size($l)
289291 let $acc0 = $Tuple2(toBigInt(S), false)
290292 func $f1_1 ($a,$i) = if (($i >= $s))
291293 then $a
292294 else Dproc($a, $l[$i])
293295
294296 func $f1_2 ($a,$i) = if (($i >= $s))
295297 then $a
296298 else throw("List size exceeds 15")
297299
298300 $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)
299301 }
300- let D = $t066126724._1
301- let finished = $t066126724._2
302+ let D = $t066296741._1
303+ let finished = $t066296741._2
302304 if ((finished == false))
303305 then throw(("get_D() not finished with " + toString(D)))
304306 else toInt(D)
305307 }
306308 }
307309
308310
309311 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
310312
311313
312314 func getY (in,out,x,xp_) = if (assert((in != out)))
313315 then throw("same coin")
314316 else if (assert(if ((out >= 0))
315317 then (in >= 0)
316318 else false))
317319 then throw("below zero")
318320 else if (assert(if ((nCoins > out))
319321 then (nCoins > in)
320322 else false))
321323 then throw("above N_COINS")
322324 else {
323325 let amp = _A()
324326 let D = get_D(xp_, amp)
325327 let Ann = (amp * nCoins)
326328 func S_c (acc,i) = {
327- let $t072957312 = acc
328- let S_ = $t072957312._1
329- let c = $t072957312._2
329+ let $t073127329 = acc
330+ let S_ = $t073127329._1
331+ let c = $t073127329._2
330332 let x_ = if ((in == i))
331333 then x
332334 else xp_[i]
333335 if (if ((i != out))
334336 then (nCoins > i)
335337 else false)
336338 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
337339 else $Tuple2(S_, c)
338340 }
339341
340- let $t075207621 = {
342+ let $t075377638 = {
341343 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
342344 let $s = size($l)
343345 let $acc0 = $Tuple2(0, toBigInt(D))
344346 func $f0_1 ($a,$i) = if (($i >= $s))
345347 then $a
346348 else S_c($a, $l[$i])
347349
348350 func $f0_2 ($a,$i) = if (($i >= $s))
349351 then $a
350352 else throw("List size exceeds 15")
351353
352354 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
353355 }
354- let S_ = $t075207621._1
355- let c_ = $t075207621._2
356+ let S_ = $t075377638._1
357+ let c_ = $t075377638._2
356358 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
357359 let bD = toBigInt(((S_ + (D / Ann)) - D))
358360 func y_proc (acc,_i) = if ((acc._2 == true))
359361 then acc
360362 else {
361363 let y_prev = acc._1
362364 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
363365 if ((y > y_prev))
364366 then if ((1 >= toInt((y - y_prev))))
365367 then $Tuple2(y, true)
366368 else $Tuple2(y, false)
367369 else if ((1 >= toInt((y_prev - y))))
368370 then $Tuple2(y, true)
369371 else $Tuple2(y, false)
370372 }
371373
372- let $t081038220 = {
374+ let $t081208237 = {
373375 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
374376 let $s = size($l)
375377 let $acc0 = $Tuple2(toBigInt(D), false)
376378 func $f1_1 ($a,$i) = if (($i >= $s))
377379 then $a
378380 else y_proc($a, $l[$i])
379381
380382 func $f1_2 ($a,$i) = if (($i >= $s))
381383 then $a
382384 else throw("List size exceeds 16")
383385
384386 $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)
385387 }
386- let y = $t081038220._1
387- let finished = $t081038220._2
388+ let y = $t081208237._1
389+ let finished = $t081208237._2
388390 if ((finished == false))
389391 then throw(("getY() not finished with " + toString(y)))
390392 else toInt(y)
391393 }
392394
393395
394396 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
395397 then throw("i below zero")
396398 else if (assert((nCoins > in)))
397399 then throw("i above N_COINS")
398400 else {
399401 let Ann = (A_ * nCoins)
400402 func S_c (acc,i) = {
401- let $t085998616 = acc
402- let S_ = $t085998616._1
403- let c = $t085998616._2
403+ let $t086168633 = acc
404+ let S_ = $t086168633._1
405+ let c = $t086168633._2
404406 let x_ = if (if ((in != i))
405407 then (nCoins > i)
406408 else false)
407409 then xp[i]
408410 else 0
409411 if (if ((nCoins > i))
410412 then (in != i)
411413 else false)
412414 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
413415 else $Tuple2(S_, c)
414416 }
415417
416- let $t088368937 = {
418+ let $t088538954 = {
417419 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
418420 let $s = size($l)
419421 let $acc0 = $Tuple2(0, toBigInt(D))
420422 func $f0_1 ($a,$i) = if (($i >= $s))
421423 then $a
422424 else S_c($a, $l[$i])
423425
424426 func $f0_2 ($a,$i) = if (($i >= $s))
425427 then $a
426428 else throw("List size exceeds 15")
427429
428430 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
429431 }
430- let S_ = $t088368937._1
431- let c_ = $t088368937._2
432+ let S_ = $t088538954._1
433+ let c_ = $t088538954._2
432434 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
433435 let bD = toBigInt(((S_ + (D / Ann)) - D))
434436 func y_D_proc (acc,i) = if ((acc._2 == true))
435437 then acc
436438 else {
437439 let y_prev = acc._1
438440 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
439441 if ((y > y_prev))
440442 then if ((1 >= toInt((y - y_prev))))
441443 then $Tuple2(y, true)
442444 else $Tuple2(y, false)
443445 else if ((1 >= toInt((y_prev - y))))
444446 then $Tuple2(y, true)
445447 else $Tuple2(y, false)
446448 }
447449
448- let $t094209539 = {
450+ let $t094379556 = {
449451 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
450452 let $s = size($l)
451453 let $acc0 = $Tuple2(toBigInt(D), false)
452454 func $f1_1 ($a,$i) = if (($i >= $s))
453455 then $a
454456 else y_D_proc($a, $l[$i])
455457
456458 func $f1_2 ($a,$i) = if (($i >= $s))
457459 then $a
458460 else throw("List size exceeds 16")
459461
460462 $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)
461463 }
462- let y = $t094209539._1
463- let finished = $t094209539._2
464+ let y = $t094379556._1
465+ let finished = $t094379556._2
464466 if ((finished == false))
465467 then throw(("get_y_D() not finished with " + toString(y)))
466468 else toInt(y)
467469 }
468470
469471
470472 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
471473 let feeDiscount = calculateFeeDiscount(caller)
472474 let amp = _A()
473475 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
474476 let total_supply = shareSupply
475477 let D0 = get_D(xp, amp)
476478 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
477479 let new_y = get_y_D(amp, i, xp, D1)
478480 let dy_0 = (xp[i] - new_y)
479481 func xp_reduced_proc (acc,xp_j) = {
480- let $t01018010209 = acc
481- let xp_reduced = $t01018010209._1
482- let index = $t01018010209._2
482+ let $t01019710226 = acc
483+ let xp_reduced = $t01019710226._1
484+ let index = $t01019710226._2
483485 let dx_expected = if ((index == i))
484486 then (fraction(xp_j, D1, D0) - new_y)
485487 else (xp_j - fraction(xp_j, D1, D0))
486488 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
487489 }
488490
489- let $t01047110535 = {
491+ let $t01048810552 = {
490492 let $l = xp
491493 let $s = size($l)
492494 let $acc0 = $Tuple2(nil, 0)
493495 func $f0_1 ($a,$i) = if (($i >= $s))
494496 then $a
495497 else xp_reduced_proc($a, $l[$i])
496498
497499 func $f0_2 ($a,$i) = if (($i >= $s))
498500 then $a
499501 else throw("List size exceeds 15")
500502
501503 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
502504 }
503- let xp_reduced = $t01047110535._1
504- let index = $t01047110535._2
505+ let xp_reduced = $t01048810552._1
506+ let index = $t01048810552._2
505507 let xp_reduced_i = xp_reduced[i]
506508 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
507509 $Tuple2(dy, (dy_0 - dy))
508510 }
509511
510512
511513 func getStrAssetId (assetId) = match assetId {
512514 case id: ByteVector =>
513515 toBase58String(id)
514516 case waves: Unit =>
515517 "WAVES"
516518 case _ =>
517519 throw("Match error")
518520 }
519521
520522
521523 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
522524 then $Tuple2("lockNeutrino", stakingUSDNAddress)
523525 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
524526
525527
526528 func calcStakingParams (stake,amount,assetId) = if (stake)
527529 then {
528- let $t01109911165 = calcStakingFuncAndAddres(stake, assetId)
529- let call = $t01109911165._1
530- let stakingAddr = $t01109911165._2
530+ let $t01111611182 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01111611182._1
532+ let stakingAddr = $t01111611182._2
531533 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
532534 }
533535 else {
534- let $t01125111317 = calcStakingFuncAndAddres(stake, assetId)
535- let call = $t01125111317._1
536- let stakingAddr = $t01125111317._2
536+ let $t01126811334 = calcStakingFuncAndAddres(stake, assetId)
537+ let call = $t01126811334._1
538+ let stakingAddr = $t01126811334._2
537539 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
538540 }
539541
540542
541543 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
542544 then {
543- let $t01150411606 = calcStakingParams(true, amount, fromBase58String(assetIdString))
544- let call = $t01150411606._1
545- let addr = $t01150411606._2
546- let params = $t01150411606._3
547- let payments = $t01150411606._4
545+ let $t01152111623 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546+ let call = $t01152111623._1
547+ let addr = $t01152111623._2
548+ let params = $t01152111623._3
549+ let payments = $t01152111623._4
548550 invoke(addr, call, params, payments)
549551 }
550552 else 0
551553
552554
553555 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
554556 then {
555- let $t01179111894 = calcStakingParams(false, amount, fromBase58String(assetIdString))
556- let call = $t01179111894._1
557- let addr = $t01179111894._2
558- let params = $t01179111894._3
559- let payments = $t01179111894._4
557+ let $t01180811911 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558+ let call = $t01180811911._1
559+ let addr = $t01180811911._2
560+ let params = $t01180811911._3
561+ let payments = $t01180811911._4
560562 invoke(addr, call, params, payments)
561563 }
562564 else 0
563565
564566
565567 func stakedAmount (assetId) = {
566568 let stakedAmountCalculated = match assetId {
567569 case aId: ByteVector =>
568570 if ((aId == USDN))
569571 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
570572 else 0
571573 case _: Unit =>
572574 0
573575 case _ =>
574576 throw("Match error")
575577 }
576578 match stakedAmountCalculated {
577579 case i: Int =>
578580 i
579581 case _ =>
580582 0
581583 }
582584 }
583585
584586
585587 func checkSuspicious () = {
586588 let contractBalances = _xp()
587589 func checkBalance (acc,assetId) = {
588- let $t01250512530 = acc
589- let suspicious = $t01250512530._1
590- let i = $t01250512530._2
590+ let $t01252212547 = acc
591+ let suspicious = $t01252212547._1
592+ let i = $t01252212547._2
591593 if (suspicious)
592594 then $Tuple2(suspicious, i)
593595 else {
594596 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
595597 if ((contractBalances[i] > aBalance))
596598 then $Tuple2(true, i)
597599 else $Tuple2(false, (i + 1))
598600 }
599601 }
600602
601603 let $l = assetIds
602604 let $s = size($l)
603605 let $acc0 = $Tuple2(false, 0)
604606 func $f0_1 ($a,$i) = if (($i >= $s))
605607 then $a
606608 else checkBalance($a, $l[$i])
607609
608610 func $f0_2 ($a,$i) = if (($i >= $s))
609611 then $a
610612 else throw("List size exceeds 15")
611613
612614 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
613615 }
614616
615617
616618 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
617619
618620
619621 func returnPayments (caller,payments) = {
620622 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
621623
622624 let $l = payments
623625 let $s = size($l)
624626 let $acc0 = nil
625627 func $f0_1 ($a,$i) = if (($i >= $s))
626628 then $a
627629 else parsePayments($a, $l[$i])
628630
629631 func $f0_2 ($a,$i) = if (($i >= $s))
630632 then $a
631633 else throw("List size exceeds 15")
632634
633635 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
634636 }
635637
636638
637639 func checkDAppThreshold (newBalances) = {
638640 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
639641 let thresholdScale = 10000
640- func iterAllBalances (acc,tokenBalance) = {
641- let $t01350913550 = acc
642- let thresholdError = $t01350913550._1
643- let cutedBalances = $t01350913550._2
644- func iterCutedBalances (checkRatio,checkedBalance) = {
645- let ratio = fraction(tokenBalance, thresholdScale, checkedBalance)
646- if (if ((ratio > (dAppThresholdCoef * thresholdScale)))
647- then true
648- else (fraction(1, thresholdScale, dAppThresholdCoef) > ratio))
649- then throw("New balance in assets of the DApp is less than threshold")
650- else false
651- }
642+ let maxBalance = max(newBalances)
643+ let minBalance = min(newBalances)
644+ let ratio = fraction(maxBalance, thresholdScale, minBalance)
645+ if ((ratio > (dAppThresholdCoef * thresholdScale)))
646+ then throw("New balance in assets of the DApp is less than threshold")
647+ else false
648+ }
652649
653- $Tuple2({
654- let $l = cutedBalances
655- let $s = size($l)
656- let $acc0 = thresholdError
657- func $f0_1 ($a,$i) = if (($i >= $s))
658- then $a
659- else iterCutedBalances($a, $l[$i])
660650
661- func $f0_2 ($a,$i) = if (($i >= $s))
662- then $a
663- else throw("List size exceeds 15")
664-
665- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
666- }, removeByIndex(cutedBalances, 0))
651+func checkCoins (assetIds) = {
652+ let coins = split(assetIds, ",")
653+ func checkCoin (error,assetId) = {
654+ let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
655+ let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
656+ if ((decimals != DECIMALS))
657+ then throw("wrong decimals")
658+ else false
667659 }
668660
669- let $t01407214175 = {
670- let $l = newBalances
671- let $s = size($l)
672- let $acc0 = $Tuple2(false, removeByIndex(newBalances, 0))
673- func $f0_1 ($a,$i) = if (($i >= $s))
674- then $a
675- else iterAllBalances($a, $l[$i])
661+ let $l = coins
662+ let $s = size($l)
663+ let $acc0 = false
664+ func $f0_1 ($a,$i) = if (($i >= $s))
665+ then $a
666+ else checkCoin($a, $l[$i])
676667
677- func $f0_2 ($a,$i) = if (($i >= $s))
678- then $a
679- else throw("List size exceeds 15")
668+ func $f0_2 ($a,$i) = if (($i >= $s))
669+ then $a
670+ else throw("List size exceeds 15")
680671
681- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
682- }
683- let thresholdError = $t01407214175._1
684- let b = $t01407214175._2
685- thresholdError
672+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
686673 }
687674
688675
689676 @Callable(msg)
690677 func D (xp,amp) = {
691678 let D = get_D_internal(xp, amp)
692679 $Tuple2([IntegerEntry("D", D)], D)
693680 }
694681
695682
696683
697684 @Callable(msg)
698-func init (coins,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
685+func init (assetIds,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
699686 then throw("Already initialized")
700687 else {
701688 let shareName = "s_Multi_USD"
702689 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
703690 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
704691 let tokenId = calculateAssetId(issueToken)
705- let baseEntry = [StringEntry(kAssets, coins), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, 15), BooleanEntry(kActive, true), issueToken]
706- if (firstHarvest)
707- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
708- else baseEntry
692+ if (checkCoins(assetIds))
693+ then throw()
694+ else {
695+ let baseEntry = [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, 15), BooleanEntry(kActive, true), issueToken]
696+ if (firstHarvest)
697+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
698+ else baseEntry
699+ }
709700 }
710701
711702
712703
713704 @Callable(msg)
714705 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
715706 let amp = _A()
716707 let xp = _xp()
717708 let D0 = if ((shareSupply == 0))
718709 then 0
719710 else getDMem(xp, amp)
720711 let payments = msg.payments
721712 let n = size(payments)
722713 func validPayments (n) = if ((n > nCoins))
723714 then throw(("payments size > " + toString(nCoins)))
724715 else if ((1 > n))
725716 then throw("payments size < 1")
726717 else if (if ((shareSupply == 0))
727718 then (nCoins != n)
728719 else false)
729720 then throw("initial deposit requires all coins")
730721 else {
731722 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
732723 then true
733724 else throw("Invalid asset in payment")
734725
735726 let $l = payments
736727 let $s = size($l)
737728 let $acc0 = false
738729 func $f0_1 ($a,$i) = if (($i >= $s))
739730 then $a
740731 else paymantValid($a, $l[$i])
741732
742733 func $f0_2 ($a,$i) = if (($i >= $s))
743734 then $a
744735 else throw("List size exceeds 15")
745736
746737 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
747738 }
748739
749740 if (!(validPayments(n)))
750741 then throw()
751742 else {
752743 let suspicious = checkSuspicious()
753744 if (suspicious._1)
754745 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
755746 else {
756747 let paymentsSize = size(payments)
757748 func parsePayments (acc,assetId) = {
758- let $t01658116610 = acc
759- let newBalances = $t01658116610._1
760- let i = $t01658116610._2
761- let j = $t01658116610._3
749+ let $t01661916648 = acc
750+ let newBalances = $t01661916648._1
751+ let i = $t01661916648._2
752+ let j = $t01661916648._3
762753 if (if ((paymentsSize > j))
763754 then (getStrAssetId(payments[j].assetId) == assetId)
764755 else false)
765756 then {
766757 let s = stake(payments[j].amount, getStrAssetId(payments[j].assetId))
767758 if ((s == s))
768759 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
769760 else throw("Strict value is not equal to itself.")
770761 }
771762 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
772763 }
773764
774- let $t01691617002 = {
765+ let $t01695417040 = {
775766 let $l = assetIds
776767 let $s = size($l)
777768 let $acc0 = $Tuple3(nil, 0, 0)
778769 func $f0_1 ($a,$i) = if (($i >= $s))
779770 then $a
780771 else parsePayments($a, $l[$i])
781772
782773 func $f0_2 ($a,$i) = if (($i >= $s))
783774 then $a
784775 else throw("List size exceeds 15")
785776
786777 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
787778 }
788- let newBalances = $t01691617002._1
789- let k = $t01691617002._2
790- let parsedPayments = $t01691617002._3
779+ let newBalances = $t01695417040._1
780+ let k = $t01695417040._2
781+ let parsedPayments = $t01695417040._3
791782 if (((paymentsSize - 1) > parsedPayments))
792783 then throw("Incorect payments order")
793784 else if (checkDAppThreshold(newBalances))
794785 then throw()
795786 else {
796787 let D1 = getDMem(newBalances, amp)
797788 if (assert((D1 > D0)))
798789 then throw("D1 > D0")
799790 else {
800791 let feeDiscount = calculateFeeDiscount(msg.caller)
801792 func calcScriptActions (acc,newBalance) = {
802- let $t01740717448 = acc
803- let invBalances = $t01740717448._1
804- let scriptActions = $t01740717448._2
805- let i = $t01740717448._3
793+ let $t01744517486 = acc
794+ let invBalances = $t01744517486._1
795+ let scriptActions = $t01744517486._2
796+ let i = $t01744517486._3
806797 if ((shareSupply > 0))
807798 then {
808799 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
809800 let fees = {
810801 let idealBalance = fraction(D1, xp[i], D0)
811802 let difference = if ((idealBalance > newBalance))
812803 then (idealBalance - newBalance)
813804 else (newBalance - idealBalance)
814805 fraction(_fee, difference, feeScale6)
815806 }
816807 let governanceFees = fraction(fees, feeGovernance, feeScale6)
817808 let finalBalance = (newBalance - governanceFees)
818809 let invariantBalance = (newBalance - fees)
819810 let us = unstake(fees, assetIds[i])
820811 if ((us == us))
821812 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
822813 else throw("Strict value is not equal to itself.")
823814 }
824815 else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
825816 }
826817
827- let $t01878518873 = {
818+ let $t01882318911 = {
828819 let $l = newBalances
829820 let $s = size($l)
830821 let $acc0 = $Tuple3(nil, nil, 0)
831822 func $f1_1 ($a,$i) = if (($i >= $s))
832823 then $a
833824 else calcScriptActions($a, $l[$i])
834825
835826 func $f1_2 ($a,$i) = if (($i >= $s))
836827 then $a
837828 else throw("List size exceeds 15")
838829
839830 $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)
840831 }
841- let invBalances = $t01878518873._1
842- let scriptActions = $t01878518873._2
832+ let invBalances = $t01882318911._1
833+ let scriptActions = $t01882318911._2
843834 let D2 = getDMem(invBalances, amp)
844835 let mint_amount = if ((shareSupply == 0))
845836 then D1
846837 else fraction(shareSupply, (D2 - D0), D0)
847838 if (assert((mint_amount >= minMintAmount)))
848839 then throw("Slippage screwed you")
849840 else if (stakeFarming)
850841 then {
851842 let re = invoke(this, "reissueShare", [mint_amount], nil)
852843 if ((re == re))
853844 then {
854845 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
855846 if ((s == s))
856847 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
857848 else throw("Strict value is not equal to itself.")
858849 }
859850 else throw("Strict value is not equal to itself.")
860851 }
861852 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
862853 }
863854 }
864855 }
865856 }
866857 })
867858
868859
869860
870861 @Callable(msg)
871862 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
872863
873864
874865
875866 @Callable(msg)
876867 func getDy (assetFrom,assetTo,dx,userAddress) = {
877868 let xp = _xp()
878869 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
879870 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
880871 let x = (xp[fromIndex] + dx)
881872 let y = getY(fromIndex, toIndex, x, xp)
882873 let dy = ((xp[toIndex] - y) - 1)
883874 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
884875 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
885876 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
886877 }
887878
888879
889880
890881 @Callable(msg)
891882 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
892883 then throw("size(payments) != 1")
893884 else {
894885 let suspicious = checkSuspicious()
895886 if (suspicious._1)
896887 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
897888 else {
898889 let payment = msg.payments[0]
899890 let tokenIn = getStrAssetId(payment.assetId)
900891 let tokenOutB58 = fromBase58String(tokenOut)
901892 let dx = payment.amount
902893 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
903894 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
904895 let xp = _xp()
905896 let x = (xp[fromIndex] + dx)
906897 let y = getY(fromIndex, toIndex, x, xp)
907898 let _dy = ((xp[toIndex] - y) - 1)
908899 let feeDiscount = calculateFeeDiscount(msg.caller)
909900 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
910901 let dy = (_dy - _fee)
911902 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
912903 if (assert((dy >= min_dy)))
913904 then throw("Exchange resulted in fewer coins than expected")
914905 else {
915906 func makeNewBalances (acc,tokenBalance) = {
916- let $t02158521611 = acc
917- let newBalances = $t02158521611._1
918- let i = $t02158521611._2
907+ let $t02162321649 = acc
908+ let newBalances = $t02162321649._1
909+ let i = $t02162321649._2
919910 if ((i == fromIndex))
920911 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
921912 else if ((i == toIndex))
922913 then $Tuple2((newBalances :+ (tokenBalance + dy)), (i + 1))
923914 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
924915 }
925916
926- let $t02186121922 = {
917+ let $t02189921960 = {
927918 let $l = xp
928919 let $s = size($l)
929920 let $acc0 = $Tuple2(nil, 0)
930921 func $f0_1 ($a,$i) = if (($i >= $s))
931922 then $a
932923 else makeNewBalances($a, $l[$i])
933924
934925 func $f0_2 ($a,$i) = if (($i >= $s))
935926 then $a
936927 else throw("List size exceeds 15")
937928
938929 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
939930 }
940- let newBalances = $t02186121922._1
941- let i = $t02186121922._2
931+ let newBalances = $t02189921960._1
932+ let i = $t02189921960._2
942933 if (checkDAppThreshold(newBalances))
943934 then throw()
944935 else {
945936 let s = stake(payment.amount, getStrAssetId(payment.assetId))
946937 if ((s == s))
947938 then {
948939 let us = unstake((dy + _fee), tokenOut)
949940 if ((us == us))
950941 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), ((xp[toIndex] - dy) - governanceFees)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(moneyBoxAddress, (_fee - governanceFees), tokenOutB58)], $Tuple2(dy, tokenOutB58))
951942 else throw("Strict value is not equal to itself.")
952943 }
953944 else throw("Strict value is not equal to itself.")
954945 }
955946 }
956947 }
957948 })
958949
959950
960951
961952 @Callable(msg)
962953 func withdraw (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
963954 then throw("size(payments) != 1")
964955 else {
965956 let suspicious = checkSuspicious()
966957 if (suspicious._1)
967958 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
968959 else {
969960 let payment = msg.payments[0]
970961 let tokenIn = payment.assetId
971962 if ((tokenIn != shareAssetId))
972963 then throw("unknown token")
973964 else {
974965 let _amount = payment.amount
975966 let total_supply = shareSupply
976967 let unlock = if ((unlockAmount > 0))
977968 then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
978969 else 0
979970 if ((unlock == unlock))
980971 then {
981972 let withdrawAmount = (_amount + unlockAmount)
982973 func calcScriptActions (acc,balance) = {
983- let $t02332723355 = acc
984- let scriptActions = $t02332723355._1
985- let i = $t02332723355._2
974+ let $t02336523393 = acc
975+ let scriptActions = $t02336523393._1
976+ let i = $t02336523393._2
986977 let wAmount = fraction(balance, withdrawAmount, total_supply)
987978 if (assert((wAmount >= minAmounts[i])))
988979 then throw("Withdrawal resulted in fewer coins than expected")
989980 else {
990981 let us = unstake(wAmount, assetIds[i])
991982 if ((us == us))
992983 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
993984 else throw("Strict value is not equal to itself.")
994985 }
995986 }
996987
997- let $t02384523913 = {
988+ let $t02388323951 = {
998989 let $l = _xp()
999990 let $s = size($l)
1000991 let $acc0 = $Tuple2(nil, 0)
1001992 func $f0_1 ($a,$i) = if (($i >= $s))
1002993 then $a
1003994 else calcScriptActions($a, $l[$i])
1004995
1005996 func $f0_2 ($a,$i) = if (($i >= $s))
1006997 then $a
1007998 else throw("List size exceeds 15")
1008999
10091000 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10101001 }
1011- let scriptActions = $t02384523913._1
1012- let i = $t02384523913._2
1002+ let scriptActions = $t02388323951._1
1003+ let i = $t02388323951._2
10131004 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
10141005 }
10151006 else throw("Strict value is not equal to itself.")
10161007 }
10171008 }
10181009 })
10191010
10201011
10211012
10221013 @Callable(msg)
10231014 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
10241015 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10251016 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
10261017 }
10271018
10281019
10291020
10301021 @Callable(msg)
10311022 func withdrawOneCoin (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10321023 then throw("size(payments) != 1")
10331024 else {
10341025 let suspicious = checkSuspicious()
10351026 if (suspicious._1)
10361027 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10371028 else {
10381029 let payment = msg.payments[0]
10391030 let tokenIn = payment.assetId
10401031 if ((tokenIn != shareAssetId))
10411032 then throw("unknown token")
10421033 else {
10431034 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10441035 let _tokenAmount = payment.amount
10451036 let unlock = if ((unlockAmount > 0))
10461037 then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
10471038 else 0
10481039 if ((unlock == unlock))
10491040 then {
10501041 let withdrawAmount = (_tokenAmount + unlockAmount)
10511042 let xp = _xp()
1052- let $t02514425225 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1053- let dy = $t02514425225._1
1054- let dy_fee = $t02514425225._2
1043+ let $t02518225263 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1044+ let dy = $t02518225263._1
1045+ let dy_fee = $t02518225263._2
10551046 if (assert((dy >= minAmount)))
10561047 then throw("Not enough coins removed")
10571048 else {
10581049 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10591050 let dy_and_fee = (dy + dy_fee)
10601051 func makeNewBalances (acc,tokenBalance) = {
1061- let $t02548325509 = acc
1062- let newBalances = $t02548325509._1
1063- let i = $t02548325509._2
1052+ let $t02552125547 = acc
1053+ let newBalances = $t02552125547._1
1054+ let i = $t02552125547._2
10641055 if ((i == outIndex))
10651056 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10661057 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10671058 }
10681059
1069- let $t02567625737 = {
1060+ let $t02571425775 = {
10701061 let $l = xp
10711062 let $s = size($l)
10721063 let $acc0 = $Tuple2(nil, 0)
10731064 func $f0_1 ($a,$i) = if (($i >= $s))
10741065 then $a
10751066 else makeNewBalances($a, $l[$i])
10761067
10771068 func $f0_2 ($a,$i) = if (($i >= $s))
10781069 then $a
10791070 else throw("List size exceeds 15")
10801071
10811072 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10821073 }
1083- let newBalances = $t02567625737._1
1084- let i = $t02567625737._2
1074+ let newBalances = $t02571425775._1
1075+ let i = $t02571425775._2
10851076 if (checkDAppThreshold(newBalances))
10861077 then throw()
10871078 else {
10881079 let us = unstake(dy_and_fee, tokenOut)
10891080 if ((us == us))
10901081 then [ScriptTransfer(msg.caller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[i] + kAssetBalance), (xp[i] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
10911082 else throw("Strict value is not equal to itself.")
10921083 }
10931084 }
10941085 }
10951086 else throw("Strict value is not equal to itself.")
10961087 }
10971088 }
10981089 })
10991090
11001091
11011092
11021093 @Callable(msg)
11031094 func A () = $Tuple2(nil, _A())
11041095
11051096
11061097
11071098 @Callable(msg)
11081099 func getVirtualPrice () = {
11091100 let D = get_D(_xp(), _A())
11101101 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
11111102 }
11121103
11131104
11141105
11151106 @Callable(msg)
11161107 func calcTokenAmount (amounts,deposit) = {
11171108 let amp = _A()
11181109 let balances = _xp()
11191110 let D0 = getDMem(balances, amp)
11201111 func calcNewBalances (acc,balance) = {
1121- let $t02669826724 = acc
1122- let newBalances = $t02669826724._1
1123- let i = $t02669826724._2
1112+ let $t02673626762 = acc
1113+ let newBalances = $t02673626762._1
1114+ let i = $t02673626762._2
11241115 let newBalance = (balance + (if (deposit)
11251116 then amounts[i]
11261117 else -(amounts[i])))
11271118 $Tuple2((newBalances :+ newBalance), (i + 1))
11281119 }
11291120
11301121 let newBalances = ( let $l = balances
11311122 let $s = size($l)
11321123 let $acc0 = $Tuple2(nil, 0)
11331124 func $f0_1 ($a,$i) = if (($i >= $s))
11341125 then $a
11351126 else calcNewBalances($a, $l[$i])
11361127
11371128 func $f0_2 ($a,$i) = if (($i >= $s))
11381129 then $a
11391130 else throw("List size exceeds 15")
11401131
11411132 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15))._1
11421133 let D1 = getDMem(newBalances, amp)
11431134 let diff = if (deposit)
11441135 then (D1 - D0)
11451136 else (D0 - D1)
11461137 $Tuple2(nil, fraction(diff, shareSupply, D0))
11471138 }
11481139
11491140
11501141
11511142 @Callable(msg)
11521143 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
11531144 then throw("too often")
11541145 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
11551146 then throw("insufficient time")
11561147 else {
11571148 let _initial_A = _A()
11581149 if (assert(if ((_futureA > 0))
11591150 then (MAX_A > _futureA)
11601151 else false))
11611152 then throw("out of base range")
11621153 else if (assert(if (if ((_futureA >= _initial_A))
11631154 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
11641155 else false)
11651156 then true
11661157 else if ((_initial_A > _futureA))
11671158 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
11681159 else false))
11691160 then throw("out of range")
11701161 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
11711162 }))
11721163
11731164
11741165
11751166 @Callable(msg)
11761167 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
11771168 let currentA = _A()
11781169 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
11791170 }))
11801171
11811172
11821173
11831174 @Callable(msg)
11841175 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
11851176 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
11861177 else suspend("Paused by admin"))
11871178
11881179
11891180
11901181 @Callable(msg)
11911182 func activate () = valueOrElse(isAdminCall(msg), if (active)
11921183 then throwIsActive()
11931184 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
11941185
11951186
11961187
11971188 @Callable(msg)
11981189 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
11991190
12001191
12011192 @Verifier(tx)
12021193 func verify () = {
12031194 let multiSignedByAdmins = {
12041195 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12051196 then 1
12061197 else 0
12071198 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
12081199 then 1
12091200 else 0
12101201 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
12111202 then 1
12121203 else 0
12131204 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
12141205 }
12151206 match tx {
12161207 case inv: InvokeScriptTransaction =>
12171208 let callTakeIntoAccount = if ((inv.dApp == this))
12181209 then (inv.function == "takeIntoAccountExtraFunds")
12191210 else false
12201211 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12211212 then true
12221213 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
12231214 then true
12241215 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
12251216 then true
12261217 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
12271218 if (if (callTakeIntoAccount)
12281219 then signedByAdmin
12291220 else false)
12301221 then true
12311222 else multiSignedByAdmins
12321223 case _ =>
12331224 multiSignedByAdmins
12341225 }
12351226 }
12361227

github/deemru/w8io/c3f4982 
170.87 ms