tx · 5YdwjdmbsLb2JEDf8wDCL6akoENR8wpxrPuiSRFpuTWC

3N8rRK2qY9gks7UiTZbno3oU9ZxHsjf6Nxg:  -0.03500000 Waves

2022.09.01 20:59 [2210394] smart account 3N8rRK2qY9gks7UiTZbno3oU9ZxHsjf6Nxg > SELF 0.00000000 Waves

{ "type": 13, "id": "5YdwjdmbsLb2JEDf8wDCL6akoENR8wpxrPuiSRFpuTWC", "fee": 3500000, "feeAssetId": null, "timestamp": 1662055176316, "version": 2, "chainId": 84, "sender": "3N8rRK2qY9gks7UiTZbno3oU9ZxHsjf6Nxg", "senderPublicKey": "BGaHqWWh2PA55UDpG3EMuoSRrrPo348kqpXax829kygz", "proofs": [ "WLmrD3Uarf99ReQspHyNookrWfuAV89uTnhuJSDUFvEqrpU2RNtb9H4qqCPsxHE65adekF4TDJQ4iXQq3s5bjBL", "475Y4ec6HbZi8uN7BECwm78sx7GSaYE74Ya3Djama2wtm4DUVhiANbpDtAHjJWfJ9M5gYeJdXcTmXFcR4v9sgiFc" ], "script": "base64:BgJXCAISBAoCEQESBQoDCAEEEgQKAgEEEgMKAQESBgoECAgBCBIECgIIARIECgIRARIFCgMBCAgSBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBXAAHdmVyc2lvbgIFMy4wLjAACVBSRUNJU0lPTgDAhD0ABU1BWF9BAMCEPQAMTUFYX0FfQ0hBTkdFAAoACERFQ0lNQUxTAAYADU1JTl9SQU1QX1RJTUUJAGkCAICjBQA8AAdrQXNzZXRzAglhc3NldF9pZHMADWtBc3NldEJhbGFuY2UCCF9iYWxhbmNlAAdrQWN0aXZlAgZhY3RpdmUABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uABJrREFwcFRocmVzaG9sZENvZWYCEWRBcHBUaHJlc2hvbGRDb2VmAAxrVVNETkFkZHJlc3MCGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAKa0Rpc2NvdW50cwIJZGlzY291bnRzAA9rRGlzY291bnRWYWx1ZXMCD2Rpc2NvdW50X3ZhbHVlcwAOa1VzZXJTd29wSW5Hb3YCDF9TV09QX2Ftb3VudAANa0ZpcnN0SGFydmVzdAINZmlyc3RfaGFydmVzdAATa0ZpcnN0SGFydmVzdEhlaWdodAIUZmlyc3RfaGFydmVzdF9oZWlnaHQAC2tTaGFyZUxpbWl0AhxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AAtrQmFzZVBlcmlvZAILYmFzZV9wZXJpb2QADWtQZXJpb2RMZW5ndGgCDXBlcmlvZF9sZW5ndGgADGtTdGFydEhlaWdodAIMc3RhcnRfaGVpZ2h0AA1rQWRtaW5QdWJLZXkxAgthZG1pbl9wdWJfMQANa0FkbWluUHViS2V5MgILYWRtaW5fcHViXzIADWtBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zABJrQWRtaW5JbnZva2VQdWJLZXkCEGFkbWluX2ludm9rZV9wdWIAEGtNb25leUJveEFkZHJlc3MCEW1vbmV5X2JveF9hZGRyZXNzAAtrR292QWRkcmVzcwISZ292ZXJuYW5jZV9hZGRyZXNzAA5rVm90aW5nQWRkcmVzcwIOdm90aW5nX2FkZHJlc3MAD2tGYXJtaW5nQWRkcmVzcwIPZmFybWluZ19hZGRyZXNzAAZvcmFjbGUJAQdBZGRyZXNzAQEaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMAEWFkbWluUHViS2V5SW52b2tlCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEmtBZG1pbkludm9rZVB1YktleQAPbW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUQa01vbmV5Qm94QWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAOZmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rRmFybWluZ0FkZHJlc3MAEmNhcE1vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBARoBVF5pahfpqiB9Po+vYLtEzvHovs7eZZxS8wAEVVNETgEgbySjyqsw3FIpmOgsYVruWn8jTcItdbvpnapU4NLQB8EADXN0YWtpbmdBc3NldHMJAMwIAgkA2AQBBQRVU0ROBQNuaWwACmJhc2VQZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQtrQmFzZVBlcmlvZAIRRW1wdHkga0Jhc2VQZXJpb2QAC3N0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUMa1N0YXJ0SGVpZ2h0AhJFbXB0eSBrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFDWtQZXJpb2RMZW5ndGgCE0VtcHR5IGtQZXJpb2RMZW5ndGgAFWZpcnN0SGFydmVzdEVuZFBlcmlvZAkAZAIJAGQCBQpiYXNlUGVyaW9kCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAADAAZhY3RpdmUJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMFB2tBY3RpdmUADHNoYXJlQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQ1rU2hhcmVBc3NldElkAAtzaGFyZVN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwURa1NoYXJlQXNzZXRTdXBwbHkACWZlZVNjYWxlNgDAhD0AA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUEa0ZlZQANZmVlR292ZXJuYW5jZQkAawMAKAUJZmVlU2NhbGU2AGQACWluaXRpYWxfQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIJaW5pdGlhbF9BAAhmdXR1cmVfQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIIZnV0dXJlX0EADmluaXRpYWxfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDmluaXRpYWxfQV90aW1lAAAADWZ1dHVyZV9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwINZnV0dXJlX0FfdGltZQAAAAhhc3NldElkcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQdrQXNzZXRzAgEsAAZuQ29pbnMJAJADAQUIYXNzZXRJZHMBB3N1c3BlbmQBBWNhdXNlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQZrQ2F1c2UFBWNhdXNlBQNuaWwBDXRocm93SXNBY3RpdmUACQACAQIWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQEIaXNBY3RpdmUAAwUGYWN0aXZlBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAgUEdGhpcwgFAWkGY2FsbGVyBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgAEYmlnMgkAtgIBAAIADmJsb2NrVGltZXN0YW1wBQZoZWlnaHQBBmFzc2VydAEBYQMFAWEHBgEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQh1c2VyQWRkcgUOa1VzZXJTd29wSW5Hb3YAAAQOZGlzY291bnRWYWx1ZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ9rRGlzY291bnRWYWx1ZXMCASwECWRpc2NvdW50cwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFCmtEaXNjb3VudHMCASwDAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAACQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAADAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAEDAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAIDAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMABAUJZmVlU2NhbGU2AQJfQQAEAnQxBQ1mdXR1cmVfQV90aW1lBAJBMQUIZnV0dXJlX0EDCQBmAgUCdDEFDmJsb2NrVGltZXN0YW1wBAJBMAUJaW5pdGlhbF9BBAJ0MAUOaW5pdGlhbF9BX3RpbWUDCQBmAgUCQTEFAkEwCQBkAgUCQTAJAGkCCQBoAgkAZQIFAkExBQJBMAkAZQIFDmJsb2NrVGltZXN0YW1wBQJ0MAkAZQIFAnQxBQJ0MAkAZQIFAkEwCQBpAgkAaAIJAGUCBQJBMAUCQTEJAGUCBQ5ibG9ja1Rp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MDUwOTEwNTczAl8yBAx4cF9yZWR1Y2VkX2kJAJEDAgUKeHBfcmVkdWNlZAUBaQQCZHkJAGUCCQBlAgUMeHBfcmVkdWNlZF9pCQEHZ2V0X3lfRAQFA2FtcAUBaQUKeHBfcmVkdWNlZAUCRDEAAQkAlAoCBQJkeQkAZQIFBGR5XzAFAmR5AQ1nZXRTdHJBc3NldElkAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBXN0YWtlB2Fzc2V0SWQDBQVzdGFrZQkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAg51bmxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzARFjYWxjU3Rha2luZ1BhcmFtcwMFc3Rha2UGYW1vdW50B2Fzc2V0SWQDBQVzdGFrZQQNJHQwMTExMzcxMTIwMwkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTExMzcxMTIwMwJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMTEzNzExMjAzAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsBA0kdDAxMTI4OTExMzU1CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTI4OTExMzU1Al8xBAtzdGFraW5nQWRkcggFDSR0MDExMjg5MTEzNTUCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIJAMwIAgUGYW1vdW50CQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwBBXN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTU0MjExNjQ0CQERY2FsY1N0YWtpbmdQYXJhbXMDBgUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTU0MjExNjQ0Al8xBARhZGRyCAUNJHQwMTE1NDIxMTY0NAJfMgQGcGFyYW1zCAUNJHQwMTE1NDIxMTY0NAJfMwQIcGF5bWVudHMIBQ0kdDAxMTU0MjExNjQ0Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEHdW5zdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTE4MjkxMTkzMgkBEWNhbGNTdGFraW5nUGFyYW1zAwcFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTE4MjkxMTkzMgJfMQQEYWRkcggFDSR0MDExODI5MTE5MzICXzIEBnBhcmFtcwgFDSR0MDExODI5MTE5MzICXzMECHBheW1lbnRzCAUNJHQwMTE4MjkxMTkzMgJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABDHN0YWtlZEFtb3VudAEHYXNzZXRJZAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQR0aGlzAAADCQABAgUHJG1hdGNoMAIEVW5pdAAACQACAQILTWF0Y2ggZXJyb3IEByRtYXRjaDAFFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpAAABD2NoZWNrU3VzcGljaW91cwAEEGNvbnRyYWN0QmFsYW5jZXMJAQNfeHAACgEMY2hlY2tCYWxhbmNlAgNhY2MHYXNzZXRJZAQNJHQwMTI1NDMxMjU2OAUDYWNjBApzdXNwaWNpb3VzCAUNJHQwMTI1NDMxMjU2OAJfMQQBaQgFDSR0MDEyNTQzMTI1NjgCXzIDBQpzdXNwaWNpb3VzCQCUCgIFCnN1c3BpY2lvdXMFAWkECGFCYWxhbmNlCQBkAgkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQJAQxzdGFrZWRBbW91bnQBCQDZBAEFB2Fzc2V0SWQDCQBmAgkAkQMCBRBjb250cmFjdEJhbGFuY2VzBQFpBQhhQmFsYW5jZQkAlAoCBgUBaQkAlAoCBwkAZAIFAWkAAQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgcAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY2hlY2tCYWxhbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwERc3VzcGVuZFN1c3BpY2lvdXMBAWkJAQdzdXNwZW5kAQkArAICAh1TdXNwaWNpb3VzIHN0YXRlIHdpdGggYXNzZXQ6IAkAkQMCBQhhc3NldElkcwUBaQEOcmV0dXJuUGF5bWVudHMCBmNhbGxlcghwYXltZW50cwoBDXBhcnNlUGF5bWVudHMCA2FjYwdwYXltZW50CQDNCAIFA2FjYwkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCAUHcGF5bWVudAZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXBhcnNlUGF5bWVudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPARJjaGVja0RBcHBUaHJlc2hvbGQBC25ld0JhbGFuY2VzBBFkQXBwVGhyZXNob2xkQ29lZgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFEmtEQXBwVGhyZXNob2xkQ29lZgIYTm8gZEFwcFRocmVzaG9sZENvZWYga2V5BA50aHJlc2hvbGRTY2FsZQCQTgQKbWF4QmFsYW5jZQkAlgMBBQtuZXdCYWxhbmNlcwQKbWluQmFsYW5jZQkAlwMBBQtuZXdCYWxhbmNlcwQFcmF0aW8JAGsDBQptYXhCYWxhbmNlBQ50aHJlc2hvbGRTY2FsZQUKbWluQmFsYW5jZQMJAGYCBQVyYXRpbwkAaAIFEWRBcHBUaHJlc2hvbGRDb2VmBQ50aHJlc2hvbGRTY2FsZQkAAgECOE5ldyBiYWxhbmNlIGluIGFzc2V0cyBvZiB0aGUgREFwcCBpcyBsZXNzIHRoYW4gdGhyZXNob2xkBwEKY2hlY2tDb2lucwEIYXNzZXRJZHMEBWNvaW5zCQC1CQIFCGFzc2V0SWRzAgEsCgEJY2hlY2tDb2luAgVlcnJvcgdhc3NldElkBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDZBAEFB2Fzc2V0SWQJAKwCAgISZnJvbUJhc2U1OFN0cmluZzogBQdhc3NldElkBAhkZWNpbWFscwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQVhc3NldAkArAICAgthc3NldEluZm86IAUHYXNzZXRJZAhkZWNpbWFscwMJAQIhPQIFCGRlY2ltYWxzBQhERUNJTUFMUwkAAgECDndyb25nIGRlY2ltYWxzBwoAAiRsBQVjb2lucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQljaGVja0NvaW4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPEQNtc2cBAUQCAnhwA2FtcAQBRAkBDmdldF9EX2ludGVybmFsAgUCeHAFA2FtcAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgFEBQFEBQNuaWwFAUQDbXNnAQRpbml0Awhhc3NldElkcwJfQQxmaXJzdEhhcnZlc3QDCQEBIQEJAJ4IAQUEdGhpcwkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQECXNoYXJlTmFtZQILc19NdWx0aV9VU0QEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgJCU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIE11bHRpU3RhYmxlIFVTRCBwb29sIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMECmlzc3VlVG9rZW4JAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uAAAABgYEB3Rva2VuSWQJALgIAQUKaXNzdWVUb2tlbgMJAQpjaGVja0NvaW5zAQUIYXNzZXRJZHMJAQV0aHJvdwAECWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCBQdrQXNzZXRzBQhhc3NldElkcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQRrRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQZvcmFjbGUCDWJhc2VfZmVlX2ZsYXQJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa1NoYXJlQXNzZXRJZAkA2AQBBQd0b2tlbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrREFwcFRocmVzaG9sZENvZWYADwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgUKaXNzdWVUb2tlbgUDbmlsAwUMZmlyc3RIYXJ2ZXN0CQDOCAIFCWJhc2VFbnRyeQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa0ZpcnN0SGFydmVzdAUMZmlyc3RIYXJ2ZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrRmlyc3RIYXJ2ZXN0SGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQJAGgCBRVmaXJzdEhhcnZlc3RFbmRQZXJpb2QFDHBlcmlvZExlbmd0aAUDbmlsBQliYXNlRW50cnkDbXNnAQxhZGRMaXF1aWRpdHkCDW1pbk1pbnRBbW91bnQMc3Rha2VGYXJtaW5nCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABANhbXAJAQJfQQAEAnhwCQEDX3hwAAQCRDADCQAAAgULc2hhcmVTdXBwbHkAAAAACQEHZ2V0RE1lbQIFAnhwBQNhbXAECHBheW1lbnRzCAUDbXNnCHBheW1lbnRzBAFuCQCQAwEFCHBheW1lbnRzCgENdmFsaWRQYXltZW50cwEBbgMJAGYCBQFuBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUBbgkAAgECEXBheW1lbnRzIHNpemUgPCAxAwMJAAACBQtzaGFyZVN1cHBseQAACQECIT0CBQZuQ29pbnMFAW4HCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwoBDHBheW1hbnRWYWxpZAIDYWNjB3BheW1lbnQDCQEPY29udGFpbnNFbGVtZW50AgUIYXNzZXRJZHMJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAYJAAIBAhhJbnZhbGlk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NDY2MTc1MDcCXzEEDXNjcmlwdEFjdGlvbnMIBQ0kdDAxNzQ2NjE3NTA3Al8yBAFpCAUNJHQwMTc0NjYxNzUwNwJfMwMJAGYCBQtzaGFyZVN1cHBseQAABARfZmVlCQBpAgkAaAIJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFBm5Db2lucwkAaAIABAkAZQIFBm5Db2lucwABBARmZWVzBAxpZGVhbEJhbGFuY2UJAGsDBQJEMQkAkQMCBQJ4cAUBaQUCRDAECmRpZmZlcmVuY2UDCQBmAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUMaWRlYWxCYWxhbmNlBQpuZXdCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUMaWRlYWxCYWxhbmNlCQBrAwUEX2ZlZQUKZGlmZmVyZW5jZQUJZmVlU2NhbGU2BA5nb3Zlcm5hbmNlRmVlcwkAawMFBGZlZXMFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgQMZmluYWxCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUOZ292ZXJuYW5jZUZlZXMEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBAJ1cwkBB3Vuc3Rha2UCBQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFAnVzBQJ1cwkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUSY2FwTW9uZXlCb3hBZGRyZXNzCQBlAgUEZmVlcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFDmdvdmVybmFuY2VGZWVzCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQUMZmluYWxCYWxhbmNlBQNuaWwJAGQCBQFpAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABBA0kdDAxODg0NDE4OTMyCgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC2ludkJhbGFuY2VzCAUNJHQwMTg4NDQxODkzMgJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDE4ODQ0MTg5MzICXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BQNuaWwDCQAAAgUBcwUBcwkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUMc2hhcmVBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAUDbmlsA21zZwEMcmVpc3N1ZVNoYXJlAQZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUDbXNnCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQZhbW91bnQGBQNuaWwDbXNnAQVnZXREeQQJYXNzZXRGcm9tB2Fzc2V0VG8CZHgLdXNlckFkZHJlc3MEAnhwCQEDX3hwAAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCWFzc2V0RnJvbQIQdW5rbm93biB0b2tlbiBpbgQHdG9JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQdhc3NldFRvAhF1bmtub3duIHRva2VuIG91dAQBeAkAZAIJAJEDAgUCeHAFCWZyb21JbmRleAUCZHgEAXkJAQRnZXRZBAUJZnJvbUluZGV4BQd0b0luZGV4BQF4BQJ4cAQCZHkJAGUCCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUBeQABBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQkBB0FkZHJlc3MBCQDZBAEFC3VzZXJBZGRyZXNzBARfZmVlCQBrAwkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUCZHkFCWZlZVNjYWxlNgkAlAoCBQNuaWwJAJQKAgkAZQIFAmR5BQRfZmVlBQRfZmVlA21zZwEIZXhjaGFuZ2UCCHRva2VuT3V0Bm1pbl9keQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQEC3Rva2VuT3V0QjU4CQDZBAEFCHRva2VuT3V0BAJkeAgFB3BheW1lbnQGYW1vdW50BAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHdG9rZW5JbgIQdW5rbm93biB0b2tlbiBpbgQHdG9JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQEAnhwCQEDX3hwAAQBeAkAZAIJAJEDAgUCeHAFCWZyb21JbmRleAUCZHgEAXkJAQRnZXRZBAUJZnJvbUluZGV4BQd0b0luZGV4BQF4BQJ4cAQDX2R5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIBQNtc2cGY2FsbGVyBARfZmVlCQBrAwUDX2R5CQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQlmZWVTY2FsZTYEAmR5CQBlAgUDX2R5BQRfZmVlBA5nb3Zlcm5hbmNlRmVlcwkAawMFBF9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgMJAQZhc3NlcnQBCQBnAgUCZHkFBm1pbl9keQkAAgECLkV4Y2hhbmdlIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDIxNjQ0MjE2NzAFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyMTY0NDIxNjcwAl8xBAFpCAUNJHQwMjE2NDQyMTY3MAJfMgMJAAACBQFpBQlmcm9tSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZAIFDHRva2VuQmFsYW5jZQUCZHgJAGQCBQFpAAEDCQAAAgUBaQUHdG9JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQNfZHkJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyMTkyMTIxOTgyCgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQLbmV3QmFsYW5jZXMIBQ0kdDAyMTkyMTIxOTgyAl8xBAFpCAUNJHQwMjE5MjEyMTk4MgJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQBcwkBBXN0YWtlAggFB3BheW1lbnQGYW1vdW50CQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQDCQAAAgUBcwUBcwQCdXMJAQd1bnN0YWtlAgUDX2R5BQh0b2tlbk91dAMJAAACBQJ1cwUCdXMJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUDX2R5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUSY2FwTW9uZXlCb3hBZGRyZXNzCQBlAgUEX2ZlZQUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4BQNuaWwJAJQKAgUCZHkFC3Rva2VuT3V0QjU4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEId2l0aGRyYXcCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAAEB3Rva2VuSW4IBQdwYXltZW50B2Fzc2V0SWQDCQECIT0CBQd0b2tlbkluBQxzaGFyZUFzc2V0SWQJAAIBAg11bmtub3duIHRva2VuBAdfYW1vdW50CAUHcGF5bWVudAZhbW91bnQEDHRvdGFsX3N1cHBseQULc2hhcmVTdXBwbHkEBnVubG9jawMJAGYCBQx1bmxvY2tBbW91bnQAAAkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFB19hbW91bnQFDHVubG9ja0Ftb3VudAoBEWNhbGNTY3JpcHRBY3Rpb25zAgNhY2MHYmFsYW5jZQQNJHQwMjMzNjgyMzM5NgUDYWNjBA1zY3JpcHRBY3Rpb25zCAUNJHQwMjMzNjgyMzM5NgJfMQQBaQgFDSR0MDIzMzY4MjMzOTYCXzIEB3dBbW91bnQJAGsDBQdiYWxhbmNlBQ53aXRoZHJhd0Ftb3VudAUMdG90YWxfc3VwcGx5AwkBBmFzc2VydAEJAGcCBQd3QW1vdW50CQCRAwIFCm1pbkFtb3VudHMFAWkJAAIBAjBXaXRoZHJhd2FsIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQEAnVzCQEHdW5zdGFrZQIFB3dBbW91bnQJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUCdXMFAnVzCQCUCgIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlCQBlAgUHYmFsYW5jZQUHd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUHd0Ftb3VudAkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpBQNuaWwJAGQCBQFpAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDIzODg2MjM5NTQKAAIkbAkBA194cAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EDXNjcmlwdEFjdGlvbnMIBQ0kdDAyMzg4NjIzOTU0Al8xBAFpCAUNJHQwMjM4ODYyMzk1NAJfMgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUOd2l0aGRyYXdBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBE2NhbGNXaXRoZHJhd09uZUNvaW4DC3Rva2VuQW1vdW50CHRva2VuT3V0BHVzZXIEAWkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0CQCUCgIFA25pbAgJARRfY2FsY1dpdGhkcmF3T25lQ29pbgQJAQNfeHAABQt0b2tlbkFtb3VudAUBaQkBB0FkZHJlc3MBCQDZBAEFBHVzZXICXzEDbXNnAQ93aXRoZHJhd09uZUNvaW4DCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbggFB3BheW1lbnQHYXNzZXRJZAMJAQIhPQIFB3Rva2VuSW4FDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4ECG91dEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQMX3Rva2VuQW1vdW50CAUHcGF5bWVudAZhbW91bnQEBnVubG9jawMJAGYCBQx1bmxvY2tBbW91bnQAAAkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFDF90b2tlbkFtb3VudAUMdW5sb2NrQW1vdW50BAJ4cAkBA194cAAEDSR0MDI1MTg1MjUyNjYJARRfY2FsY1dpdGhkcmF3T25lQ29pbgQFAnhwBQ53aXRoZHJhd0Ftb3VudAUIb3V0SW5kZXgIBQNtc2cGY2FsbGVyBAJkeQgFDSR0MDI1MTg1MjUyNjYCXzEEBmR5X2ZlZQgFDSR0MDI1MTg1MjUyNjYCXzIDCQEGYXNzZXJ0AQkAZwIFAmR5BQltaW5BbW91bnQJAAIBAhhOb3QgZW5vdWdoIGNvaW5zIHJlbW92ZWQEDmdvdmVybmFuY2VGZWVzCQBrAwUGZHlfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYECmR5X2FuZF9mZWUJAGQCBQJkeQUGZHlfZmVlCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyNTUyNDI1NTUwBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjU1MjQyNTU1MAJfMQQBaQgFDSR0MDI1NTI0MjU1NTACXzIDCQAAAgUBaQUIb3V0SW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUKZHlfYW5kX2ZlZQkAZAIFAWkAAQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQx0b2tlbkJhbGFuY2UJAGQCBQFpAAEEDSR0MDI1NzE3MjU3NzgKAAIkbAUCeHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9tYWtlTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDI1NzE3MjU3NzgCXzEEAWkIBQ0kdDAyNTcxNzI1Nzc4Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFAmR5CQDZBAEFCHRva2VuT3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQFpBQpkeV9hbmRfZmVlCQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFDmdvdmVybmFuY2VGZWVzCQDZBAEFCHRva2VuT3V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEmNhcE1vbmV5Qm94QWRkcmVzcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMJANkEAQUIdG9rZW5PdXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFDndpdGhkcmF3QW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMjY3MzkyNjc2NQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI2NzM5MjY3NjUCXzEEAWkIBQ0kdDAyNjczOTI2NzY1Al8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARhrZWVwTGltaXRGb3JGaXJzdEhhcnZlc3QBCnNoYXJlTGltaXQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1NoYXJlTGltaXQFCnNoYXJlTGltaXQFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQTY2FsbFRha2VJbnRvQWNjb3VudAMJAAACCAUDaW52BGRBcHAFBHRoaXMJAAACCAUDaW52CGZ1bmN0aW9uAhl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQNc2lnbmVkQnlBZG1pbgMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkyBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkzBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAURYWRtaW5QdWJLZXlJbnZva2UDAwUTY2FsbFRha2VJbnRvQWNjb3VudAUNc2lnbmVkQnlBZG1pbgcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5zd95rKg==", "height": 2210394, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BDWz5N7ntXe63Yugr3RJtRLBKW9UrBz3xR8TB8MQ3Seh Next: EGBLnMB1KVSq11AR38xr4j5WLjmgbqUdbv3iy4FYUxNb Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let version = "3.0.0"
5+
46 let PRECISION = 1000000
57
68 let MAX_A = 1000000
285287 else $Tuple2(D, false)
286288 }
287289
288- let $t066286740 = {
290+ let $t066506762 = {
289291 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
290292 let $s = size($l)
291293 let $acc0 = $Tuple2(toBigInt(S), false)
299301
300302 $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)
301303 }
302- let D = $t066286740._1
303- let finished = $t066286740._2
304+ let D = $t066506762._1
305+ let finished = $t066506762._2
304306 if ((finished == false))
305307 then throw(("get_D() not finished with " + toString(D)))
306308 else toInt(D)
326328 let D = get_D(xp_, amp)
327329 let Ann = (amp * nCoins)
328330 func S_c (acc,i) = {
329- let $t073117328 = acc
330- let S_ = $t073117328._1
331- let c = $t073117328._2
331+ let $t073337350 = acc
332+ let S_ = $t073337350._1
333+ let c = $t073337350._2
332334 let x_ = if ((in == i))
333335 then x
334336 else xp_[i]
339341 else $Tuple2(S_, c)
340342 }
341343
342- let $t075367637 = {
344+ let $t075587659 = {
343345 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
344346 let $s = size($l)
345347 let $acc0 = $Tuple2(0, toBigInt(D))
353355
354356 $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)
355357 }
356- let S_ = $t075367637._1
357- let c_ = $t075367637._2
358+ let S_ = $t075587659._1
359+ let c_ = $t075587659._2
358360 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
359361 let bD = toBigInt(((S_ + (D / Ann)) - D))
360362 func y_proc (acc,_i) = if ((acc._2 == true))
371373 else $Tuple2(y, false)
372374 }
373375
374- let $t081198236 = {
376+ let $t081418258 = {
375377 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
376378 let $s = size($l)
377379 let $acc0 = $Tuple2(toBigInt(D), false)
385387
386388 $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)
387389 }
388- let y = $t081198236._1
389- let finished = $t081198236._2
390+ let y = $t081418258._1
391+ let finished = $t081418258._2
390392 if ((finished == false))
391393 then throw(("getY() not finished with " + toString(y)))
392394 else toInt(y)
400402 else {
401403 let Ann = (A_ * nCoins)
402404 func S_c (acc,i) = {
403- let $t086158632 = acc
404- let S_ = $t086158632._1
405- let c = $t086158632._2
405+ let $t086378654 = acc
406+ let S_ = $t086378654._1
407+ let c = $t086378654._2
406408 let x_ = if (if ((in != i))
407409 then (nCoins > i)
408410 else false)
415417 else $Tuple2(S_, c)
416418 }
417419
418- let $t088528953 = {
420+ let $t088748975 = {
419421 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
420422 let $s = size($l)
421423 let $acc0 = $Tuple2(0, toBigInt(D))
429431
430432 $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)
431433 }
432- let S_ = $t088528953._1
433- let c_ = $t088528953._2
434+ let S_ = $t088748975._1
435+ let c_ = $t088748975._2
434436 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
435437 let bD = toBigInt(((S_ + (D / Ann)) - D))
436438 func y_D_proc (acc,i) = if ((acc._2 == true))
447449 else $Tuple2(y, false)
448450 }
449451
450- let $t094369555 = {
452+ let $t094589577 = {
451453 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
452454 let $s = size($l)
453455 let $acc0 = $Tuple2(toBigInt(D), false)
461463
462464 $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)
463465 }
464- let y = $t094369555._1
465- let finished = $t094369555._2
466+ let y = $t094589577._1
467+ let finished = $t094589577._2
466468 if ((finished == false))
467469 then throw(("get_y_D() not finished with " + toString(y)))
468470 else toInt(y)
479481 let new_y = get_y_D(amp, i, xp, D1)
480482 let dy_0 = (xp[i] - new_y)
481483 func xp_reduced_proc (acc,xp_j) = {
482- let $t01019610225 = acc
483- let xp_reduced = $t01019610225._1
484- let index = $t01019610225._2
484+ let $t01021810247 = acc
485+ let xp_reduced = $t01021810247._1
486+ let index = $t01021810247._2
485487 let dx_expected = if ((index == i))
486488 then (fraction(xp_j, D1, D0) - new_y)
487489 else (xp_j - fraction(xp_j, D1, D0))
488490 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
489491 }
490492
491- let $t01048710551 = {
493+ let $t01050910573 = {
492494 let $l = xp
493495 let $s = size($l)
494496 let $acc0 = $Tuple2(nil, 0)
502504
503505 $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)
504506 }
505- let xp_reduced = $t01048710551._1
506- let index = $t01048710551._2
507+ let xp_reduced = $t01050910573._1
508+ let index = $t01050910573._2
507509 let xp_reduced_i = xp_reduced[i]
508510 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
509511 $Tuple2(dy, (dy_0 - dy))
527529
528530 func calcStakingParams (stake,amount,assetId) = if (stake)
529531 then {
530- let $t01111511181 = calcStakingFuncAndAddres(stake, assetId)
531- let call = $t01111511181._1
532- let stakingAddr = $t01111511181._2
532+ let $t01113711203 = calcStakingFuncAndAddres(stake, assetId)
533+ let call = $t01113711203._1
534+ let stakingAddr = $t01113711203._2
533535 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
534536 }
535537 else {
536- let $t01126711333 = calcStakingFuncAndAddres(stake, assetId)
537- let call = $t01126711333._1
538- let stakingAddr = $t01126711333._2
538+ let $t01128911355 = calcStakingFuncAndAddres(stake, assetId)
539+ let call = $t01128911355._1
540+ let stakingAddr = $t01128911355._2
539541 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
540542 }
541543
542544
543545 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
544546 then {
545- let $t01152011622 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546- let call = $t01152011622._1
547- let addr = $t01152011622._2
548- let params = $t01152011622._3
549- let payments = $t01152011622._4
547+ let $t01154211644 = calcStakingParams(true, amount, fromBase58String(assetIdString))
548+ let call = $t01154211644._1
549+ let addr = $t01154211644._2
550+ let params = $t01154211644._3
551+ let payments = $t01154211644._4
550552 invoke(addr, call, params, payments)
551553 }
552554 else 0
554556
555557 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
556558 then {
557- let $t01180711910 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558- let call = $t01180711910._1
559- let addr = $t01180711910._2
560- let params = $t01180711910._3
561- let payments = $t01180711910._4
559+ let $t01182911932 = calcStakingParams(false, amount, fromBase58String(assetIdString))
560+ let call = $t01182911932._1
561+ let addr = $t01182911932._2
562+ let params = $t01182911932._3
563+ let payments = $t01182911932._4
562564 invoke(addr, call, params, payments)
563565 }
564566 else 0
587589 func checkSuspicious () = {
588590 let contractBalances = _xp()
589591 func checkBalance (acc,assetId) = {
590- let $t01252112546 = acc
591- let suspicious = $t01252112546._1
592- let i = $t01252112546._2
592+ let $t01254312568 = acc
593+ let suspicious = $t01254312568._1
594+ let i = $t01254312568._2
593595 if (suspicious)
594596 then $Tuple2(suspicious, i)
595597 else {
709711 then 0
710712 else getDMem(xp, amp)
711713 let payments = msg.payments
712- let paymentsSize = size(payments)
713- func validPayments (n) = if ((paymentsSize > nCoins))
714+ let n = size(payments)
715+ func validPayments (n) = if ((n > nCoins))
714716 then throw(("payments size > " + toString(nCoins)))
715- else if ((1 > paymentsSize))
717+ else if ((1 > n))
716718 then throw("payments size < 1")
717719 else if (if ((shareSupply == 0))
718- then (nCoins != paymentsSize)
720+ then (nCoins != n)
719721 else false)
720722 then throw("initial deposit requires all coins")
721723 else {
737739 $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)
738740 }
739741
740- if (!(validPayments(paymentsSize)))
742+ if (!(validPayments(n)))
741743 then throw()
742744 else {
743745 let suspicious = checkSuspicious()
744746 if (suspicious._1)
745747 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
746748 else {
749+ let paymentsSize = size(payments)
747750 func parsePayments (acc,assetId) = {
748- let $t01663416663 = acc
749- let newBalances = $t01663416663._1
750- let i = $t01663416663._2
751- let j = $t01663416663._3
751+ let $t01664016669 = acc
752+ let newBalances = $t01664016669._1
753+ let i = $t01664016669._2
754+ let j = $t01664016669._3
752755 if (if ((paymentsSize > j))
753756 then (getStrAssetId(payments[j].assetId) == assetId)
754757 else false)
755- then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
758+ then {
759+ let s = stake(payments[j].amount, getStrAssetId(payments[j].assetId))
760+ if ((s == s))
761+ then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
762+ else throw("Strict value is not equal to itself.")
763+ }
756764 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
757765 }
758766
759- let $t01688316969 = {
767+ let $t01697517061 = {
760768 let $l = assetIds
761769 let $s = size($l)
762770 let $acc0 = $Tuple3(nil, 0, 0)
770778
771779 $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)
772780 }
773- let newBalances = $t01688316969._1
774- let k = $t01688316969._2
775- let parsedPayments = $t01688316969._3
776- if ((paymentsSize > parsedPayments))
781+ let newBalances = $t01697517061._1
782+ let k = $t01697517061._2
783+ let parsedPayments = $t01697517061._3
784+ if (((paymentsSize - 1) > parsedPayments))
777785 then throw("Incorect payments order")
778786 else if (checkDAppThreshold(newBalances))
779787 then throw()
784792 else {
785793 let feeDiscount = calculateFeeDiscount(msg.caller)
786794 func calcScriptActions (acc,newBalance) = {
787- let $t01737017411 = acc
788- let invBalances = $t01737017411._1
789- let scriptActions = $t01737017411._2
790- let i = $t01737017411._3
795+ let $t01746617507 = acc
796+ let invBalances = $t01746617507._1
797+ let scriptActions = $t01746617507._2
798+ let i = $t01746617507._3
791799 if ((shareSupply > 0))
792800 then {
793801 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
799807 fraction(_fee, difference, feeScale6)
800808 }
801809 let governanceFees = fraction(fees, feeGovernance, feeScale6)
802- let finalBalance = (newBalance - fees)
810+ let finalBalance = (newBalance - governanceFees)
803811 let invariantBalance = (newBalance - fees)
804- let pmt = (newBalance - xp[i])
805- let inv = if ((pmt > 0))
806- then stake((pmt - fees), assetIds[i])
807- else unstake(fees, assetIds[i])
808- $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
812+ let us = unstake(fees, assetIds[i])
813+ if ((us == us))
814+ 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))
815+ else throw("Strict value is not equal to itself.")
809816 }
810817 else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
811818 }
812819
813- let $t01887618964 = {
820+ let $t01884418932 = {
814821 let $l = newBalances
815822 let $s = size($l)
816823 let $acc0 = $Tuple3(nil, nil, 0)
824831
825832 $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)
826833 }
827- let invBalances = $t01887618964._1
828- let scriptActions = $t01887618964._2
834+ let invBalances = $t01884418932._1
835+ let scriptActions = $t01884418932._2
829836 let D2 = getDMem(invBalances, amp)
830837 let mint_amount = if ((shareSupply == 0))
831838 then D1
899906 then throw("Exchange resulted in fewer coins than expected")
900907 else {
901908 func makeNewBalances (acc,tokenBalance) = {
902- let $t02167621702 = acc
903- let newBalances = $t02167621702._1
904- let i = $t02167621702._2
909+ let $t02164421670 = acc
910+ let newBalances = $t02164421670._1
911+ let i = $t02164421670._2
905912 if ((i == fromIndex))
906913 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
907914 else if ((i == toIndex))
909916 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
910917 }
911918
912- let $t02195322014 = {
919+ let $t02192121982 = {
913920 let $l = xp
914921 let $s = size($l)
915922 let $acc0 = $Tuple2(nil, 0)
923930
924931 $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)
925932 }
926- let newBalances = $t02195322014._1
927- let i = $t02195322014._2
933+ let newBalances = $t02192121982._1
934+ let i = $t02192121982._2
928935 if (checkDAppThreshold(newBalances))
929936 then throw()
930937 else {
945952
946953
947954 @Callable(msg)
948-func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
955+func withdraw (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
949956 then throw("size(payments) != 1")
950- else {
951- let pmtAmount = msg.payments[0].amount
952- let pmtAssetId = msg.payments[0].assetId
953- if ((shareAssetId != pmtAssetId))
954- then throw("unknown payment token")
955- else {
956- let suspicious = checkSuspicious()
957- if (suspicious._1)
958- then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
959- else {
960- func calcScriptActions (acc,balance) = {
961- let $t02315523183 = acc
962- let scriptActions = $t02315523183._1
963- let i = $t02315523183._2
964- let wAmount = fraction(balance, pmtAmount, shareSupply)
965- if (assert((wAmount >= minAmounts[i])))
966- then throw("Withdrawal resulted in fewer coins than expected")
967- else {
968- let us = unstake(wAmount, assetIds[i])
969- if ((us == us))
970- then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
971- else throw("Strict value is not equal to itself.")
972- }
973- }
974-
975- let $t02367323741 = {
976- let $l = _xp()
977- let $s = size($l)
978- let $acc0 = $Tuple2(nil, 0)
979- func $f0_1 ($a,$i) = if (($i >= $s))
980- then $a
981- else calcScriptActions($a, $l[$i])
982-
983- func $f0_2 ($a,$i) = if (($i >= $s))
984- then $a
985- else throw("List size exceeds 15")
986-
987- $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)
988- }
989- let scriptActions = $t02367323741._1
990- let i = $t02367323741._2
991- (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
992- }
993- }
994- })
995-
996-
997-
998-@Callable(msg)
999-func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
1000- then throw("Unlock amount must be positive")
1001957 else {
1002958 let suspicious = checkSuspicious()
1003959 if (suspicious._1)
1004960 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
1005961 else {
1006- let pmtAmount = if ((size(msg.payments) > 0))
1007- then if ((size(msg.payments) != 1))
1008- then throw("size(payments) != 1")
1009- else {
1010- let pmtAssetId = msg.payments[0].assetId
1011- if ((shareAssetId != pmtAssetId))
1012- then throw("unknown payment token")
1013- else msg.payments[0].amount
1014- }
1015- else 0
1016- let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1017- if ((unlock == unlock))
1018- then {
1019- let withdrawAmount = (pmtAmount + unlockAmount)
1020- let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
1021- if ((inv == inv))
1022- then nil
962+ let payment = msg.payments[0]
963+ let tokenIn = payment.assetId
964+ if ((tokenIn != shareAssetId))
965+ then throw("unknown token")
966+ else {
967+ let _amount = payment.amount
968+ let total_supply = shareSupply
969+ let unlock = if ((unlockAmount > 0))
970+ then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
971+ else 0
972+ if ((unlock == unlock))
973+ then {
974+ let withdrawAmount = (_amount + unlockAmount)
975+ func calcScriptActions (acc,balance) = {
976+ let $t02336823396 = acc
977+ let scriptActions = $t02336823396._1
978+ let i = $t02336823396._2
979+ let wAmount = fraction(balance, withdrawAmount, total_supply)
980+ if (assert((wAmount >= minAmounts[i])))
981+ then throw("Withdrawal resulted in fewer coins than expected")
982+ else {
983+ let us = unstake(wAmount, assetIds[i])
984+ if ((us == us))
985+ then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
986+ else throw("Strict value is not equal to itself.")
987+ }
988+ }
989+
990+ let $t02388623954 = {
991+ let $l = _xp()
992+ let $s = size($l)
993+ let $acc0 = $Tuple2(nil, 0)
994+ func $f0_1 ($a,$i) = if (($i >= $s))
995+ then $a
996+ else calcScriptActions($a, $l[$i])
997+
998+ func $f0_2 ($a,$i) = if (($i >= $s))
999+ then $a
1000+ else throw("List size exceeds 15")
1001+
1002+ $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)
1003+ }
1004+ let scriptActions = $t02388623954._1
1005+ let i = $t02388623954._2
1006+ (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
1007+ }
10231008 else throw("Strict value is not equal to itself.")
10241009 }
1025- else throw("Strict value is not equal to itself.")
10261010 }
10271011 })
10281012
10371021
10381022
10391023 @Callable(msg)
1040-func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1024+func withdrawOneCoin (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10411025 then throw("size(payments) != 1")
1042- else {
1043- let suspicious = checkSuspicious()
1044- if (suspicious._1)
1045- then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
1046- else {
1047- let pmtAmount = msg.payments[0].amount
1048- let pmtAssetId = msg.payments[0].assetId
1049- if ((pmtAssetId != shareAssetId))
1050- then throw("unknown token")
1051- else {
1052- let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1053- let xp = _xp()
1054- let $t02565525737 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1055- let dy = $t02565525737._1
1056- let dy_fee = $t02565525737._2
1057- if (assert((dy >= minAmount)))
1058- then throw("Not enough coins removed")
1059- else {
1060- let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
1061- let dy_and_fee = (dy + dy_fee)
1062- func makeNewBalances (acc,tokenBalance) = {
1063- let $t02599526021 = acc
1064- let newBalances = $t02599526021._1
1065- let i = $t02599526021._2
1066- if ((i == outIndex))
1067- then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
1068- else $Tuple2((newBalances :+ tokenBalance), (i + 1))
1069- }
1070-
1071- let $t02618826249 = {
1072- let $l = xp
1073- let $s = size($l)
1074- let $acc0 = $Tuple2(nil, 0)
1075- func $f0_1 ($a,$i) = if (($i >= $s))
1076- then $a
1077- else makeNewBalances($a, $l[$i])
1078-
1079- func $f0_2 ($a,$i) = if (($i >= $s))
1080- then $a
1081- else throw("List size exceeds 15")
1082-
1083- $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)
1084- }
1085- let newBalances = $t02618826249._1
1086- let v = $t02618826249._2
1087- if (checkDAppThreshold(newBalances))
1088- then throw()
1089- else {
1090- let us = unstake(dy_and_fee, tokenOut)
1091- if ((us == us))
1092- then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1093- else throw("Strict value is not equal to itself.")
1094- }
1095- }
1096- }
1097- }
1098- })
1099-
1100-
1101-
1102-@Callable(msg)
1103-func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
1104- then throw("Unlock amount must be positive")
11051026 else {
11061027 let suspicious = checkSuspicious()
11071028 if (suspicious._1)
11081029 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11091030 else {
1110- let pmtAmount = if ((size(msg.payments) > 0))
1111- then if ((size(msg.payments) != 1))
1112- then throw("size(payments) != 1")
1113- else {
1114- let pmtAssetId = msg.payments[0].assetId
1115- if ((shareAssetId != pmtAssetId))
1116- then throw("unknown payment token")
1117- else msg.payments[0].amount
1118- }
1119- else 0
1120- let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1121- if ((unlock == unlock))
1122- then {
1123- let withdrawAmount = (pmtAmount + unlockAmount)
1124- let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
1125- if ((inv == inv))
1126- then nil
1031+ let payment = msg.payments[0]
1032+ let tokenIn = payment.assetId
1033+ if ((tokenIn != shareAssetId))
1034+ then throw("unknown token")
1035+ else {
1036+ let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1037+ let _tokenAmount = payment.amount
1038+ let unlock = if ((unlockAmount > 0))
1039+ then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1040+ else 0
1041+ if ((unlock == unlock))
1042+ then {
1043+ let withdrawAmount = (_tokenAmount + unlockAmount)
1044+ let xp = _xp()
1045+ let $t02518525266 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1046+ let dy = $t02518525266._1
1047+ let dy_fee = $t02518525266._2
1048+ if (assert((dy >= minAmount)))
1049+ then throw("Not enough coins removed")
1050+ else {
1051+ let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
1052+ let dy_and_fee = (dy + dy_fee)
1053+ func makeNewBalances (acc,tokenBalance) = {
1054+ let $t02552425550 = acc
1055+ let newBalances = $t02552425550._1
1056+ let i = $t02552425550._2
1057+ if ((i == outIndex))
1058+ then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
1059+ else $Tuple2((newBalances :+ tokenBalance), (i + 1))
1060+ }
1061+
1062+ let $t02571725778 = {
1063+ let $l = xp
1064+ let $s = size($l)
1065+ let $acc0 = $Tuple2(nil, 0)
1066+ func $f0_1 ($a,$i) = if (($i >= $s))
1067+ then $a
1068+ else makeNewBalances($a, $l[$i])
1069+
1070+ func $f0_2 ($a,$i) = if (($i >= $s))
1071+ then $a
1072+ else throw("List size exceeds 15")
1073+
1074+ $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)
1075+ }
1076+ let newBalances = $t02571725778._1
1077+ let i = $t02571725778._2
1078+ if (checkDAppThreshold(newBalances))
1079+ then throw()
1080+ else {
1081+ let us = unstake(dy_and_fee, tokenOut)
1082+ if ((us == us))
1083+ 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))]
1084+ else throw("Strict value is not equal to itself.")
1085+ }
1086+ }
1087+ }
11271088 else throw("Strict value is not equal to itself.")
11281089 }
1129- else throw("Strict value is not equal to itself.")
11301090 }
11311091 })
11321092
11511111 let balances = _xp()
11521112 let D0 = getDMem(balances, amp)
11531113 func calcNewBalances (acc,balance) = {
1154- let $t02817328199 = acc
1155- let newBalances = $t02817328199._1
1156- let i = $t02817328199._2
1114+ let $t02673926765 = acc
1115+ let newBalances = $t02673926765._1
1116+ let i = $t02673926765._2
11571117 let newBalance = (balance + (if (deposit)
11581118 then amounts[i]
11591119 else -(amounts[i])))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let version = "3.0.0"
5+
46 let PRECISION = 1000000
57
68 let MAX_A = 1000000
79
810 let MAX_A_CHANGE = 10
911
1012 let DECIMALS = 6
1113
1214 let MIN_RAMP_TIME = (86400 / 60)
1315
1416 let kAssets = "asset_ids"
1517
1618 let kAssetBalance = "_balance"
1719
1820 let kActive = "active"
1921
2022 let kCause = "shutdown_cause"
2123
2224 let kShareAssetId = "share_asset_id"
2325
2426 let kShareAssetSupply = "share_asset_supply"
2527
2628 let kFee = "commission"
2729
2830 let kDAppThresholdCoef = "dAppThresholdCoef"
2931
3032 let kUSDNAddress = "staking_usdnnsbt_address"
3133
3234 let kDiscounts = "discounts"
3335
3436 let kDiscountValues = "discount_values"
3537
3638 let kUserSwopInGov = "_SWOP_amount"
3739
3840 let kFirstHarvest = "first_harvest"
3941
4042 let kFirstHarvestHeight = "first_harvest_height"
4143
4244 let kShareLimit = "share_limit_on_first_harvest"
4345
4446 let kBasePeriod = "base_period"
4547
4648 let kPeriodLength = "period_length"
4749
4850 let kStartHeight = "start_height"
4951
5052 let kAdminPubKey1 = "admin_pub_1"
5153
5254 let kAdminPubKey2 = "admin_pub_2"
5355
5456 let kAdminPubKey3 = "admin_pub_3"
5557
5658 let kAdminInvokePubKey = "admin_invoke_pub"
5759
5860 let kMoneyBoxAddress = "money_box_address"
5961
6062 let kGovAddress = "governance_address"
6163
6264 let kVotingAddress = "voting_address"
6365
6466 let kFarmingAddress = "farming_address"
6567
6668 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
6769
6870 func getBase58FromOracle (key) = match getString(oracle, key) {
6971 case string: String =>
7072 fromBase58String(string)
7173 case nothing =>
7274 throw((key + "is empty"))
7375 }
7476
7577
7678 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7779
7880 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7981
8082 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8183
8284 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8385
8486 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8587
8688 let govAddress = Address(getBase58FromOracle(kGovAddress))
8789
8890 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8991
9092 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9193
9294 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9395
9496 let capMoneyBoxAddress = Address(base58'3MxXHaGvmKQHH3kNrPBunhve1sDXf7M5RZt')
9597
9698 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
9799
98100 let stakingAssets = [toBase58String(USDN)]
99101
100102 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
101103
102104 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
103105
104106 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
105107
106108 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
107109
108110 let active = getBooleanValue(this, kActive)
109111
110112 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
111113
112114 let shareSupply = getIntegerValue(this, kShareAssetSupply)
113115
114116 let feeScale6 = 1000000
115117
116118 let fee = getIntegerValue(this, kFee)
117119
118120 let feeGovernance = fraction(40, feeScale6, 100)
119121
120122 let initial_A = getIntegerValue(this, "initial_A")
121123
122124 let future_A = getIntegerValue(this, "future_A")
123125
124126 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
125127
126128 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
127129
128130 let assetIds = split(getStringValue(this, kAssets), ",")
129131
130132 let nCoins = size(assetIds)
131133
132134 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
133135
134136
135137 func throwIsActive () = throw("DApp is already active")
136138
137139
138140 func isActive () = if (active)
139141 then unit
140142 else throw("DApp is inactive at this moment")
141143
142144
143145 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
144146 then unit
145147 else throw("Only admin can call this function")
146148
147149
148150 func isSelfCall (i) = if ((this == i.caller))
149151 then unit
150152 else throw("Only contract itself can call this function")
151153
152154
153155 let big2 = toBigInt(2)
154156
155157 let blockTimestamp = height
156158
157159 func assert (a) = if (a)
158160 then false
159161 else true
160162
161163
162164 func calculateFeeDiscount (userAddr) = {
163165 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
164166 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
165167 let discounts = split(getStringValue(oracle, kDiscounts), ",")
166168 if (if ((swopAmount >= parseIntValue(discountValues[0])))
167169 then (parseIntValue(discountValues[1]) > swopAmount)
168170 else false)
169171 then (feeScale6 - parseIntValue(discounts[0]))
170172 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
171173 then (parseIntValue(discountValues[2]) > swopAmount)
172174 else false)
173175 then (feeScale6 - parseIntValue(discounts[1]))
174176 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
175177 then (parseIntValue(discountValues[3]) > swopAmount)
176178 else false)
177179 then (feeScale6 - parseIntValue(discounts[2]))
178180 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
179181 then (parseIntValue(discountValues[4]) > swopAmount)
180182 else false)
181183 then (feeScale6 - parseIntValue(discounts[3]))
182184 else if ((swopAmount >= parseIntValue(discountValues[4])))
183185 then (feeScale6 - parseIntValue(discounts[4]))
184186 else feeScale6
185187 }
186188
187189
188190 func _A () = {
189191 let t1 = future_A_time
190192 let A1 = future_A
191193 if ((t1 > blockTimestamp))
192194 then {
193195 let A0 = initial_A
194196 let t0 = initial_A_time
195197 if ((A1 > A0))
196198 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
197199 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
198200 }
199201 else A1
200202 }
201203
202204
203205 func _xp () = {
204206 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
205207
206208 let $l = assetIds
207209 let $s = size($l)
208210 let $acc0 = nil
209211 func $f0_1 ($a,$i) = if (($i >= $s))
210212 then $a
211213 else assetBalances($a, $l[$i])
212214
213215 func $f0_2 ($a,$i) = if (($i >= $s))
214216 then $a
215217 else throw("List size exceeds 15")
216218
217219 $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)
218220 }
219221
220222
221223 func _xp_mem (xp) = xp
222224
223225
224226 func sumList (acc,element) = (acc + element)
225227
226228
227229 func get_D (xp,amp) = {
228230 let @ = invoke(this, "D", [xp, amp], nil)
229231 if ($isInstanceOf(@, "Int"))
230232 then @
231233 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
232234 }
233235
234236
235237 func get_D_internal (xp,amp) = {
236238 let S = {
237239 let $l = xp
238240 let $s = size($l)
239241 let $acc0 = 0
240242 func $f0_1 ($a,$i) = if (($i >= $s))
241243 then $a
242244 else sumList($a, $l[$i])
243245
244246 func $f0_2 ($a,$i) = if (($i >= $s))
245247 then $a
246248 else throw("List size exceeds 15")
247249
248250 $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)
249251 }
250252 if ((S == 0))
251253 then 0
252254 else {
253255 let Ann = (amp * nCoins)
254256 let AnnS = (toBigInt(Ann) * toBigInt(S))
255257 let Ann1 = toBigInt((Ann - 1))
256258 func Dproc (acc,i) = if ((acc._2 == true))
257259 then acc
258260 else {
259261 let Dprev = acc._1
260262 func D_PProc (D_P,i) = if ((nCoins > i))
261263 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
262264 else D_P
263265
264266 let D_P = {
265267 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
266268 let $s = size($l)
267269 let $acc0 = Dprev
268270 func $f1_1 ($a,$i) = if (($i >= $s))
269271 then $a
270272 else D_PProc($a, $l[$i])
271273
272274 func $f1_2 ($a,$i) = if (($i >= $s))
273275 then $a
274276 else throw("List size exceeds 15")
275277
276278 $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)
277279 }
278280 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
279281 if ((D > Dprev))
280282 then if ((1 >= toInt((D - Dprev))))
281283 then $Tuple2(D, true)
282284 else $Tuple2(D, false)
283285 else if ((1 >= toInt((Dprev - D))))
284286 then $Tuple2(D, true)
285287 else $Tuple2(D, false)
286288 }
287289
288- let $t066286740 = {
290+ let $t066506762 = {
289291 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
290292 let $s = size($l)
291293 let $acc0 = $Tuple2(toBigInt(S), false)
292294 func $f1_1 ($a,$i) = if (($i >= $s))
293295 then $a
294296 else Dproc($a, $l[$i])
295297
296298 func $f1_2 ($a,$i) = if (($i >= $s))
297299 then $a
298300 else throw("List size exceeds 15")
299301
300302 $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)
301303 }
302- let D = $t066286740._1
303- let finished = $t066286740._2
304+ let D = $t066506762._1
305+ let finished = $t066506762._2
304306 if ((finished == false))
305307 then throw(("get_D() not finished with " + toString(D)))
306308 else toInt(D)
307309 }
308310 }
309311
310312
311313 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
312314
313315
314316 func getY (in,out,x,xp_) = if (assert((in != out)))
315317 then throw("same coin")
316318 else if (assert(if ((out >= 0))
317319 then (in >= 0)
318320 else false))
319321 then throw("below zero")
320322 else if (assert(if ((nCoins > out))
321323 then (nCoins > in)
322324 else false))
323325 then throw("above N_COINS")
324326 else {
325327 let amp = _A()
326328 let D = get_D(xp_, amp)
327329 let Ann = (amp * nCoins)
328330 func S_c (acc,i) = {
329- let $t073117328 = acc
330- let S_ = $t073117328._1
331- let c = $t073117328._2
331+ let $t073337350 = acc
332+ let S_ = $t073337350._1
333+ let c = $t073337350._2
332334 let x_ = if ((in == i))
333335 then x
334336 else xp_[i]
335337 if (if ((i != out))
336338 then (nCoins > i)
337339 else false)
338340 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
339341 else $Tuple2(S_, c)
340342 }
341343
342- let $t075367637 = {
344+ let $t075587659 = {
343345 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
344346 let $s = size($l)
345347 let $acc0 = $Tuple2(0, toBigInt(D))
346348 func $f0_1 ($a,$i) = if (($i >= $s))
347349 then $a
348350 else S_c($a, $l[$i])
349351
350352 func $f0_2 ($a,$i) = if (($i >= $s))
351353 then $a
352354 else throw("List size exceeds 15")
353355
354356 $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)
355357 }
356- let S_ = $t075367637._1
357- let c_ = $t075367637._2
358+ let S_ = $t075587659._1
359+ let c_ = $t075587659._2
358360 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
359361 let bD = toBigInt(((S_ + (D / Ann)) - D))
360362 func y_proc (acc,_i) = if ((acc._2 == true))
361363 then acc
362364 else {
363365 let y_prev = acc._1
364366 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
365367 if ((y > y_prev))
366368 then if ((1 >= toInt((y - y_prev))))
367369 then $Tuple2(y, true)
368370 else $Tuple2(y, false)
369371 else if ((1 >= toInt((y_prev - y))))
370372 then $Tuple2(y, true)
371373 else $Tuple2(y, false)
372374 }
373375
374- let $t081198236 = {
376+ let $t081418258 = {
375377 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
376378 let $s = size($l)
377379 let $acc0 = $Tuple2(toBigInt(D), false)
378380 func $f1_1 ($a,$i) = if (($i >= $s))
379381 then $a
380382 else y_proc($a, $l[$i])
381383
382384 func $f1_2 ($a,$i) = if (($i >= $s))
383385 then $a
384386 else throw("List size exceeds 16")
385387
386388 $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)
387389 }
388- let y = $t081198236._1
389- let finished = $t081198236._2
390+ let y = $t081418258._1
391+ let finished = $t081418258._2
390392 if ((finished == false))
391393 then throw(("getY() not finished with " + toString(y)))
392394 else toInt(y)
393395 }
394396
395397
396398 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
397399 then throw("i below zero")
398400 else if (assert((nCoins > in)))
399401 then throw("i above N_COINS")
400402 else {
401403 let Ann = (A_ * nCoins)
402404 func S_c (acc,i) = {
403- let $t086158632 = acc
404- let S_ = $t086158632._1
405- let c = $t086158632._2
405+ let $t086378654 = acc
406+ let S_ = $t086378654._1
407+ let c = $t086378654._2
406408 let x_ = if (if ((in != i))
407409 then (nCoins > i)
408410 else false)
409411 then xp[i]
410412 else 0
411413 if (if ((nCoins > i))
412414 then (in != i)
413415 else false)
414416 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
415417 else $Tuple2(S_, c)
416418 }
417419
418- let $t088528953 = {
420+ let $t088748975 = {
419421 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
420422 let $s = size($l)
421423 let $acc0 = $Tuple2(0, toBigInt(D))
422424 func $f0_1 ($a,$i) = if (($i >= $s))
423425 then $a
424426 else S_c($a, $l[$i])
425427
426428 func $f0_2 ($a,$i) = if (($i >= $s))
427429 then $a
428430 else throw("List size exceeds 15")
429431
430432 $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)
431433 }
432- let S_ = $t088528953._1
433- let c_ = $t088528953._2
434+ let S_ = $t088748975._1
435+ let c_ = $t088748975._2
434436 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
435437 let bD = toBigInt(((S_ + (D / Ann)) - D))
436438 func y_D_proc (acc,i) = if ((acc._2 == true))
437439 then acc
438440 else {
439441 let y_prev = acc._1
440442 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
441443 if ((y > y_prev))
442444 then if ((1 >= toInt((y - y_prev))))
443445 then $Tuple2(y, true)
444446 else $Tuple2(y, false)
445447 else if ((1 >= toInt((y_prev - y))))
446448 then $Tuple2(y, true)
447449 else $Tuple2(y, false)
448450 }
449451
450- let $t094369555 = {
452+ let $t094589577 = {
451453 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
452454 let $s = size($l)
453455 let $acc0 = $Tuple2(toBigInt(D), false)
454456 func $f1_1 ($a,$i) = if (($i >= $s))
455457 then $a
456458 else y_D_proc($a, $l[$i])
457459
458460 func $f1_2 ($a,$i) = if (($i >= $s))
459461 then $a
460462 else throw("List size exceeds 16")
461463
462464 $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)
463465 }
464- let y = $t094369555._1
465- let finished = $t094369555._2
466+ let y = $t094589577._1
467+ let finished = $t094589577._2
466468 if ((finished == false))
467469 then throw(("get_y_D() not finished with " + toString(y)))
468470 else toInt(y)
469471 }
470472
471473
472474 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
473475 let feeDiscount = calculateFeeDiscount(caller)
474476 let amp = _A()
475477 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
476478 let total_supply = shareSupply
477479 let D0 = get_D(xp, amp)
478480 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
479481 let new_y = get_y_D(amp, i, xp, D1)
480482 let dy_0 = (xp[i] - new_y)
481483 func xp_reduced_proc (acc,xp_j) = {
482- let $t01019610225 = acc
483- let xp_reduced = $t01019610225._1
484- let index = $t01019610225._2
484+ let $t01021810247 = acc
485+ let xp_reduced = $t01021810247._1
486+ let index = $t01021810247._2
485487 let dx_expected = if ((index == i))
486488 then (fraction(xp_j, D1, D0) - new_y)
487489 else (xp_j - fraction(xp_j, D1, D0))
488490 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
489491 }
490492
491- let $t01048710551 = {
493+ let $t01050910573 = {
492494 let $l = xp
493495 let $s = size($l)
494496 let $acc0 = $Tuple2(nil, 0)
495497 func $f0_1 ($a,$i) = if (($i >= $s))
496498 then $a
497499 else xp_reduced_proc($a, $l[$i])
498500
499501 func $f0_2 ($a,$i) = if (($i >= $s))
500502 then $a
501503 else throw("List size exceeds 15")
502504
503505 $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)
504506 }
505- let xp_reduced = $t01048710551._1
506- let index = $t01048710551._2
507+ let xp_reduced = $t01050910573._1
508+ let index = $t01050910573._2
507509 let xp_reduced_i = xp_reduced[i]
508510 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
509511 $Tuple2(dy, (dy_0 - dy))
510512 }
511513
512514
513515 func getStrAssetId (assetId) = match assetId {
514516 case id: ByteVector =>
515517 toBase58String(id)
516518 case waves: Unit =>
517519 "WAVES"
518520 case _ =>
519521 throw("Match error")
520522 }
521523
522524
523525 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
524526 then $Tuple2("lockNeutrino", stakingUSDNAddress)
525527 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
526528
527529
528530 func calcStakingParams (stake,amount,assetId) = if (stake)
529531 then {
530- let $t01111511181 = calcStakingFuncAndAddres(stake, assetId)
531- let call = $t01111511181._1
532- let stakingAddr = $t01111511181._2
532+ let $t01113711203 = calcStakingFuncAndAddres(stake, assetId)
533+ let call = $t01113711203._1
534+ let stakingAddr = $t01113711203._2
533535 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
534536 }
535537 else {
536- let $t01126711333 = calcStakingFuncAndAddres(stake, assetId)
537- let call = $t01126711333._1
538- let stakingAddr = $t01126711333._2
538+ let $t01128911355 = calcStakingFuncAndAddres(stake, assetId)
539+ let call = $t01128911355._1
540+ let stakingAddr = $t01128911355._2
539541 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
540542 }
541543
542544
543545 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
544546 then {
545- let $t01152011622 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546- let call = $t01152011622._1
547- let addr = $t01152011622._2
548- let params = $t01152011622._3
549- let payments = $t01152011622._4
547+ let $t01154211644 = calcStakingParams(true, amount, fromBase58String(assetIdString))
548+ let call = $t01154211644._1
549+ let addr = $t01154211644._2
550+ let params = $t01154211644._3
551+ let payments = $t01154211644._4
550552 invoke(addr, call, params, payments)
551553 }
552554 else 0
553555
554556
555557 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
556558 then {
557- let $t01180711910 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558- let call = $t01180711910._1
559- let addr = $t01180711910._2
560- let params = $t01180711910._3
561- let payments = $t01180711910._4
559+ let $t01182911932 = calcStakingParams(false, amount, fromBase58String(assetIdString))
560+ let call = $t01182911932._1
561+ let addr = $t01182911932._2
562+ let params = $t01182911932._3
563+ let payments = $t01182911932._4
562564 invoke(addr, call, params, payments)
563565 }
564566 else 0
565567
566568
567569 func stakedAmount (assetId) = {
568570 let stakedAmountCalculated = match assetId {
569571 case aId: ByteVector =>
570572 if ((aId == USDN))
571573 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
572574 else 0
573575 case _: Unit =>
574576 0
575577 case _ =>
576578 throw("Match error")
577579 }
578580 match stakedAmountCalculated {
579581 case i: Int =>
580582 i
581583 case _ =>
582584 0
583585 }
584586 }
585587
586588
587589 func checkSuspicious () = {
588590 let contractBalances = _xp()
589591 func checkBalance (acc,assetId) = {
590- let $t01252112546 = acc
591- let suspicious = $t01252112546._1
592- let i = $t01252112546._2
592+ let $t01254312568 = acc
593+ let suspicious = $t01254312568._1
594+ let i = $t01254312568._2
593595 if (suspicious)
594596 then $Tuple2(suspicious, i)
595597 else {
596598 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
597599 if ((contractBalances[i] > aBalance))
598600 then $Tuple2(true, i)
599601 else $Tuple2(false, (i + 1))
600602 }
601603 }
602604
603605 let $l = assetIds
604606 let $s = size($l)
605607 let $acc0 = $Tuple2(false, 0)
606608 func $f0_1 ($a,$i) = if (($i >= $s))
607609 then $a
608610 else checkBalance($a, $l[$i])
609611
610612 func $f0_2 ($a,$i) = if (($i >= $s))
611613 then $a
612614 else throw("List size exceeds 15")
613615
614616 $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)
615617 }
616618
617619
618620 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
619621
620622
621623 func returnPayments (caller,payments) = {
622624 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
623625
624626 let $l = payments
625627 let $s = size($l)
626628 let $acc0 = nil
627629 func $f0_1 ($a,$i) = if (($i >= $s))
628630 then $a
629631 else parsePayments($a, $l[$i])
630632
631633 func $f0_2 ($a,$i) = if (($i >= $s))
632634 then $a
633635 else throw("List size exceeds 15")
634636
635637 $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)
636638 }
637639
638640
639641 func checkDAppThreshold (newBalances) = {
640642 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
641643 let thresholdScale = 10000
642644 let maxBalance = max(newBalances)
643645 let minBalance = min(newBalances)
644646 let ratio = fraction(maxBalance, thresholdScale, minBalance)
645647 if ((ratio > (dAppThresholdCoef * thresholdScale)))
646648 then throw("New balance in assets of the DApp is less than threshold")
647649 else false
648650 }
649651
650652
651653 func checkCoins (assetIds) = {
652654 let coins = split(assetIds, ",")
653655 func checkCoin (error,assetId) = {
654656 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
655657 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
656658 if ((decimals != DECIMALS))
657659 then throw("wrong decimals")
658660 else false
659661 }
660662
661663 let $l = coins
662664 let $s = size($l)
663665 let $acc0 = false
664666 func $f0_1 ($a,$i) = if (($i >= $s))
665667 then $a
666668 else checkCoin($a, $l[$i])
667669
668670 func $f0_2 ($a,$i) = if (($i >= $s))
669671 then $a
670672 else throw("List size exceeds 15")
671673
672674 $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)
673675 }
674676
675677
676678 @Callable(msg)
677679 func D (xp,amp) = {
678680 let D = get_D_internal(xp, amp)
679681 $Tuple2([IntegerEntry("D", D)], D)
680682 }
681683
682684
683685
684686 @Callable(msg)
685687 func init (assetIds,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
686688 then throw("Already initialized")
687689 else {
688690 let shareName = "s_Multi_USD"
689691 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
690692 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
691693 let tokenId = calculateAssetId(issueToken)
692694 if (checkCoins(assetIds))
693695 then throw()
694696 else {
695697 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]
696698 if (firstHarvest)
697699 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
698700 else baseEntry
699701 }
700702 }
701703
702704
703705
704706 @Callable(msg)
705707 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
706708 let amp = _A()
707709 let xp = _xp()
708710 let D0 = if ((shareSupply == 0))
709711 then 0
710712 else getDMem(xp, amp)
711713 let payments = msg.payments
712- let paymentsSize = size(payments)
713- func validPayments (n) = if ((paymentsSize > nCoins))
714+ let n = size(payments)
715+ func validPayments (n) = if ((n > nCoins))
714716 then throw(("payments size > " + toString(nCoins)))
715- else if ((1 > paymentsSize))
717+ else if ((1 > n))
716718 then throw("payments size < 1")
717719 else if (if ((shareSupply == 0))
718- then (nCoins != paymentsSize)
720+ then (nCoins != n)
719721 else false)
720722 then throw("initial deposit requires all coins")
721723 else {
722724 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
723725 then true
724726 else throw("Invalid asset in payment")
725727
726728 let $l = payments
727729 let $s = size($l)
728730 let $acc0 = false
729731 func $f0_1 ($a,$i) = if (($i >= $s))
730732 then $a
731733 else paymantValid($a, $l[$i])
732734
733735 func $f0_2 ($a,$i) = if (($i >= $s))
734736 then $a
735737 else throw("List size exceeds 15")
736738
737739 $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)
738740 }
739741
740- if (!(validPayments(paymentsSize)))
742+ if (!(validPayments(n)))
741743 then throw()
742744 else {
743745 let suspicious = checkSuspicious()
744746 if (suspicious._1)
745747 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
746748 else {
749+ let paymentsSize = size(payments)
747750 func parsePayments (acc,assetId) = {
748- let $t01663416663 = acc
749- let newBalances = $t01663416663._1
750- let i = $t01663416663._2
751- let j = $t01663416663._3
751+ let $t01664016669 = acc
752+ let newBalances = $t01664016669._1
753+ let i = $t01664016669._2
754+ let j = $t01664016669._3
752755 if (if ((paymentsSize > j))
753756 then (getStrAssetId(payments[j].assetId) == assetId)
754757 else false)
755- then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
758+ then {
759+ let s = stake(payments[j].amount, getStrAssetId(payments[j].assetId))
760+ if ((s == s))
761+ then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
762+ else throw("Strict value is not equal to itself.")
763+ }
756764 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
757765 }
758766
759- let $t01688316969 = {
767+ let $t01697517061 = {
760768 let $l = assetIds
761769 let $s = size($l)
762770 let $acc0 = $Tuple3(nil, 0, 0)
763771 func $f0_1 ($a,$i) = if (($i >= $s))
764772 then $a
765773 else parsePayments($a, $l[$i])
766774
767775 func $f0_2 ($a,$i) = if (($i >= $s))
768776 then $a
769777 else throw("List size exceeds 15")
770778
771779 $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)
772780 }
773- let newBalances = $t01688316969._1
774- let k = $t01688316969._2
775- let parsedPayments = $t01688316969._3
776- if ((paymentsSize > parsedPayments))
781+ let newBalances = $t01697517061._1
782+ let k = $t01697517061._2
783+ let parsedPayments = $t01697517061._3
784+ if (((paymentsSize - 1) > parsedPayments))
777785 then throw("Incorect payments order")
778786 else if (checkDAppThreshold(newBalances))
779787 then throw()
780788 else {
781789 let D1 = getDMem(newBalances, amp)
782790 if (assert((D1 > D0)))
783791 then throw("D1 > D0")
784792 else {
785793 let feeDiscount = calculateFeeDiscount(msg.caller)
786794 func calcScriptActions (acc,newBalance) = {
787- let $t01737017411 = acc
788- let invBalances = $t01737017411._1
789- let scriptActions = $t01737017411._2
790- let i = $t01737017411._3
795+ let $t01746617507 = acc
796+ let invBalances = $t01746617507._1
797+ let scriptActions = $t01746617507._2
798+ let i = $t01746617507._3
791799 if ((shareSupply > 0))
792800 then {
793801 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
794802 let fees = {
795803 let idealBalance = fraction(D1, xp[i], D0)
796804 let difference = if ((idealBalance > newBalance))
797805 then (idealBalance - newBalance)
798806 else (newBalance - idealBalance)
799807 fraction(_fee, difference, feeScale6)
800808 }
801809 let governanceFees = fraction(fees, feeGovernance, feeScale6)
802- let finalBalance = (newBalance - fees)
810+ let finalBalance = (newBalance - governanceFees)
803811 let invariantBalance = (newBalance - fees)
804- let pmt = (newBalance - xp[i])
805- let inv = if ((pmt > 0))
806- then stake((pmt - fees), assetIds[i])
807- else unstake(fees, assetIds[i])
808- $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
812+ let us = unstake(fees, assetIds[i])
813+ if ((us == us))
814+ 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))
815+ else throw("Strict value is not equal to itself.")
809816 }
810817 else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
811818 }
812819
813- let $t01887618964 = {
820+ let $t01884418932 = {
814821 let $l = newBalances
815822 let $s = size($l)
816823 let $acc0 = $Tuple3(nil, nil, 0)
817824 func $f1_1 ($a,$i) = if (($i >= $s))
818825 then $a
819826 else calcScriptActions($a, $l[$i])
820827
821828 func $f1_2 ($a,$i) = if (($i >= $s))
822829 then $a
823830 else throw("List size exceeds 15")
824831
825832 $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)
826833 }
827- let invBalances = $t01887618964._1
828- let scriptActions = $t01887618964._2
834+ let invBalances = $t01884418932._1
835+ let scriptActions = $t01884418932._2
829836 let D2 = getDMem(invBalances, amp)
830837 let mint_amount = if ((shareSupply == 0))
831838 then D1
832839 else fraction(shareSupply, (D2 - D0), D0)
833840 if (assert((mint_amount >= minMintAmount)))
834841 then throw("Slippage screwed you")
835842 else if (stakeFarming)
836843 then {
837844 let re = invoke(this, "reissueShare", [mint_amount], nil)
838845 if ((re == re))
839846 then {
840847 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
841848 if ((s == s))
842849 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
843850 else throw("Strict value is not equal to itself.")
844851 }
845852 else throw("Strict value is not equal to itself.")
846853 }
847854 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
848855 }
849856 }
850857 }
851858 }
852859 })
853860
854861
855862
856863 @Callable(msg)
857864 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
858865
859866
860867
861868 @Callable(msg)
862869 func getDy (assetFrom,assetTo,dx,userAddress) = {
863870 let xp = _xp()
864871 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
865872 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
866873 let x = (xp[fromIndex] + dx)
867874 let y = getY(fromIndex, toIndex, x, xp)
868875 let dy = ((xp[toIndex] - y) - 1)
869876 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
870877 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
871878 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
872879 }
873880
874881
875882
876883 @Callable(msg)
877884 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
878885 then throw("size(payments) != 1")
879886 else {
880887 let suspicious = checkSuspicious()
881888 if (suspicious._1)
882889 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
883890 else {
884891 let payment = msg.payments[0]
885892 let tokenIn = getStrAssetId(payment.assetId)
886893 let tokenOutB58 = fromBase58String(tokenOut)
887894 let dx = payment.amount
888895 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
889896 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
890897 let xp = _xp()
891898 let x = (xp[fromIndex] + dx)
892899 let y = getY(fromIndex, toIndex, x, xp)
893900 let _dy = ((xp[toIndex] - y) - 1)
894901 let feeDiscount = calculateFeeDiscount(msg.caller)
895902 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
896903 let dy = (_dy - _fee)
897904 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
898905 if (assert((dy >= min_dy)))
899906 then throw("Exchange resulted in fewer coins than expected")
900907 else {
901908 func makeNewBalances (acc,tokenBalance) = {
902- let $t02167621702 = acc
903- let newBalances = $t02167621702._1
904- let i = $t02167621702._2
909+ let $t02164421670 = acc
910+ let newBalances = $t02164421670._1
911+ let i = $t02164421670._2
905912 if ((i == fromIndex))
906913 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
907914 else if ((i == toIndex))
908915 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
909916 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
910917 }
911918
912- let $t02195322014 = {
919+ let $t02192121982 = {
913920 let $l = xp
914921 let $s = size($l)
915922 let $acc0 = $Tuple2(nil, 0)
916923 func $f0_1 ($a,$i) = if (($i >= $s))
917924 then $a
918925 else makeNewBalances($a, $l[$i])
919926
920927 func $f0_2 ($a,$i) = if (($i >= $s))
921928 then $a
922929 else throw("List size exceeds 15")
923930
924931 $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)
925932 }
926- let newBalances = $t02195322014._1
927- let i = $t02195322014._2
933+ let newBalances = $t02192121982._1
934+ let i = $t02192121982._2
928935 if (checkDAppThreshold(newBalances))
929936 then throw()
930937 else {
931938 let s = stake(payment.amount, getStrAssetId(payment.assetId))
932939 if ((s == s))
933940 then {
934941 let us = unstake(_dy, tokenOut)
935942 if ((us == us))
936943 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], $Tuple2(dy, tokenOutB58))
937944 else throw("Strict value is not equal to itself.")
938945 }
939946 else throw("Strict value is not equal to itself.")
940947 }
941948 }
942949 }
943950 })
944951
945952
946953
947954 @Callable(msg)
948-func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
955+func withdraw (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
949956 then throw("size(payments) != 1")
950- else {
951- let pmtAmount = msg.payments[0].amount
952- let pmtAssetId = msg.payments[0].assetId
953- if ((shareAssetId != pmtAssetId))
954- then throw("unknown payment token")
955- else {
956- let suspicious = checkSuspicious()
957- if (suspicious._1)
958- then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
959- else {
960- func calcScriptActions (acc,balance) = {
961- let $t02315523183 = acc
962- let scriptActions = $t02315523183._1
963- let i = $t02315523183._2
964- let wAmount = fraction(balance, pmtAmount, shareSupply)
965- if (assert((wAmount >= minAmounts[i])))
966- then throw("Withdrawal resulted in fewer coins than expected")
967- else {
968- let us = unstake(wAmount, assetIds[i])
969- if ((us == us))
970- then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
971- else throw("Strict value is not equal to itself.")
972- }
973- }
974-
975- let $t02367323741 = {
976- let $l = _xp()
977- let $s = size($l)
978- let $acc0 = $Tuple2(nil, 0)
979- func $f0_1 ($a,$i) = if (($i >= $s))
980- then $a
981- else calcScriptActions($a, $l[$i])
982-
983- func $f0_2 ($a,$i) = if (($i >= $s))
984- then $a
985- else throw("List size exceeds 15")
986-
987- $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)
988- }
989- let scriptActions = $t02367323741._1
990- let i = $t02367323741._2
991- (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
992- }
993- }
994- })
995-
996-
997-
998-@Callable(msg)
999-func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
1000- then throw("Unlock amount must be positive")
1001957 else {
1002958 let suspicious = checkSuspicious()
1003959 if (suspicious._1)
1004960 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
1005961 else {
1006- let pmtAmount = if ((size(msg.payments) > 0))
1007- then if ((size(msg.payments) != 1))
1008- then throw("size(payments) != 1")
1009- else {
1010- let pmtAssetId = msg.payments[0].assetId
1011- if ((shareAssetId != pmtAssetId))
1012- then throw("unknown payment token")
1013- else msg.payments[0].amount
1014- }
1015- else 0
1016- let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1017- if ((unlock == unlock))
1018- then {
1019- let withdrawAmount = (pmtAmount + unlockAmount)
1020- let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
1021- if ((inv == inv))
1022- then nil
962+ let payment = msg.payments[0]
963+ let tokenIn = payment.assetId
964+ if ((tokenIn != shareAssetId))
965+ then throw("unknown token")
966+ else {
967+ let _amount = payment.amount
968+ let total_supply = shareSupply
969+ let unlock = if ((unlockAmount > 0))
970+ then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
971+ else 0
972+ if ((unlock == unlock))
973+ then {
974+ let withdrawAmount = (_amount + unlockAmount)
975+ func calcScriptActions (acc,balance) = {
976+ let $t02336823396 = acc
977+ let scriptActions = $t02336823396._1
978+ let i = $t02336823396._2
979+ let wAmount = fraction(balance, withdrawAmount, total_supply)
980+ if (assert((wAmount >= minAmounts[i])))
981+ then throw("Withdrawal resulted in fewer coins than expected")
982+ else {
983+ let us = unstake(wAmount, assetIds[i])
984+ if ((us == us))
985+ then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
986+ else throw("Strict value is not equal to itself.")
987+ }
988+ }
989+
990+ let $t02388623954 = {
991+ let $l = _xp()
992+ let $s = size($l)
993+ let $acc0 = $Tuple2(nil, 0)
994+ func $f0_1 ($a,$i) = if (($i >= $s))
995+ then $a
996+ else calcScriptActions($a, $l[$i])
997+
998+ func $f0_2 ($a,$i) = if (($i >= $s))
999+ then $a
1000+ else throw("List size exceeds 15")
1001+
1002+ $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)
1003+ }
1004+ let scriptActions = $t02388623954._1
1005+ let i = $t02388623954._2
1006+ (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
1007+ }
10231008 else throw("Strict value is not equal to itself.")
10241009 }
1025- else throw("Strict value is not equal to itself.")
10261010 }
10271011 })
10281012
10291013
10301014
10311015 @Callable(msg)
10321016 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
10331017 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10341018 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
10351019 }
10361020
10371021
10381022
10391023 @Callable(msg)
1040-func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1024+func withdrawOneCoin (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10411025 then throw("size(payments) != 1")
1042- else {
1043- let suspicious = checkSuspicious()
1044- if (suspicious._1)
1045- then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
1046- else {
1047- let pmtAmount = msg.payments[0].amount
1048- let pmtAssetId = msg.payments[0].assetId
1049- if ((pmtAssetId != shareAssetId))
1050- then throw("unknown token")
1051- else {
1052- let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1053- let xp = _xp()
1054- let $t02565525737 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1055- let dy = $t02565525737._1
1056- let dy_fee = $t02565525737._2
1057- if (assert((dy >= minAmount)))
1058- then throw("Not enough coins removed")
1059- else {
1060- let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
1061- let dy_and_fee = (dy + dy_fee)
1062- func makeNewBalances (acc,tokenBalance) = {
1063- let $t02599526021 = acc
1064- let newBalances = $t02599526021._1
1065- let i = $t02599526021._2
1066- if ((i == outIndex))
1067- then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
1068- else $Tuple2((newBalances :+ tokenBalance), (i + 1))
1069- }
1070-
1071- let $t02618826249 = {
1072- let $l = xp
1073- let $s = size($l)
1074- let $acc0 = $Tuple2(nil, 0)
1075- func $f0_1 ($a,$i) = if (($i >= $s))
1076- then $a
1077- else makeNewBalances($a, $l[$i])
1078-
1079- func $f0_2 ($a,$i) = if (($i >= $s))
1080- then $a
1081- else throw("List size exceeds 15")
1082-
1083- $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)
1084- }
1085- let newBalances = $t02618826249._1
1086- let v = $t02618826249._2
1087- if (checkDAppThreshold(newBalances))
1088- then throw()
1089- else {
1090- let us = unstake(dy_and_fee, tokenOut)
1091- if ((us == us))
1092- then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1093- else throw("Strict value is not equal to itself.")
1094- }
1095- }
1096- }
1097- }
1098- })
1099-
1100-
1101-
1102-@Callable(msg)
1103-func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
1104- then throw("Unlock amount must be positive")
11051026 else {
11061027 let suspicious = checkSuspicious()
11071028 if (suspicious._1)
11081029 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11091030 else {
1110- let pmtAmount = if ((size(msg.payments) > 0))
1111- then if ((size(msg.payments) != 1))
1112- then throw("size(payments) != 1")
1113- else {
1114- let pmtAssetId = msg.payments[0].assetId
1115- if ((shareAssetId != pmtAssetId))
1116- then throw("unknown payment token")
1117- else msg.payments[0].amount
1118- }
1119- else 0
1120- let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1121- if ((unlock == unlock))
1122- then {
1123- let withdrawAmount = (pmtAmount + unlockAmount)
1124- let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
1125- if ((inv == inv))
1126- then nil
1031+ let payment = msg.payments[0]
1032+ let tokenIn = payment.assetId
1033+ if ((tokenIn != shareAssetId))
1034+ then throw("unknown token")
1035+ else {
1036+ let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1037+ let _tokenAmount = payment.amount
1038+ let unlock = if ((unlockAmount > 0))
1039+ then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1040+ else 0
1041+ if ((unlock == unlock))
1042+ then {
1043+ let withdrawAmount = (_tokenAmount + unlockAmount)
1044+ let xp = _xp()
1045+ let $t02518525266 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1046+ let dy = $t02518525266._1
1047+ let dy_fee = $t02518525266._2
1048+ if (assert((dy >= minAmount)))
1049+ then throw("Not enough coins removed")
1050+ else {
1051+ let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
1052+ let dy_and_fee = (dy + dy_fee)
1053+ func makeNewBalances (acc,tokenBalance) = {
1054+ let $t02552425550 = acc
1055+ let newBalances = $t02552425550._1
1056+ let i = $t02552425550._2
1057+ if ((i == outIndex))
1058+ then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
1059+ else $Tuple2((newBalances :+ tokenBalance), (i + 1))
1060+ }
1061+
1062+ let $t02571725778 = {
1063+ let $l = xp
1064+ let $s = size($l)
1065+ let $acc0 = $Tuple2(nil, 0)
1066+ func $f0_1 ($a,$i) = if (($i >= $s))
1067+ then $a
1068+ else makeNewBalances($a, $l[$i])
1069+
1070+ func $f0_2 ($a,$i) = if (($i >= $s))
1071+ then $a
1072+ else throw("List size exceeds 15")
1073+
1074+ $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)
1075+ }
1076+ let newBalances = $t02571725778._1
1077+ let i = $t02571725778._2
1078+ if (checkDAppThreshold(newBalances))
1079+ then throw()
1080+ else {
1081+ let us = unstake(dy_and_fee, tokenOut)
1082+ if ((us == us))
1083+ 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))]
1084+ else throw("Strict value is not equal to itself.")
1085+ }
1086+ }
1087+ }
11271088 else throw("Strict value is not equal to itself.")
11281089 }
1129- else throw("Strict value is not equal to itself.")
11301090 }
11311091 })
11321092
11331093
11341094
11351095 @Callable(msg)
11361096 func A () = $Tuple2(nil, _A())
11371097
11381098
11391099
11401100 @Callable(msg)
11411101 func getVirtualPrice () = {
11421102 let D = get_D(_xp(), _A())
11431103 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
11441104 }
11451105
11461106
11471107
11481108 @Callable(msg)
11491109 func calcTokenAmount (amounts,deposit) = {
11501110 let amp = _A()
11511111 let balances = _xp()
11521112 let D0 = getDMem(balances, amp)
11531113 func calcNewBalances (acc,balance) = {
1154- let $t02817328199 = acc
1155- let newBalances = $t02817328199._1
1156- let i = $t02817328199._2
1114+ let $t02673926765 = acc
1115+ let newBalances = $t02673926765._1
1116+ let i = $t02673926765._2
11571117 let newBalance = (balance + (if (deposit)
11581118 then amounts[i]
11591119 else -(amounts[i])))
11601120 $Tuple2((newBalances :+ newBalance), (i + 1))
11611121 }
11621122
11631123 let newBalances = ( let $l = balances
11641124 let $s = size($l)
11651125 let $acc0 = $Tuple2(nil, 0)
11661126 func $f0_1 ($a,$i) = if (($i >= $s))
11671127 then $a
11681128 else calcNewBalances($a, $l[$i])
11691129
11701130 func $f0_2 ($a,$i) = if (($i >= $s))
11711131 then $a
11721132 else throw("List size exceeds 15")
11731133
11741134 $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
11751135 let D1 = getDMem(newBalances, amp)
11761136 let diff = if (deposit)
11771137 then (D1 - D0)
11781138 else (D0 - D1)
11791139 $Tuple2(nil, fraction(diff, shareSupply, D0))
11801140 }
11811141
11821142
11831143
11841144 @Callable(msg)
11851145 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
11861146 then throw("too often")
11871147 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
11881148 then throw("insufficient time")
11891149 else {
11901150 let _initial_A = _A()
11911151 if (assert(if ((_futureA > 0))
11921152 then (MAX_A > _futureA)
11931153 else false))
11941154 then throw("out of base range")
11951155 else if (assert(if (if ((_futureA >= _initial_A))
11961156 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
11971157 else false)
11981158 then true
11991159 else if ((_initial_A > _futureA))
12001160 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12011161 else false))
12021162 then throw("out of range")
12031163 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12041164 }))
12051165
12061166
12071167
12081168 @Callable(msg)
12091169 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
12101170 let currentA = _A()
12111171 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
12121172 }))
12131173
12141174
12151175
12161176 @Callable(msg)
12171177 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
12181178 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
12191179 else suspend("Paused by admin"))
12201180
12211181
12221182
12231183 @Callable(msg)
12241184 func activate () = valueOrElse(isAdminCall(msg), if (active)
12251185 then throwIsActive()
12261186 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
12271187
12281188
12291189
12301190 @Callable(msg)
12311191 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
12321192
12331193
12341194 @Verifier(tx)
12351195 func verify () = {
12361196 let multiSignedByAdmins = {
12371197 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12381198 then 1
12391199 else 0
12401200 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
12411201 then 1
12421202 else 0
12431203 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
12441204 then 1
12451205 else 0
12461206 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
12471207 }
12481208 match tx {
12491209 case inv: InvokeScriptTransaction =>
12501210 let callTakeIntoAccount = if ((inv.dApp == this))
12511211 then (inv.function == "takeIntoAccountExtraFunds")
12521212 else false
12531213 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12541214 then true
12551215 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
12561216 then true
12571217 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
12581218 then true
12591219 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
12601220 if (if (callTakeIntoAccount)
12611221 then signedByAdmin
12621222 else false)
12631223 then true
12641224 else multiSignedByAdmins
12651225 case _ =>
12661226 multiSignedByAdmins
12671227 }
12681228 }
12691229

github/deemru/w8io/026f985 
153.28 ms