tx · ENGeASJMBfe4UoixCsc2kaPQqqVXNM3ELohMRqNDehRW

3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy:  -0.02500000 Waves

2023.08.08 13:53 [2701527] smart account 3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy > SELF 0.00000000 Waves

{ "type": 13, "id": "ENGeASJMBfe4UoixCsc2kaPQqqVXNM3ELohMRqNDehRW", "fee": 2500000, "feeAssetId": null, "timestamp": 1691491989012, "version": 2, "chainId": 84, "sender": "3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy", "senderPublicKey": "9W33iCCNfmFxUbiC6XZcH5x7f6xfwC7Jb3BoExT5q2PV", "proofs": [ "KscBD1vURGUJ6PTobNc6Ub5rFRZf7nskGHRNWNQcvUDQxPkQoduUtDkg2GSpPkVcXEhXhemNdNS2iz1DJMjv2hj" ], "script": "base64:BgK5LQgCEggKBggIAQEBCBIFCgMBCAISAwoBARIECgIICBIECgIICBIFCgMICAESAwoBCBIDCgEIEgQKAggBEgMKAQgSABIAEgUKAwgIBBIDCgEIEgMKAQgSBAoCCAgSBAoCCAgiA1NFUCIGU0NBTEU4IgVNVUxUOCIOUE9PTFdFSUdIVE1VTFQiEGNvbnRyYWN0RmlsZW5hbWUiB1NDQUxFMTgiBk1VTFQxOCIITVVMVDE4QkkiC2Jsb2Nrc0luRGF5Ig1ibG9ja3NJbk1vbnRoIgd3cmFwRXJyIgNtc2ciCHRocm93RXJyIg9nZXRTdHJpbmdPckZhaWwiB2FkZHJlc3MiA2tleSIMZ2V0SW50T3JaZXJvIg9nZXRJbnRPckRlZmF1bHQiCmRlZmF1bHRWYWwiDGdldEludE9yRmFpbCIDYWJzIgN2YWwiDmVuc3VyZVBvc2l0aXZlIgF2IgFtIhtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MiHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbCIWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZSIacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQiE3JlZmVycmFsUHJvZ3JhbU5hbWUiEWtleUZhY3RvcnlBZGRyZXNzIhhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAiGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAiFElkeEZhY3RvcnlDZmdJZG9EYXBwIhVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAiGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAiFUlkeEZhY3RvcnlDZmdSZXN0RGFwcCIZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcCIUSWR4RmFjdG9yeUNmZ0Rhb0RhcHAiGklkeEZhY3RvcnlDZmdNYXJrZXRpbmdEYXBwIhpJZHhGYWN0b3J5Q2ZnR3d4UmV3YXJkRGFwcCIWSWR4RmFjdG9yeUNmZ0JpcmRzRGFwcCINa2V5RmFjdG9yeUNmZyIma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MiCmxwQXNzZXRTdHIiFGtleUZhY3RvcnlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiG2tleUZhY3RvcnlQb29sV2VpZ2h0SGlzdG9yeSILcG9vbEFkZHJlc3MiA251bSIYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsIhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsIgpmYWN0b3J5Q2ZnIhhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwiF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsIhlnZXRHd3hSZXdhcmRBZGRyZXNzT3JGYWlsIhNrZXlNYW5hZ2VyUHVibGljS2V5IhZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzIh5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQiIWtleUVtaXNzaW9uUmF0ZVBlckJsb2NrTWF4Q3VycmVudCIVa2V5RW1pc3Npb25TdGFydEJsb2NrIh1rZXlCb29zdGluZ1YyTGFzdFVwZGF0ZUhlaWdodCIVa2V5Qm9vc3RpbmdWMkludGVncmFsIhtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MiE2tleUVtaXNzaW9uRW5kQmxvY2siGWtleU5leHRQZXJnZXRJbnRPckRlZmF1bHQiH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQiDUlkeENmZ0Fzc2V0SWQiE0lkeENmZ01pbkxvY2tBbW91bnQiFUlkeENmZ01pbkxvY2tEdXJhdGlvbiIVSWR4Q2ZnTWF4TG9ja0R1cmF0aW9uIhJJZHhDZmdNYXRoQ29udHJhY3QiCWtleUNvbmZpZyIVcmVhZENvbmZpZ0FycmF5T3JGYWlsIghjZmdBcnJheSIHYXNzZXRJZCINbWluTG9ja0Ftb3VudCIPbWluTG9ja0R1cmF0aW9uIg9tYXhMb2NrRHVyYXRpb24iDG1hdGhDb250cmFjdCINZm9ybWF0Q29uZmlnUyIMZm9ybWF0Q29uZmlnIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIgttdXN0TWFuYWdlciIBaSICcGQiAnBrIg1JZHhMb2NrQW1vdW50IgxJZHhMb2NrU3RhcnQiD0lkeExvY2tEdXJhdGlvbiIaSWR4TG9ja0xhc3RVcGRhdGVUaW1lc3RhbXAiEElkeExvY2tHd3hBbW91bnQiEElkeExvY2tXeENsYWltZWQiE2tleUxvY2tQYXJhbXNSZWNvcmQiC3VzZXJBZGRyZXNzIgR0eElkIgFiIhpyZWFkTG9ja1BhcmFtc1JlY29yZE9yRmFpbCIVa2V5VXNlckd3eEFtb3VudFRvdGFsIhZmb3JtYXRMb2NrUGFyYW1zUmVjb3JkIgZhbW91bnQiBXN0YXJ0IghkdXJhdGlvbiIJZ3d4QW1vdW50Igl3eENsYWltZWQiDmtleU5leHRVc2VyTnVtIhJrZXlVc2VyMk51bU1hcHBpbmciEmtleU51bTJVc2VyTWFwcGluZyIXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQiIGtleVN0YXRzTG9ja3NEdXJhdGlvblN1bUluQmxvY2tzIhJrZXlTdGF0c0xvY2tzQ291bnQiEmtleVN0YXRzVXNlcnNDb3VudCIga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwiB3VzZXJOdW0iImtleVVzZXJMcEJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwiCWxwQXNzZXRJZCIXa2V5VXNlck1heEJvb3N0SU5URUdSQUwiGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTCIha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsIhNrZXlVc2VyQm9vc3RDbGFpbWVkIgtrZXlHd3hUb3RhbCIHa2V5Vm90ZSINYW1vdW50QXNzZXRJZCIMcHJpY2VBc3NldElkIgVlcG9jaCIVa2V5U3RhcnRIZWlnaHRCeUVwb2NoIhFrZXlDdXJyZW50RXBvY2hVaSIVa2V5Vm90aW5nUmVzdWx0U3Rha2VkIgxscEFzc2V0SWRTdHIiHWtleVZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsIiVrZXlWb3RpbmdSZXN1bHRTdGFrZWRMYXN0VXBkYXRlSGVpZ2h0IiFrZXlWb3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbExhc3QiFWtleVZvdGVTdGFrZWRJbnRlZ3JhbCIda2V5Vm90ZVN0YWtlZExhc3RVcGRhdGVIZWlnaHQiGWtleVZvdGVTdGFrZWRJbnRlZ3JhbExhc3QiD2tleVN0YWtlZEJ5VXNlciIOdXNlckFkZHJlc3NTdHIiD2ZhY3RvcnlDb250cmFjdCIQZW1pc3Npb25Db250cmFjdCIPc3Rha2luZ0NvbnRyYWN0IhFnd3hSZXdhcmRDb250cmFjdCIWbHBTdGFraW5nUG9vbHNDb250cmFjdCIZa2V5Vm90aW5nRW1pc3Npb25Db250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCIda2V5Vm90aW5nRW1pc3Npb25SYXRlQ29udHJhY3QiCmJvb3N0Q29lZmYiAUAiGXVzZXJOdW1iZXJCeUFkZHJlc3NPckZhaWwiEWdldEd3eEFtb3VudFRvdGFsIhJnZXRMb2NrZWRHd3hBbW91bnQiDGZ1bmN0aW9uTmFtZSIadm90aW5nRW1pc3Npb25SYXRlQ29udHJhY3QiGGxvY2tlZFZvdGluZ0VtaXNzaW9uUmF0ZSIUbG9ja2VkVm90aW5nRW1pc3Npb24iBmxvY2tlZCIMSGlzdG9yeUVudHJ5IgR0eXBlIgR1c2VyIglsb2NrU3RhcnQiCmhpc3RvcnlLRVkiC2hpc3RvcnlEQVRBIgpTdGF0c0VudHJ5Ig50b3RhbExvY2tlZEluYyILZHVyYXRpb25JbmMiDGxvY2tDb3VudEluYyINdXNlcnNDb3VudEluYyIbbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzS0VZIg1sb2Nrc0NvdW50S0VZIg11c2Vyc0NvdW50S0VZIg50b3RhbEFtb3VudEtFWSIYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzIgpsb2Nrc0NvdW50Igp1c2Vyc0NvdW50Igt0b3RhbEFtb3VudCIPTG9ja1BhcmFtc0VudHJ5IiJleHRyYWN0T3B0aW9uYWxQYXltZW50QW1vdW50T3JGYWlsIg9leHBlY3RlZEFzc2V0SWQiA3BtdCIVZ2V0VXNlckd3eEFtb3VudFRvdGFsIhpnZXRWb3RpbmdFbWlzc2lvbkVwb2NoSW5mbyINJHQwMTQ5OTUxNTI4NSIOY3VycmVudEVwb2NoVWkiEmxhc3RGaW5hbGl6ZWRFcG9jaCIXY3VycmVudEVwb2NoU3RhcnRIZWlnaHQiGGdldFBvb2xBc3NldHNCeUxwQXNzZXRJZCIQaWR4QW1vdW50QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIgdwb29sQ2ZnIhRnZXRVc2VyVm90ZUZpbmFsaXplZCINJHQwMTU5NzYxNjA1NiINJHQwMTYwNTkxNjEzNCILdXNlclZvdGVLZXkiCHVzZXJWb3RlIhFnZXRVc2VyVm90ZVN0YWtlZCIMc3Rha2VkQnlVc2VyIhVnZXRWb3RpbmdSZXN1bHRTdGFrZWQiDSR0MDE2Njc4MTY3NTgiF3ZvdGluZ1Jlc3VsdFN0YWtlZFN0YXJ0IhJ2b3RpbmdSZXN1bHRTdGFrZWQiHWdldFZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsIg0kdDAxNzEyMDE3MjAwIh52b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbFByZXYiInZvdGluZ1Jlc3VsdFN0YWtlZExhc3RVcGRhdGVIZWlnaHQiHHZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsRGgiGnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsIiFyZWZyZXNoVm90aW5nUmVzdWx0U3Rha2VkSW50ZWdyYWwiD3N0YWtlZFZvdGVEZWx0YSINJHQwMTgwMzcxODExNyIVdm90aW5nUmVzdWx0U3Rha2VkTmV3IhlnZXRVc2VyVm90ZVN0YWtlZEludGVncmFsIg0kdDAxODcyODE4ODA4Ig51c2VyVm90ZVN0YWtlZCIadXNlclZvdGVTdGFrZWRJbnRlZ3JhbFByZXYiHnVzZXJWb3RlU3Rha2VkTGFzdFVwZGF0ZUhlaWdodCIYdXNlclZvdGVTdGFrZWRJbnRlZ3JhbERoIhZ1c2VyVm90ZVN0YWtlZEludGVncmFsIhlyZWZyZXNoVm90ZVN0YWtlZEludGVncmFsIgRlZGdlIg0kdDAxOTU5NjE5Njc2IhF1c2VyVm90ZUZpbmFsaXplZCIHYWN0aW9ucyITdm90aW5nUmVzdWx0QWN0aW9ucyILdm90ZUFjdGlvbnMiG2dldFN0YWtlZFZvdGVzSW50ZWdyYWxzRGlmZiINJHQwMjA1MzAyMDYxMCIddXNlclZvdGVTdGFrZWRJbnRlZ3JhbExhc3RLZXkiGnVzZXJWb3RlU3Rha2VkSW50ZWdyYWxMYXN0IiF2b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbExhc3RLZXkiHnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsTGFzdCIadXNlclZvdGVTdGFrZWRJbnRlZ3JhbERpZmYiHnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsRGlmZiIccmVmcmVzaEJvb3N0RW1pc3Npb25JbnRlZ3JhbCISd3hFbWlzc2lvblBlckJsb2NrIiBib29zdGluZ1YyTGFzdFVwZGF0ZUhlaWdodE9wdGlvbiIYYm9vc3RpbmdWMkluZ2VyZ2FsT3B0aW9uIgtlbWlzc2lvbkVuZCIBaCICZGgiEGxhc3RVcGRhdGVIZWlnaHQiFWJvb3N0RW1pc3Npb25QZXJCbG9jayIZYm9vc3RFbWlzc2lvbkludGVncmFsUHJldiIVYm9vc3RFbWlzc2lvbkludGVncmFsIhRpbnRlcm5hbENsYWltV3hCb29zdCIIcmVhZE9ubHkiCEVNUFRZU1RSIgpwb29sV2VpZ2h0Ig5wb29sQWRkcmVzc1N0ciIidXNlckxwQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWSIgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkiHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsIhl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsIg0kdDAyNDE1MjI0MjkxIhtzdGFrZWRWb3Rlc0ludGVncmFsc0FjdGlvbnMiFHVzZXJWb3RlSW50ZWdyYWxEaWZmIhZ0b3RhbFZvdGVzSW50ZWdyYWxEaWZmIh1wb29sVXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbCIhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3IglkYXRhU3RhdGUiBWRlYnVnIgtsb2NrQWN0aW9ucyIOZHVyYXRpb25Nb250aHMiFWR1cmF0aW9uTW9udGhzQWxsb3dlZCIKYXNzZXRJZFN0ciIJcG10QW1vdW50Ig5uZXh0VXNlck51bUtFWSIOdXNlcklzRXhpc3RpbmciCnVzZXJOdW1TdHIiB2NvZWZmWDgiDmdXeEFtb3VudFN0YXJ0Ig5nd3hBbW91bnRUb3RhbCISdXNlckd3eEFtb3VudFRvdGFsIgxnd3hSZXdhcmRJbnYiA2FyciIRZmFjdG9yeUFkZHJlc3NTdHIiDmxvY2tBc3NldElkU3RyIgttaW5EdXJhdGlvbiILbWF4RHVyYXRpb24iC2NoZWNrQ2FsbGVyIg9yZWZlcnJlckFkZHJlc3MiCXNpZ25hdHVyZSINJHQwMjgyNjgyODMzMyIRbG9ja0FjdGlvbnNSZXN1bHQiD3JlZmVycmFsQWRkcmVzcyIGcmVmSW52IhF1cGRhdGVSZWZBY3Rpdml0eSINJHQwMjg3OTEyODg1NiINJHQwMjkxNjYyOTI2OCISdXNlckJvb3N0QXZhaWxhYmxlIg0kdDAyOTQwMDI5NTAxIgd0eElkU3RyIg91c2VyUmVjb3JkQXJyYXkiCnVzZXJBbW91bnQiDGxvY2tEdXJhdGlvbiIHbG9ja0VuZCIBdCIIZXhwb25lbnQiDnd4V2l0aGRyYXdhYmxlIglnd3hCdXJuZWQiDGd3eFJlbWFpbmluZyIPbG9ja2VkR3d4QW1vdW50Igx0YXJnZXRIZWlnaHQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleYwBAAFhAgJfXwABYgAIAAFjAIDC1y8AAWQFAWMAAWUCDWJvb3N0aW5nLnJpZGUAAWYAEgABZwCAgJC7utat8A0AAWgJALYCAQUBZwABaQCgCwABagCY1gIBAWsBAWwJALkJAgkAzAgCBQFlCQDMCAICAjogCQDMCAIFAWwFA25pbAIAAQFtAQFsCQACAQkBAWsBBQFsAQFuAgFvAXAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQFvBQFwCQEBawEJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAXACDyBpcyBub3QgZGVmaW5lZAEBcQIBbwFwCQELdmFsdWVPckVsc2UCCQCaCAIFAW8FAXAAAAEBcgMBbwFwAXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBbwUBcAUBcwEBdAIBbwFwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBbwUBcAkBAWsBCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFwAg8gaXMgbm90IGRlZmluZWQBAXUBAXYDCQBmAgAABQF2CQEBLQEFAXYFAXYBAXcCAXgBeQMJAGcCBQF4AAAFAXgJAQFtAQkArAICCQELdmFsdWVP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cwECYUoABAJhSwkBAmFHAAQCYUgJAJ0IAgUCYUsJAQJhZwADCQABAgUCYUgCBlN0cmluZwQCYUkFAmFICQDZBAEFAmFJAwkAAQIFAmFIAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFMAQJhTQQCYU4JAQFtAQIRUGVybWlzc2lvbiBkZW5pZWQEAmFICQECYUoAAwkAAQIFAmFIAgpCeXRlVmVjdG9yBAJhTwUCYUgDCQAAAggFAmFND2NhbGxlclB1YmxpY0tleQUCYU8GBQJhTgMJAAECBQJhSAIEVW5pdAMJAAACCAUCYU0GY2FsbGVyBQR0aGlzBgUCYU4JAAIBAgtNYXRjaCBlcnJvcgACYVAAAQACYVEAAgACYVIAAwACYVMABAACYVQABQACYVUABgECYVYCAmFXAmFYCQC5CQIJAMwIAgIMJXMlcyVzX19sb2NrCQDMCAIJAKUIAQUCYVcJAMwIAgQCYUgFAmFYAwkAAQIFAmFIAgpCeXRlVmVjdG9yBAJhWQUCYUgJANgEAQUCYVkDCQABAgUCYUgCBFVuaXQCBmxlZ2FjeQkAAgECC01hdGNoIGVycm9yBQNuaWwFAWEBAmFaAgJhVwJhWAkAtQkCCQEBbgIFBHRoaXMJAQJhVgIFAmFXBQJhWAUBYQECYmEBAmFXCQC5CQIJAMwIAgIUJXMlc19fZ3d4QW1vdW50VG90YWwJAMwIAgkApQgBBQJhVwUDbmlsBQFhAQJiYgUCYmMCYmQCYmUCYmYCYmcJALkJAgkAzAgCAg4lZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmJjCQDMCAIJAKQDAQUCYmQJAMwIAgkApAMBBQJiZQkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYmYJAMwIAgkApAMBBQJiZwUDbmlsBQFhAQJiaAACDyVzX19uZXh0VXNlck51bQECYmkBAmFXCQC5CQIJAMwIAgIZJXMlcyVzX19tYXBwaW5nX191c2VyMm51bQkAzAgCBQJhVwUDbmlsBQFhAQJiagEBWAkAuQkCCQDMCAICGSVzJXMlc19fbWFwcGluZ19fbnVtMnVzZXIJAMwIAgUBWAUDbmlsBQFhAQJiawACHiVzJXNfX3N0YXRzX19hY3RpdmVUb3RhbExvY2tlZAECYmwAAiUlcyVzX19zdGF0c19fbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzAQJibQACFyVzJXNfX3N0YXRzX19sb2Nrc0NvdW50AQJibgACHSVzJXNfX3N0YXRzX19hY3RpdmVVc2Vyc0NvdW50AQJibwECYnAJALkJAgkAzAgCAiAlcyVkX191c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRWMgkAzAgCCQCkAwEFAmJwBQNuaWwFAWEBAmJxAgJicAJicgkAuQkCCQDMCAICICVzJWRfX3VzZXJCb29zdEVtaXNzaW9uTGFzdEludFYyCQDMCAIJAKQDAQUCYnAJAMwIAgUCYnIFA25pbAUBYQECYnMBAmJwCQC5CQIJAMwIAgIRJXMlZF9fbWF4Qm9vc3RJbnQJAMwIAgkApAMBBQJicAUDbmlsBQFhAQJidAACGCVzJXNfX21heEJvb3N0SW50X190b3RhbAECYnUBAmJwCQC5CQIJAMwIAgIkJXMlZF9fdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsCQDMCAIJAKQDAQUCYnAFA25pbAUBYQECYnYBAmJwCQC5CQIJAMwIAgIWJXMlZF9fdXNlckJvb3N0Q2xhaW1lZAkAzAgCCQCkAwEFAmJwBQNuaWwFAWEBAmJ3AAIQJXMlc19fZ3d4X190b3RhbAECYngEAmJ5AmJ6AW8CYkEJALkJAgkAzAgCAgolcyVzJXMlcyVkCQDMCAICBHZvdGUJAMwIAgUCYnkJAMwIAgUCYnoJAMwIAgkApQgBBQFvCQDMCAIJAKQDAQUCYkEFA25pbAUBYQECYkIBAmJBCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFAmJBBQNuaWwFAWEBAmJDAAkAuQkCCQDMCAICAiVzCQDMCAICDmN1cnJlbnRFcG9jaFVpBQNuaWwFAWEBAmJEAgJiRQJiQQkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhJ2b3RpbmdSZXN1bHRTdGFrZWQJAMwIAgUCYkUJAMwIAgkApAMBBQJiQQUDbmlsBQFhAQJiRgICYkUCYkEJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIadm90aW5nUmVzdWx0U3Rha2VkSW50ZWdyYWwJAMwIAgUCYkUJAMwIAgkApAMBBQJiQQUDbmlsBQFhAQJiRwICYkUCYkEJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIqdm90aW5nUmVzdWx0U3Rha2VkSW50ZWdyYWxMYXN0VXBkYXRlSGVpZ2h0CQDMCAIFAmJFCQDMCAIJAKQDAQUCYkEFA25pbAUBYQECYkgDAmJFAW8CYkEJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAh52b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbExhc3QJAMwIAgUCYkUJAMwIAgkApQgBBQFvCQDMCAIJAKQDAQUCYkEFA25pbAUBYQECYkkDAmJFAW8CYkEJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAhJ2b3RlU3Rha2VkSW50ZWdyYWwJAMwIAgUCYkUJAMwIAgkApQgBBQFvCQDMCAIJAKQDAQUCYkEFA25pbAUBYQECYkoDAmJFAW8CYkEJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAiJ2b3RlU3Rha2VkSW50ZWdyYWxMYXN0VXBkYXRlSGVpZ2h0CQDMCAIFAmJFCQDMCAIJAKUIAQUBbwkAzAgCCQCkAwEFAmJBBQNuaWwFAWEBAmJLAwJiRQFvAmJBCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgIWdm90ZVN0YWtlZEludGVncmFsTGFzdAkAzAgCBQJiRQkAzAgCCQClCAEFAW8JAMwIAgkApAMBBQJiQQUDbmlsBQFhAQJiTAICYk0CYkUJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGc3Rha2VkCQDMCAIFAmJNCQDMCAIFAmJFBQNuaWwFAWEAAmJOCQEBWQAAAmFjCQEBWgEFAmJOAAJiTwkBAmFkAQUCYWMAAmJQCQECYWUBBQJhYwACYlEJAQJhZgEFAmFjAAJiUgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQC5CQIJAMwIAgICJXMJAMwIAgIWbHBTdGFraW5nUG9vbHNDb250cmFjdAUDbmlsBQFhCQEBawECLmxwX3N0YWtpbmdfcG9vbHMgY29udHJhY3QgYWRkcmVzcyBpcyB1bmRlZmluZWQJAQFrAQIpaW52YWxpZCBscF9zdGFraW5nX3Bvb2xzIGNvbnRyYWN0IGFkZHJlc3MAAmJTCQC5CQIJAMwIAgICJXMJAMwIAgIWdm90aW5nRW1pc3Npb25Db250cmFjdAUDbmlsBQFhAAJiVAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUCYk4FAmJTAAJiVQkAuQkCCQDMCAICAiVzCQDMCAICGnZvdGluZ0VtaXNzaW9uUmF0ZUNvbnRyYWN0BQNuaWwFAWEAAmJWCgACYlcJAPwHBAUCYk8CFWdldEJvb3N0Q29lZmZSRUFET05MWQUDbmlsBQNuaWwDCQABAgUCYlcCA0ludAUCYlcJAAIBCQCsAgIJAAMBBQJiVwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQJiWAECYVcEAmFICQCdCAIFBHRoaXMJAQJiaQEJAKUIAQUCYVcDCQABAgUCYUgCBlN0cmluZwQCYUkFAmFICQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUCYUkJAQFrAQITaW52YWxpZCB1c2VyIG51bWJlcgMJAAECBQJhSAIEVW5pdAkBAW0BAgxpbnZhbGlkIHVzZXIJAAIBAgtNYXRjaCBlcnJvcgECYlkACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJidwAAAAECYloBAmFXBAJjYQISZ2V0TG9ja2VkR3d4QW1vdW50BAJjYgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBAJhSAkAnQgCBQJiVAUCYlUDCQABAgUCYUgCBFVuaXQFBHVuaXQDCQABAgUCYUgCBlN0cmluZwQCYUkFAmFICQCmCAEFAmFJCQACAQILTWF0Y2ggZXJyb3IJAQFrAQIkaW52YWxpZCB2b3RpbmcgZW1pc3Npb24gcmF0ZSBhZGRyZXNzBAJjYwoAAmJXCQD8BwQFAmJUBQJjYQkAzAgCCQClCAEFAmFXBQNuaWwFA25pbAMJAAECBQJiVwIDSW50BQJiVwkAAgEJAKwCAgkAAwEFAmJXAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmNkCgACYlcJAPwHBAUCY2IFAmNhCQDMCAIJAKUIAQUCYVcFA25pbAUDbmlsAwkAAQIFAmJXAgNJbnQFAmJXCQACAQkArAICCQADAQUCYlcCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCY2UJAJYDAQkAzAgCBQJjYwkAzAgCBQJjZAUDbmlsBQJjZQECY2YHAmNnAmNoAmJjAmNpAmJlAmJmAmFNBAJjagkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmNnCQDMCAIFAmNoCQDMCAIJANgEAQgFAmFNDXRyYW5zYWN0aW9uSWQFA25pbAUBYQQCY2sJALkJAgkAzAgCAg4lZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQJiYwkAzAgCCQCkAwEFAmNpCQDMCAIJAKQDAQUCYmUJAMwIAgkApAMBBQJiZgUDbmlsBQFhCQELU3RyaW5nRW50cnkCBQJjagUCY2sBAmNsBAJjbQJjbgJjbwJjcAQCY3EJAQJibAAEAmNyCQECYm0ABAJjcwkBAmJuAAQCY3QJAQJiawAEAmN1CQEBcQIFBHRoaXMFAmNxBAJjdgkBAXECBQR0aGlzBQJjcgQCY3cJAQFxAgUEdGhpcwUCY3MEAmN4CQEBcQIFBHRoaXMFAmN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjcQkAZAIFAmN1BQJjbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCY3IJAGQCBQJjdgUCY28JAMwIAgkBDEludGVnZXJFbnRyeQIFAmNzCQBkAgUCY3cFAmNwCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjdAkAZAIFAmN4BQJjbQUDbmlsAQJjeQcCYVcCYVgCYmMCYmQCYmUCYmYCYmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFWAgUCYVcFAmFYCQECYmIFBQJiYwUCYmQFAmJlBQJiZgUCYmcFA25pbAECY3oCAmFNAmNBAwkAZgIJAJADAQgFAmFNCHBheW1lbnRzAAEJAQFtAQIbb25seSBvbmUgcGF5bWVudCBpcyBhbGxvd2VkAwkAAAIJAJADAQgFAmFNCHBheW1lbnRzAAAAAAQCY0IJAJEDAggFAmFNCHBheW1lbnRzAAADCQECIT0CCQEFdmFsdWUBCAUCY0IHYXNzZXRJZAUCY0EJAQFtAQIbaW52YWxpZCBhc3NldCBpZCBpbiBw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bgkBAmRoAgUCYkUFAmJNBAJkdQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmJKAwUCYkUFAmFXBQJjRwUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYkkDBQJiRQUCYVcFAmNHBQJkbgUDbmlsCQDOCAIFAmR0BQJkdQUCZHMBAmR2AgJiRQJiTQQCZHcJAQJjRAAEAmNHCAUCZHcCXzEEAmNICAUCZHcCXzIEAmFXCQERQGV4dHJOYXRpdmUoMTA2MikBBQJiTQQCZHgJAQJiSwMFAmJFBQJhVwUCY0cEAmR5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmR4AAAEAmR6CQECYkgDBQJiRQUCYVcFAmNHBAJkQQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJkegAABAJkbgkBAmRoAgUCYkUFAmJNBAJkYwkBAmNYAQUCYkUEAmRCCQBlAgUCZG4FAmR5BAJkQwkAZQIFAmRjBQJkQQkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkeAUCZG4JAMwIAgkBDEludGVnZXJFbnRyeQIFAmR6BQJkYwUDbmlsBQJkQgUCZEMBAmREAAQCZEUJAQF0AgUCYk8JAQJhaQAEAmRGCQCaCAIFBHRoaXMJAQJhbAAEAmRHCQCaCAIFBHRoaXMJAQJhbQAEAmRICQEBdAIFAmJPCQECYW8ABAJkSQMJAGYCBQZoZWlnaHQFAmRIBQJkSAUGaGVpZ2h0BAJkSgQCYUgFAmRGAwkAAQIFAmFIAgNJbnQEAmRLBQJhSAkAlgMBCQDMCAIJAGUCBQJkSQUCZEsJAMwIAgAABQNuaWwDCQABAgUCYUgCBFVuaXQAAAkAAgECC01hdGNoIGVycm9yBAJkTAkAaQIJAGgCBQJkRQkAZQIFAmJWAAEFAmJWBAJkTQkBC3ZhbHVlT3JFbHNlAgUCZEcAAAQCZE4JAGQCCQBoAgUCZEwFAmRKBQJkTQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYW0ABQJkTgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFsAAUGaGVpZ2h0BQNuaWwFAmROAQJkTwMCYkUCYk0CZFAEAmFXCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUCYk0JAQFrAQIUaW52YWxpZCB1c2VyIGFkZHJlc3MEAmJwCQECYlgBBQJhVwMJAAACBQJicAUCYnAEAmRRAgVlbXB0eQQCZFIDCQECIT0CBQJiRQUCZFEEAmRTCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYk4JAQFSAQUCYkUJAQFrAQkArAICAhV1bnN1cHBvcnRlZCBscCBhc3NldCAFAmJFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQJiTgkBAVQBBQJkUwMFAmRQAAAJAQFtAQkArAICAihub3QgcmVhZG9ubHkgbW9kZTogdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJiRQQCZFQJAQJicQIFAmJwBQJiRQQCZFUJAQJibwEFAmJwBAJkVgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJkVAkBAXECBQR0aGlzBQJkVQQCZE4ICQECZEQAAl8yBAJkVwkAZQIFAmROBQJkVgMJAGYCAAAFAmRXCQEBbQECEndyb25nIGNhbGN1bGF0aW9ucwQCZFgJAQJkdgIFAmJFBQJiTQQCZFkIBQJkWAJfMQQCZFoIBQJkWAJfMgQCZWEIBQJkWAJfMwQCZWIJAGsDBQJkVwUCZFIFAWQEAmVjAwkAAAIFAmVhAAAAAAkAawMFAmViBQJkWgUCZWEEAmVkCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRUBQJkTgUDbmlsBQJkWQQCZWUJALkJAgkAzAgCCQCkAwEFAmRWCQDMCAIJAKQDAQUCZFcJAMwIAgkApAMBBQJkUgkAzAgCCQCkAwEFAmRaCQDMCAIJAKQDAQUCZWEFA25pbAIBOgkAlQoDBQJlYwUCZWQFAmVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJlZgICYU0CZWcEAmVoCQDMCAIAAQkAzAgCAAMJAMwIAgAGCQDMCAIADAkAzAgCABgJAMwIAgAwBQNuaWwDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQJlaAUCZWcJAQFtAQIQaW52YWxpZCBkdXJhdGlvbgQCYmUJAGgCBQJlZwUBagQCZWkJANgEAQUCYXoDCQECIT0CCQCQAwEIBQJhTQhwYXltZW50cwABCQEBbQECNGludmFsaWQgcGF5bWVudCAtIGV4YWN0IG9uZSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEAmNCCQCRAwIIBQJhTQhwYXltZW50cwAABAJlaggFAmNCBmFtb3VudAMJAQIhPQIFAmF6CQEFdmFsdWUBCAUCY0IHYXNzZXRJZAkBAW0BCQCsAgIJAKwCAgIeaW52YWxpZCBhc3NldCBpcyBpbiBwYXltZW50IC0gBQJlaQIMIGlzIGV4cGVjdGVkBAJlawkBAmJoAAQCYVcIBQJhTQZjYWxsZXIEAmJNCQClCAEFAmFXBAJlbAkBCWlzRGVmaW5lZAEJAKIIAQkBAmJpAQUCYk0EAmVtAwUCZWwJAQV2YWx1ZQEJAKIIAQkBAmJpAQUCYk0JAKQDAQkBAXQCBQR0aGlzBQJlawQCYnAJAQ1wYXJzZUludFZhbHVlAQUCZW0EAmNpBQZoZWlnaHQDAwkAZgIFAmFBBQJlagkBAiE9AgUCYVcFAmJSBwkBAW0BCQCsAgICImFtb3VudCBpcyBsZXNzIHRoZW4gbWluTG9ja0Ftb3VudD0JAKQDAQUCYUEDCQBmAgUCYUIFAmJlCQEBbQEJAKwCAgItcGFzc2VkIGR1cmF0aW9uIGlzIGxlc3MgdGhlbiBtaW5Mb2NrRHVyYXRpb249CQCkAwEFAmFCAwkAZgIFAmJlBQJhQwkBAW0BCQCsAgICMHBhc3NlZCBkdXJhdGlvbiBpcyBncmVhdGVyIHRoZW4gbWF4TG9ja0R1cmF0aW9uPQkApAMBBQJhQwQCZW4JAGsDBQJiZQUBYwUCYUMEAmVvCQBrAwUCZWoFAmVuBQFjBAJlcAkBAmJZAAQCZFUJAQJibwEFAmJwBAJkTggJAQJkRAACXzIEAmVxCQECY0MBBQJhVwQCZXIJAPwHBAUCYlECEXJlZnJlc2hVc2VyUmV3YXJkCQDMCAIIBQJhVwVieXRlcwUDbmlsBQNuaWwDCQAAAgUCZXIFAmVyBAJlcwMFAmVsBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFAmVrCQBkAgUCYnAAAQkAzAgCCQELU3RyaW5nRW50cnkCCQECYmkBBQJiTQUCZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJqAQUCZW0FAmJNBQNuaWwJAJQKAgkAzggCCQDNCAIJAM4IAgkAzggCBQJlcwkBAmN5BwUCYVcIBQJhTQ10cmFuc2FjdGlvbklkBQJlagUCY2kFAmJlBQJlbwAACQECY2wEBQJlagUCYmUAAQMFAmVsAAAAAQkBAmNmBwIEbG9jawUCYk0FAmVqBQJjaQUCYmUFAmVvBQJhTQkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZFUFAmROCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYncACQBkAgUCZXAFAmVvCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmEBBQJhVwkAZAIFAmVxBQJlbwUDbmlsBQJlbwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhECYU0BC2NvbnN0cnVjdG9yBgJldAJldQJhQQJldgJldwJhRAQCZXgJAQJhTAEFAmFNAwkAAAIFAmV4BQJleAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmgAAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF3AAkBAmFGBQUCZXUFAmFBBQJldgUCZXcFAmFECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFFAAUCZXQFA25pbAkBAmNsBAAAAAAAAAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQdsb2NrUmVmAwJiZQJleQJlegQCZUEJAQJlZgIFAmFNBQJiZQQCZUIIBQJlQQJfMQQCZW8IBQJlQQJfMgQCZUMJAKUIAQgFAmFNBmNhbGxlcgQCZUQDAwkAAAIFAmV5AgAGCQAAAgUCZXoBAAUEdW5pdAkA/AcEBQFBAgpjcmVhdGVQYWlyCQDMCAIFAUQJAMwIAgUCZXkJAMwIAgUCZUMJAMwIAgUCZXoFA25pbAUDbmlsAwkAAAIFAmVEBQJlRAQCZUUJAPwHBAUCYUQCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgkApQgBCAUCYU0GY2FsbGVyCQDMCAIFAmVvBQNuaWwFA25pbAMJAAACBQJlRQUCZUUJAJQKAgUCZUIFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BBGxvY2sBAmJlBAJlRgkBAmVmAgUCYU0FAmJlBAJlQggFAmVGAl8xBAJlbwgFAmVGAl8yBAJlRQkA/AcEBQJhRAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCCQClCAEIBQJhTQZjYWxsZXIJAMwIAgUCZW8FA25pbAUDbmlsAwkAAAIFAmVFBQJlRQkAlAoCBQJlQgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhTQEMY2xhaW1XeEJvb3N0AgJiRQJiTQMJAQIhPQIFAmJQCAUCYU0GY2FsbGVyCQEBbQECEnBlcm1pc3Npb25zIGRlbmllZAQCZUcJAQJkTwMFAmJFBQJiTQcEAmVICAUCZUcCXzEEAmVkCAUCZUcCXzIEAmVlCAUCZUcCXzMJAJQKAgUCZWQJAMwIAgUCZUgFA25pbAJhTQEUY2xhaW1XeEJvb3N0UkVBRE9OTFkCAmJFAmJNBAJlSQkBAmRPAwUCYkUFAmJNBgQCZUgIBQJlSQJfMQQCZWQIBQJlSQJfMgQCZWUIBQJlSQJfMwkAlAoCBQNuaWwJAMwIAgUCZUgJAMwIAgUCZWUFA25pbAJhTQEGdW5sb2NrAwJiTQJlSgJiYwQCYVcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQJiTQkBAWsBAhRpbnZhbGlkIHVzZXIgYWRkcmVzcwQCYVgJANkEAQUCZUoEAmVLCQECYVoCBQJhVwMJAAACBQJlSgIABQJhWAUEdW5pdAQCZUwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlSwUCYVAEAmNpCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUsFAmFRBAJlTQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVLBQJhUgQCZU4JAGQCBQJjaQUCZU0EAmJnCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUsFAmFVBAJiZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVLBQJhVAQCZU8JAGkCCQBlAgUGaGVpZ2h0BQJjaQUBaQQCZVAJALwCAwkAtgIBBQJlTwkAuQICCQC2AgEJAGgCAAgFAWkFAWgJALYCAQUCZU0EAmVRAwkAZgIFBmhlaWdodAUCZU4JAGUCBQJlTAUCYmcJAKADAQkAvAIDCQC2AgEFAmVMCQC4AgIFAWgJAHYGCQC2AgEABQABBQJlUAUBZgUBZgUERE9XTgUBaAMJAGYCBQJiYwUCZVEJAQFtAQkArAICAhptYXhpbXVtIGFtb3VudCB0byB1bmxvY2s6IAkApAMBBQJlUQQCZVIJAJYDAQkAzAgCBQJiYwkAzAgCCQBrAwkAaAIFAmVPBQFpBQJlTAUCYUMFA25pbAQCZVMJAQF3AgkAZQIFAmJmBQJlUgIMZ3d4UmVtYWluaW5nBAJlVAkBAmJaAQUCYVcDCQBmAgUCZVQFAmVTCQEBbQEJAKwCAgITbG9ja2VkIGd3eCBhbW91bnQ6IAkApAMBBQJlVAMJAGcCAAAFAmVMCQEBbQECEW5vdGhpbmcgdG8gdW5sb2NrBAJlcAkBAmJZAAQCZXEJAQJjQwEFAmFXBAJlcgkA/AcEBQJiUQIRcmVmcmVzaFVzZXJSZXdhcmQJAMwIAggFAmFXBWJ5dGVzBQNuaWwFA25pbAMJAAACBQJlcgUCZXIJAM4IAgkAzQgCCQDNCAIJAM4IAgkBAmN5BwUCYVcFAmFYBQJlTAUCY2kFAmVNBQJlUwkAZAIFAmJnBQJiYwkBAmNsBAkBAS0BBQJlTAAAAAAA////////////AQkBAmNmBwIGdW5sb2NrBQJiTQUCZUwFAmNpBQJlTQUCZVIFAmFNCQEOU2NyaXB0VHJhbnNmZXIDBQJhVwUCZUwFAmF6CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYncACQEBdwIJAGUCBQJlcAUCZVICCGd3eFRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmEBBQJhVwkBAXcCCQBlAgUCZXEFAmVSAhJ1c2VyR3d4QW1vdW50VG90YWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhTQETZ3d4VXNlckluZm9SRUFET05MWQECYk0EAmFXCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUCYk0JAQFrAQIUaW52YWxpZCB1c2VyIGFkZHJlc3MEAmJmCQECY0MBBQJhVwkAlAoCBQNuaWwJAMwIAgUCYmYFA25pbAJhTQEXdXNlck1heER1cmF0aW9uUkVBRE9OTFkBAmJNCQCUCgIFA25pbAkAlAoCAgxpbmNyZWFzZUxvY2sFAmFDAmFNASBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQICYk0CZVUEAmFXCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUCYk0JAQFrAQIUaW52YWxpZCB1c2VyIGFkZHJlc3MEAmJmCQECY0MBBQJhVwkAlAoCBQNuaWwFAmJmAmFNARBnZXRVc2VyR3d4QW1vdW50AQJiTQQCYVcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQJiTQkBAWsBAhRpbnZhbGlkIHVzZXIgYWRkcmVzcwQCYmYJAQJjQwEFAmFXCQCUCgIFA25pbAUCYmYCYU0BE2dldEd3eFRvdGFsUkVBRE9OTFkACQCUCgIFA25pbAkBAmJZAAJhTQEVb25Cb29zdEVtaXNzaW9uVXBkYXRlAAQCZXgDCQAAAggFAmFNBmNhbGxlcgUCYk8GCQECYUwBBQJhTQMJAAACBQJleAUCZXgJAQJkRAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BEm9uU3Rha2VkVm90ZVVwZGF0ZQMCYkUCYk0CZHAEAmV4AwkAAAIIBQJhTQZjYWxsZXIFAmJQBgkBAmFMAQUCYU0DCQAAAgUCZXgFAmV4BAJkcwkBAmRvAwUCYkUFAmJNBQJkcAkAlAoCBQJkcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhTQEdZ2V0Vm90aW5nUmVzdWx0U3Rha2VkUkVBRE9OTFkBAmJFCQCUCgIFA25pbAkBAmNUAQUCYkUCYU0BJWdldFZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsUkVBRE9OTFkBAmJFCQCUCgIFA25pbAkBAmNYAQUCYkUCYU0BHGdldFVzZXJWb3RlRmluYWxpemVkUkVBRE9OTFkCAmJFAmJNCQCUCgIFA25pbAkBAmNNAgUCYkUFAmJNAmFNASFnZXRVc2VyVm90ZVN0YWtlZEludGVncmFsUkVBRE9OTFkCAmJFAmJNCQCUCgIFA25pbAkBAmRoAgUCYkUFAmJNAQJlVgECZVcABAJlWAQCYUgJAQJhSgADCQABAgUCYUgCCkJ5dGVWZWN0b3IEAmFPBQJhSAUCYU8DCQABAgUCYUgCBFVuaXQIBQJlVg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCZVYJYm9keUJ5dGVzCQCRAwIIBQJlVgZwcm9vZnMAAAUCZVjXhy4z", "height": 2701527, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CtB7rWUB8c6DCbxKVXZVmdVqGA3L82gYKRVVpJ7p1zR9 Next: 8RBfG2uJi94M48pCKJYYiCGC9TGUwvDGEB9Jup7AN1Ny Diff:
OldNewDifferences
232232
233233 let IdxLockWxClaimed = 6
234234
235-func keyLockParamsRecord (userAddress,txId) = makeString(["%s%s%s__lock", toString(userAddress), toBase58String(txId)], SEP)
235+func keyLockParamsRecord (userAddress,txId) = makeString(["%s%s%s__lock", toString(userAddress), match txId {
236+ case b: ByteVector =>
237+ toBase58String(b)
238+ case _: Unit =>
239+ "legacy"
240+ case _ =>
241+ throw("Match error")
242+}], SEP)
236243
237244
238245 func readLockParamsRecordOrFail (userAddress,txId) = split(getStringOrFail(this, keyLockParamsRecord(userAddress, txId)), SEP)
423430
424431
425432 func getVotingEmissionEpochInfo () = {
426- let $t01490815198 = {
433+ let $t01499515285 = {
427434 let currentEpochUi = value(getInteger(votingEmissionContract, keyCurrentEpochUi()))
428435 let lastFinalizedEpoch = (currentEpochUi - 1)
429436 if ((0 > lastFinalizedEpoch))
430437 then throwErr("invalid epoch")
431438 else $Tuple2(currentEpochUi, lastFinalizedEpoch)
432439 }
433- let currentEpochUi = $t01490815198._1
434- let lastFinalizedEpoch = $t01490815198._2
440+ let currentEpochUi = $t01499515285._1
441+ let lastFinalizedEpoch = $t01499515285._2
435442 let currentEpochStartHeight = value(getInteger(votingEmissionContract, keyStartHeightByEpoch(currentEpochUi)))
436443 $Tuple2(lastFinalizedEpoch, currentEpochStartHeight)
437444 }
464471
465472 func getUserVoteFinalized (lpAssetIdStr,userAddressStr) = {
466473 let userAddress = addressFromStringValue(userAddressStr)
467- let $t01588915969 = getVotingEmissionEpochInfo()
468- let lastFinalizedEpoch = $t01588915969._1
469- let currentEpochStartHeight = $t01588915969._2
470- let $t01597216047 = getPoolAssetsByLpAssetId(lpAssetIdStr)
471- let amountAssetId = $t01597216047._1
472- let priceAssetId = $t01597216047._2
474+ let $t01597616056 = getVotingEmissionEpochInfo()
475+ let lastFinalizedEpoch = $t01597616056._1
476+ let currentEpochStartHeight = $t01597616056._2
477+ let $t01605916134 = getPoolAssetsByLpAssetId(lpAssetIdStr)
478+ let amountAssetId = $t01605916134._1
479+ let priceAssetId = $t01605916134._2
473480 let userVoteKey = keyVote(amountAssetId, priceAssetId, userAddress, lastFinalizedEpoch)
474481 let userVote = valueOrElse(getInteger(votingEmissionContract, userVoteKey), 0)
475482 userVote
486493
487494
488495 func getVotingResultStaked (lpAssetIdStr) = {
489- let $t01659116671 = getVotingEmissionEpochInfo()
490- let lastFinalizedEpoch = $t01659116671._1
491- let currentEpochStartHeight = $t01659116671._2
496+ let $t01667816758 = getVotingEmissionEpochInfo()
497+ let lastFinalizedEpoch = $t01667816758._1
498+ let currentEpochStartHeight = $t01667816758._2
492499 let votingResultStakedStart = valueOrElse(getInteger(votingEmissionContract, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), 0)
493500 let votingResultStaked = valueOrElse(getInteger(this, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), votingResultStakedStart)
494501 votingResultStaked
496503
497504
498505 func getVotingResultStakedIntegral (lpAssetIdStr) = {
499- let $t01703317113 = getVotingEmissionEpochInfo()
500- let lastFinalizedEpoch = $t01703317113._1
501- let currentEpochStartHeight = $t01703317113._2
506+ let $t01712017200 = getVotingEmissionEpochInfo()
507+ let lastFinalizedEpoch = $t01712017200._1
508+ let currentEpochStartHeight = $t01712017200._2
502509 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
503510 let votingResultStakedIntegralPrev = valueOrElse(getInteger(this, keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch)), 0)
504511 let votingResultStakedLastUpdateHeight = valueOrElse(getInteger(this, keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch)), currentEpochStartHeight)
509516
510517
511518 func refreshVotingResultStakedIntegral (lpAssetIdStr,stakedVoteDelta) = {
512- let $t01795018030 = getVotingEmissionEpochInfo()
513- let lastFinalizedEpoch = $t01795018030._1
514- let currentEpochStartHeight = $t01795018030._2
519+ let $t01803718117 = getVotingEmissionEpochInfo()
520+ let lastFinalizedEpoch = $t01803718117._1
521+ let currentEpochStartHeight = $t01803718117._2
515522 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
516523 let votingResultStakedNew = (votingResultStaked + stakedVoteDelta)
517524 let votingResultStakedIntegral = getVotingResultStakedIntegral(lpAssetIdStr)
520527
521528
522529 func getUserVoteStakedIntegral (lpAssetIdStr,userAddressStr) = {
523- let $t01864118721 = getVotingEmissionEpochInfo()
524- let lastFinalizedEpoch = $t01864118721._1
525- let currentEpochStartHeight = $t01864118721._2
530+ let $t01872818808 = getVotingEmissionEpochInfo()
531+ let lastFinalizedEpoch = $t01872818808._1
532+ let currentEpochStartHeight = $t01872818808._2
526533 let userAddress = addressFromStringValue(userAddressStr)
527534 let userVoteStaked = getUserVoteStaked(lpAssetIdStr, userAddressStr)
528535 let userVoteStakedIntegralPrev = valueOrElse(getInteger(this, keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch)), 0)
534541
535542
536543 func refreshVoteStakedIntegral (lpAssetIdStr,userAddressStr,edge) = {
537- let $t01950919589 = getVotingEmissionEpochInfo()
538- let lastFinalizedEpoch = $t01950919589._1
539- let currentEpochStartHeight = $t01950919589._2
544+ let $t01959619676 = getVotingEmissionEpochInfo()
545+ let lastFinalizedEpoch = $t01959619676._1
546+ let currentEpochStartHeight = $t01959619676._2
540547 let userAddress = addressFromStringValue(userAddressStr)
541548 let userVoteFinalized = getUserVoteFinalized(lpAssetIdStr, userAddressStr)
542549 let actions = if ((userVoteFinalized == 0))
555562
556563
557564 func getStakedVotesIntegralsDiff (lpAssetIdStr,userAddressStr) = {
558- let $t02044320523 = getVotingEmissionEpochInfo()
559- let lastFinalizedEpoch = $t02044320523._1
560- let currentEpochStartHeight = $t02044320523._2
565+ let $t02053020610 = getVotingEmissionEpochInfo()
566+ let lastFinalizedEpoch = $t02053020610._1
567+ let currentEpochStartHeight = $t02053020610._2
561568 let userAddress = addressFromStringValue(userAddressStr)
562569 let userVoteStakedIntegralLastKey = keyVoteStakedIntegralLast(lpAssetIdStr, userAddress, lastFinalizedEpoch)
563570 let userVoteStakedIntegralLast = valueOrElse(getInteger(this, userVoteStakedIntegralLastKey), 0)
616623 if ((0 > userBoostEmissionIntegral))
617624 then throwErr("wrong calculations")
618625 else {
619- let $t02406524204 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
620- let stakedVotesIntegralsActions = $t02406524204._1
621- let userVoteIntegralDiff = $t02406524204._2
622- let totalVotesIntegralDiff = $t02406524204._3
626+ let $t02415224291 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
627+ let stakedVotesIntegralsActions = $t02415224291._1
628+ let userVoteIntegralDiff = $t02415224291._2
629+ let totalVotesIntegralDiff = $t02415224291._3
623630 let poolUserBoostEmissionIntegral = fraction(userBoostEmissionIntegral, poolWeight, POOLWEIGHTMULT)
624631 let userBoostAvaliableToClaimTotalNew = if ((totalVotesIntegralDiff == 0))
625632 then 0
702709
703710 @Callable(i)
704711 func lockRef (duration,referrerAddress,signature) = {
705- let $t02818128246 = lockActions(i, duration)
706- let lockActionsResult = $t02818128246._1
707- let gWxAmountStart = $t02818128246._2
712+ let $t02826828333 = lockActions(i, duration)
713+ let lockActionsResult = $t02826828333._1
714+ let gWxAmountStart = $t02826828333._2
708715 let referralAddress = toString(i.caller)
709716 let refInv = if (if ((referrerAddress == ""))
710717 then true
725732
726733 @Callable(i)
727734 func lock (duration) = {
728- let $t02870428769 = lockActions(i, duration)
729- let lockActionsResult = $t02870428769._1
730- let gWxAmountStart = $t02870428769._2
735+ let $t02879128856 = lockActions(i, duration)
736+ let lockActionsResult = $t02879128856._1
737+ let gWxAmountStart = $t02879128856._2
731738 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
732739 if ((updateRefActivity == updateRefActivity))
733740 then $Tuple2(lockActionsResult, unit)
740747 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
741748 then throwErr("permissions denied")
742749 else {
743- let $t02907929181 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
744- let userBoostAvailable = $t02907929181._1
745- let dataState = $t02907929181._2
746- let debug = $t02907929181._3
750+ let $t02916629268 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
751+ let userBoostAvailable = $t02916629268._1
752+ let dataState = $t02916629268._2
753+ let debug = $t02916629268._3
747754 $Tuple2(dataState, [userBoostAvailable])
748755 }
749756
751758
752759 @Callable(i)
753760 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
754- let $t02931329414 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
755- let userBoostAvailable = $t02931329414._1
756- let dataState = $t02931329414._2
757- let debug = $t02931329414._3
761+ let $t02940029501 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
762+ let userBoostAvailable = $t02940029501._1
763+ let dataState = $t02940029501._2
764+ let debug = $t02940029501._3
758765 $Tuple2(nil, [userBoostAvailable, debug])
759766 }
760767
764771 func unlock (userAddressStr,txIdStr,amount) = {
765772 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
766773 let txId = fromBase58String(txIdStr)
767- let userRecordArray = readLockParamsRecordOrFail(userAddress, txId)
774+ let userRecordArray = readLockParamsRecordOrFail(userAddress, if ((txIdStr == ""))
775+ then txId
776+ else unit)
768777 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
769778 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
770779 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE8 = 8
77
88 let MULT8 = 100000000
99
1010 let POOLWEIGHTMULT = MULT8
1111
1212 let contractFilename = "boosting.ride"
1313
1414 let SCALE18 = 18
1515
1616 let MULT18 = 1000000000000000000
1717
1818 let MULT18BI = toBigInt(MULT18)
1919
2020 let blocksInDay = 1440
2121
2222 let blocksInMonth = 43800
2323
2424 func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
2525
2626
2727 func throwErr (msg) = throw(wrapErr(msg))
2828
2929
3030 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), wrapErr((("mandatory this." + key) + " is not defined")))
3131
3232
3333 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
3434
3535
3636 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
3737
3838
3939 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), wrapErr((("mandatory this." + key) + " is not defined")))
4040
4141
4242 func abs (val) = if ((0 > val))
4343 then -(val)
4444 else val
4545
4646
4747 func ensurePositive (v,m) = if ((v >= 0))
4848 then v
4949 else throwErr((valueOrElse(m, "value") + " should be positive"))
5050
5151
5252 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
5353
5454
5555 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(this, keyReferralsContractAddress()))
5656
5757 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5858
5959 let referralProgramNameDefault = "wxlock"
6060
6161 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
6262
6363 func keyFactoryAddress () = "%s%s__config__factoryAddress"
6464
6565
6666 let IdxFactoryCfgStakingDapp = 1
6767
6868 let IdxFactoryCfgBoostingDapp = 2
6969
7070 let IdxFactoryCfgIdoDapp = 3
7171
7272 let IdxFactoryCfgTeamDapp = 4
7373
7474 let IdxFactoryCfgEmissionDapp = 5
7575
7676 let IdxFactoryCfgRestDapp = 6
7777
7878 let IdxFactoryCfgSlippageDapp = 7
7979
8080 let IdxFactoryCfgDaoDapp = 8
8181
8282 let IdxFactoryCfgMarketingDapp = 9
8383
8484 let IdxFactoryCfgGwxRewardDapp = 10
8585
8686 let IdxFactoryCfgBirdsDapp = 11
8787
8888 func keyFactoryCfg () = "%s__factoryConfig"
8989
9090
9191 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9292
9393
9494 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
9595
9696
9797 func keyFactoryPoolWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
9898
9999
100100 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
101101
102102
103103 func readFactoryCfgOrFail (factory) = split(getStringOrFail(factory, keyFactoryCfg()), SEP)
104104
105105
106106 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
107107
108108
109109 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
110110
111111
112112 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
113113
114114
115115 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
116116
117117
118118 func keyManagerPublicKey () = "%s__managerPublicKey"
119119
120120
121121 func keyManagerVaultAddress () = "%s__managerVaultAddress"
122122
123123
124124 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
125125
126126
127127 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
128128
129129
130130 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
131131
132132
133133 func keyBoostingV2LastUpdateHeight () = "%s%s__boostingV2__startBlock"
134134
135135
136136 func keyBoostingV2Integral () = "%s%s__boostingV2__integral"
137137
138138
139139 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
140140
141141
142142 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
143143
144144
145145 func keyNextPergetIntOrDefault () = "%s__nextPeriod"
146146
147147
148148 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
149149
150150
151151 let IdxCfgAssetId = 1
152152
153153 let IdxCfgMinLockAmount = 2
154154
155155 let IdxCfgMinLockDuration = 3
156156
157157 let IdxCfgMaxLockDuration = 4
158158
159159 let IdxCfgMathContract = 5
160160
161161 func keyConfig () = "%s__config"
162162
163163
164164 func readConfigArrayOrFail () = split(getStringOrFail(this, keyConfig()), SEP)
165165
166166
167167 let cfgArray = readConfigArrayOrFail()
168168
169169 let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
170170
171171 let minLockAmount = valueOrErrorMessage(parseInt(cfgArray[IdxCfgMinLockAmount]), wrapErr("invalid min lock amount"))
172172
173173 let minLockDuration = valueOrErrorMessage(parseInt(cfgArray[IdxCfgMinLockDuration]), wrapErr("invalid min lock duration"))
174174
175175 let maxLockDuration = valueOrErrorMessage(parseInt(cfgArray[IdxCfgMaxLockDuration]), wrapErr("invalid max lock duration"))
176176
177177 let mathContract = valueOrErrorMessage(addressFromString(cfgArray[IdxCfgMathContract]), wrapErr("invalid math contract address"))
178178
179179 func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d%s", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
180180
181181
182182 func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
183183
184184
185185 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
186186 case s: String =>
187187 addressFromStringValue(s)
188188 case _ =>
189189 this
190190 }
191191
192192
193193 func managerPublicKeyOrUnit () = {
194194 let managerVaultAddress = getManagerVaultAddressOrThis()
195195 match getString(managerVaultAddress, keyManagerPublicKey()) {
196196 case s: String =>
197197 fromBase58String(s)
198198 case _: Unit =>
199199 unit
200200 case _ =>
201201 throw("Match error")
202202 }
203203 }
204204
205205
206206 func mustManager (i) = {
207207 let pd = throwErr("Permission denied")
208208 match managerPublicKeyOrUnit() {
209209 case pk: ByteVector =>
210210 if ((i.callerPublicKey == pk))
211211 then true
212212 else pd
213213 case _: Unit =>
214214 if ((i.caller == this))
215215 then true
216216 else pd
217217 case _ =>
218218 throw("Match error")
219219 }
220220 }
221221
222222
223223 let IdxLockAmount = 1
224224
225225 let IdxLockStart = 2
226226
227227 let IdxLockDuration = 3
228228
229229 let IdxLockLastUpdateTimestamp = 4
230230
231231 let IdxLockGwxAmount = 5
232232
233233 let IdxLockWxClaimed = 6
234234
235-func keyLockParamsRecord (userAddress,txId) = makeString(["%s%s%s__lock", toString(userAddress), toBase58String(txId)], SEP)
235+func keyLockParamsRecord (userAddress,txId) = makeString(["%s%s%s__lock", toString(userAddress), match txId {
236+ case b: ByteVector =>
237+ toBase58String(b)
238+ case _: Unit =>
239+ "legacy"
240+ case _ =>
241+ throw("Match error")
242+}], SEP)
236243
237244
238245 func readLockParamsRecordOrFail (userAddress,txId) = split(getStringOrFail(this, keyLockParamsRecord(userAddress, txId)), SEP)
239246
240247
241248 func keyUserGwxAmountTotal (userAddress) = makeString(["%s%s__gwxAmountTotal", toString(userAddress)], SEP)
242249
243250
244251 func formatLockParamsRecord (amount,start,duration,gwxAmount,wxClaimed) = makeString(["%d%d%d%d%d%d%d", toString(amount), toString(start), toString(duration), toString(lastBlock.timestamp), toString(gwxAmount), toString(wxClaimed)], SEP)
245252
246253
247254 func keyNextUserNum () = "%s__nextUserNum"
248255
249256
250257 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
251258
252259
253260 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
254261
255262
256263 func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
257264
258265
259266 func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
260267
261268
262269 func keyStatsLocksCount () = "%s%s__stats__locksCount"
263270
264271
265272 func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
266273
267274
268275 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastIntV2", toString(userNum)], SEP)
269276
270277
271278 func keyUserLpBoostEmissionLastINTEGRAL (userNum,lpAssetId) = makeString(["%s%d__userBoostEmissionLastIntV2", toString(userNum), lpAssetId], SEP)
272279
273280
274281 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", toString(userNum)], SEP)
275282
276283
277284 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
278285
279286
280287 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", toString(userNum)], SEP)
281288
282289
283290 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", toString(userNum)], SEP)
284291
285292
286293 func keyGwxTotal () = "%s%s__gwx__total"
287294
288295
289296 func keyVote (amountAssetId,priceAssetId,address,epoch) = makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], SEP)
290297
291298
292299 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], SEP)
293300
294301
295302 func keyCurrentEpochUi () = makeString(["%s", "currentEpochUi"], SEP)
296303
297304
298305 func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], SEP)
299306
300307
301308 func keyVotingResultStakedIntegral (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStakedIntegral", lpAssetIdStr, toString(epoch)], SEP)
302309
303310
304311 func keyVotingResultStakedLastUpdateHeight (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStakedIntegralLastUpdateHeight", lpAssetIdStr, toString(epoch)], SEP)
305312
306313
307314 func keyVotingResultStakedIntegralLast (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "votingResultStakedIntegralLast", lpAssetIdStr, toString(address), toString(epoch)], SEP)
308315
309316
310317 func keyVoteStakedIntegral (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegral", lpAssetIdStr, toString(address), toString(epoch)], SEP)
311318
312319
313320 func keyVoteStakedLastUpdateHeight (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegralLastUpdateHeight", lpAssetIdStr, toString(address), toString(epoch)], SEP)
314321
315322
316323 func keyVoteStakedIntegralLast (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegralLast", lpAssetIdStr, toString(address), toString(epoch)], SEP)
317324
318325
319326 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], SEP)
320327
321328
322329 let factoryContract = readFactoryAddressOrFail()
323330
324331 let factoryCfg = readFactoryCfgOrFail(factoryContract)
325332
326333 let emissionContract = getEmissionAddressOrFail(factoryCfg)
327334
328335 let stakingContract = getStakingAddressOrFail(factoryCfg)
329336
330337 let gwxRewardContract = getGwxRewardAddressOrFail(factoryCfg)
331338
332339 let lpStakingPoolsContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(makeString(["%s", "lpStakingPoolsContract"], SEP)), wrapErr("lp_staking_pools contract address is undefined"))), wrapErr("invalid lp_staking_pools contract address"))
333340
334341 let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
335342
336343 let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract))
337344
338345 let keyVotingEmissionRateContract = makeString(["%s", "votingEmissionRateContract"], SEP)
339346
340347 let boostCoeff = {
341348 let @ = invoke(emissionContract, "getBoostCoeffREADONLY", nil, nil)
342349 if ($isInstanceOf(@, "Int"))
343350 then @
344351 else throw(($getType(@) + " couldn't be cast to Int"))
345352 }
346353
347354 func userNumberByAddressOrFail (userAddress) = match getString(this, keyUser2NumMapping(toString(userAddress))) {
348355 case s: String =>
349356 valueOrErrorMessage(parseInt(s), wrapErr("invalid user number"))
350357 case _: Unit =>
351358 throwErr("invalid user")
352359 case _ =>
353360 throw("Match error")
354361 }
355362
356363
357364 func getGwxAmountTotal () = valueOrElse(getInteger(this, keyGwxTotal()), 0)
358365
359366
360367 func getLockedGwxAmount (userAddress) = {
361368 let functionName = "getLockedGwxAmount"
362369 let votingEmissionRateContract = valueOrErrorMessage( match getString(votingEmissionContract, keyVotingEmissionRateContract) {
363370 case _: Unit =>
364371 unit
365372 case s: String =>
366373 addressFromString(s)
367374 case _ =>
368375 throw("Match error")
369376 }, wrapErr("invalid voting emission rate address"))
370377 let lockedVotingEmissionRate = {
371378 let @ = invoke(votingEmissionContract, functionName, [toString(userAddress)], nil)
372379 if ($isInstanceOf(@, "Int"))
373380 then @
374381 else throw(($getType(@) + " couldn't be cast to Int"))
375382 }
376383 let lockedVotingEmission = {
377384 let @ = invoke(votingEmissionRateContract, functionName, [toString(userAddress)], nil)
378385 if ($isInstanceOf(@, "Int"))
379386 then @
380387 else throw(($getType(@) + " couldn't be cast to Int"))
381388 }
382389 let locked = max([lockedVotingEmissionRate, lockedVotingEmission])
383390 locked
384391 }
385392
386393
387394 func HistoryEntry (type,user,amount,lockStart,duration,gwxAmount,i) = {
388395 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
389396 let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(gwxAmount)], SEP)
390397 StringEntry(historyKEY, historyDATA)
391398 }
392399
393400
394401 func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
395402 let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
396403 let locksCountKEY = keyStatsLocksCount()
397404 let usersCountKEY = keyStatsUsersCount()
398405 let totalAmountKEY = keyLockParamTotalAmount()
399406 let locksDurationSumInBlocks = getIntOrZero(this, locksDurationSumInBlocksKEY)
400407 let locksCount = getIntOrZero(this, locksCountKEY)
401408 let usersCount = getIntOrZero(this, usersCountKEY)
402409 let totalAmount = getIntOrZero(this, totalAmountKEY)
403410 [IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
404411 }
405412
406413
407414 func LockParamsEntry (userAddress,txId,amount,start,duration,gwxAmount,wxClaimed) = [StringEntry(keyLockParamsRecord(userAddress, txId), formatLockParamsRecord(amount, start, duration, gwxAmount, wxClaimed))]
408415
409416
410417 func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
411418 then throwErr("only one payment is allowed")
412419 else if ((size(i.payments) == 0))
413420 then 0
414421 else {
415422 let pmt = i.payments[0]
416423 if ((value(pmt.assetId) != expectedAssetId))
417424 then throwErr("invalid asset id in payment")
418425 else pmt.amount
419426 }
420427
421428
422429 func getUserGwxAmountTotal (userAddress) = valueOrElse(getInteger(this, keyUserGwxAmountTotal(userAddress)), 0)
423430
424431
425432 func getVotingEmissionEpochInfo () = {
426- let $t01490815198 = {
433+ let $t01499515285 = {
427434 let currentEpochUi = value(getInteger(votingEmissionContract, keyCurrentEpochUi()))
428435 let lastFinalizedEpoch = (currentEpochUi - 1)
429436 if ((0 > lastFinalizedEpoch))
430437 then throwErr("invalid epoch")
431438 else $Tuple2(currentEpochUi, lastFinalizedEpoch)
432439 }
433- let currentEpochUi = $t01490815198._1
434- let lastFinalizedEpoch = $t01490815198._2
440+ let currentEpochUi = $t01499515285._1
441+ let lastFinalizedEpoch = $t01499515285._2
435442 let currentEpochStartHeight = value(getInteger(votingEmissionContract, keyStartHeightByEpoch(currentEpochUi)))
436443 $Tuple2(lastFinalizedEpoch, currentEpochStartHeight)
437444 }
438445
439446
440447 func getPoolAssetsByLpAssetId (lpAssetIdStr) = {
441448 let idxAmountAssetId = 4
442449 let idxPriceAssetId = 5
443450 let poolCfg = {
444451 let @ = invoke(factoryContract, "getPoolConfigByLpAssetIdREADONLY", [lpAssetIdStr], nil)
445452 if ($isInstanceOf(@, "List[Any]"))
446453 then @
447454 else throw(($getType(@) + " couldn't be cast to List[Any]"))
448455 }
449456 let amountAssetId = {
450457 let @ = poolCfg[idxAmountAssetId]
451458 if ($isInstanceOf(@, "String"))
452459 then @
453460 else throw(($getType(@) + " couldn't be cast to String"))
454461 }
455462 let priceAssetId = {
456463 let @ = poolCfg[idxPriceAssetId]
457464 if ($isInstanceOf(@, "String"))
458465 then @
459466 else throw(($getType(@) + " couldn't be cast to String"))
460467 }
461468 $Tuple2(amountAssetId, priceAssetId)
462469 }
463470
464471
465472 func getUserVoteFinalized (lpAssetIdStr,userAddressStr) = {
466473 let userAddress = addressFromStringValue(userAddressStr)
467- let $t01588915969 = getVotingEmissionEpochInfo()
468- let lastFinalizedEpoch = $t01588915969._1
469- let currentEpochStartHeight = $t01588915969._2
470- let $t01597216047 = getPoolAssetsByLpAssetId(lpAssetIdStr)
471- let amountAssetId = $t01597216047._1
472- let priceAssetId = $t01597216047._2
474+ let $t01597616056 = getVotingEmissionEpochInfo()
475+ let lastFinalizedEpoch = $t01597616056._1
476+ let currentEpochStartHeight = $t01597616056._2
477+ let $t01605916134 = getPoolAssetsByLpAssetId(lpAssetIdStr)
478+ let amountAssetId = $t01605916134._1
479+ let priceAssetId = $t01605916134._2
473480 let userVoteKey = keyVote(amountAssetId, priceAssetId, userAddress, lastFinalizedEpoch)
474481 let userVote = valueOrElse(getInteger(votingEmissionContract, userVoteKey), 0)
475482 userVote
476483 }
477484
478485
479486 func getUserVoteStaked (lpAssetIdStr,userAddressStr) = {
480487 let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(userAddressStr, lpAssetIdStr)), 0)
481488 let userVote = getUserVoteFinalized(lpAssetIdStr, userAddressStr)
482489 if ((stakedByUser == 0))
483490 then 0
484491 else userVote
485492 }
486493
487494
488495 func getVotingResultStaked (lpAssetIdStr) = {
489- let $t01659116671 = getVotingEmissionEpochInfo()
490- let lastFinalizedEpoch = $t01659116671._1
491- let currentEpochStartHeight = $t01659116671._2
496+ let $t01667816758 = getVotingEmissionEpochInfo()
497+ let lastFinalizedEpoch = $t01667816758._1
498+ let currentEpochStartHeight = $t01667816758._2
492499 let votingResultStakedStart = valueOrElse(getInteger(votingEmissionContract, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), 0)
493500 let votingResultStaked = valueOrElse(getInteger(this, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), votingResultStakedStart)
494501 votingResultStaked
495502 }
496503
497504
498505 func getVotingResultStakedIntegral (lpAssetIdStr) = {
499- let $t01703317113 = getVotingEmissionEpochInfo()
500- let lastFinalizedEpoch = $t01703317113._1
501- let currentEpochStartHeight = $t01703317113._2
506+ let $t01712017200 = getVotingEmissionEpochInfo()
507+ let lastFinalizedEpoch = $t01712017200._1
508+ let currentEpochStartHeight = $t01712017200._2
502509 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
503510 let votingResultStakedIntegralPrev = valueOrElse(getInteger(this, keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch)), 0)
504511 let votingResultStakedLastUpdateHeight = valueOrElse(getInteger(this, keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch)), currentEpochStartHeight)
505512 let votingResultStakedIntegralDh = (height - votingResultStakedLastUpdateHeight)
506513 let votingResultStakedIntegral = ((votingResultStakedIntegralDh * votingResultStaked) + votingResultStakedIntegralPrev)
507514 votingResultStakedIntegral
508515 }
509516
510517
511518 func refreshVotingResultStakedIntegral (lpAssetIdStr,stakedVoteDelta) = {
512- let $t01795018030 = getVotingEmissionEpochInfo()
513- let lastFinalizedEpoch = $t01795018030._1
514- let currentEpochStartHeight = $t01795018030._2
519+ let $t01803718117 = getVotingEmissionEpochInfo()
520+ let lastFinalizedEpoch = $t01803718117._1
521+ let currentEpochStartHeight = $t01803718117._2
515522 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
516523 let votingResultStakedNew = (votingResultStaked + stakedVoteDelta)
517524 let votingResultStakedIntegral = getVotingResultStakedIntegral(lpAssetIdStr)
518525 [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch), votingResultStakedNew), IntegerEntry(keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch), height), IntegerEntry(keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch), votingResultStakedIntegral)]
519526 }
520527
521528
522529 func getUserVoteStakedIntegral (lpAssetIdStr,userAddressStr) = {
523- let $t01864118721 = getVotingEmissionEpochInfo()
524- let lastFinalizedEpoch = $t01864118721._1
525- let currentEpochStartHeight = $t01864118721._2
530+ let $t01872818808 = getVotingEmissionEpochInfo()
531+ let lastFinalizedEpoch = $t01872818808._1
532+ let currentEpochStartHeight = $t01872818808._2
526533 let userAddress = addressFromStringValue(userAddressStr)
527534 let userVoteStaked = getUserVoteStaked(lpAssetIdStr, userAddressStr)
528535 let userVoteStakedIntegralPrev = valueOrElse(getInteger(this, keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch)), 0)
529536 let userVoteStakedLastUpdateHeight = valueOrElse(getInteger(this, keyVoteStakedLastUpdateHeight(lpAssetIdStr, userAddress, lastFinalizedEpoch)), currentEpochStartHeight)
530537 let userVoteStakedIntegralDh = (height - userVoteStakedLastUpdateHeight)
531538 let userVoteStakedIntegral = ((userVoteStakedIntegralDh * userVoteStaked) + userVoteStakedIntegralPrev)
532539 userVoteStakedIntegral
533540 }
534541
535542
536543 func refreshVoteStakedIntegral (lpAssetIdStr,userAddressStr,edge) = {
537- let $t01950919589 = getVotingEmissionEpochInfo()
538- let lastFinalizedEpoch = $t01950919589._1
539- let currentEpochStartHeight = $t01950919589._2
544+ let $t01959619676 = getVotingEmissionEpochInfo()
545+ let lastFinalizedEpoch = $t01959619676._1
546+ let currentEpochStartHeight = $t01959619676._2
540547 let userAddress = addressFromStringValue(userAddressStr)
541548 let userVoteFinalized = getUserVoteFinalized(lpAssetIdStr, userAddressStr)
542549 let actions = if ((userVoteFinalized == 0))
543550 then nil
544551 else {
545552 let stakedVoteDelta = if (edge)
546553 then userVoteFinalized
547554 else -(userVoteFinalized)
548555 let votingResultActions = refreshVotingResultStakedIntegral(lpAssetIdStr, stakedVoteDelta)
549556 let userVoteStakedIntegral = getUserVoteStakedIntegral(lpAssetIdStr, userAddressStr)
550557 let voteActions = [IntegerEntry(keyVoteStakedLastUpdateHeight(lpAssetIdStr, userAddress, lastFinalizedEpoch), height), IntegerEntry(keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch), userVoteStakedIntegral)]
551558 (votingResultActions ++ voteActions)
552559 }
553560 actions
554561 }
555562
556563
557564 func getStakedVotesIntegralsDiff (lpAssetIdStr,userAddressStr) = {
558- let $t02044320523 = getVotingEmissionEpochInfo()
559- let lastFinalizedEpoch = $t02044320523._1
560- let currentEpochStartHeight = $t02044320523._2
565+ let $t02053020610 = getVotingEmissionEpochInfo()
566+ let lastFinalizedEpoch = $t02053020610._1
567+ let currentEpochStartHeight = $t02053020610._2
561568 let userAddress = addressFromStringValue(userAddressStr)
562569 let userVoteStakedIntegralLastKey = keyVoteStakedIntegralLast(lpAssetIdStr, userAddress, lastFinalizedEpoch)
563570 let userVoteStakedIntegralLast = valueOrElse(getInteger(this, userVoteStakedIntegralLastKey), 0)
564571 let votingResultStakedIntegralLastKey = keyVotingResultStakedIntegralLast(lpAssetIdStr, userAddress, lastFinalizedEpoch)
565572 let votingResultStakedIntegralLast = valueOrElse(getInteger(this, votingResultStakedIntegralLastKey), 0)
566573 let userVoteStakedIntegral = getUserVoteStakedIntegral(lpAssetIdStr, userAddressStr)
567574 let votingResultStakedIntegral = getVotingResultStakedIntegral(lpAssetIdStr)
568575 let userVoteStakedIntegralDiff = (userVoteStakedIntegral - userVoteStakedIntegralLast)
569576 let votingResultStakedIntegralDiff = (votingResultStakedIntegral - votingResultStakedIntegralLast)
570577 $Tuple3([IntegerEntry(userVoteStakedIntegralLastKey, userVoteStakedIntegral), IntegerEntry(votingResultStakedIntegralLastKey, votingResultStakedIntegral)], userVoteStakedIntegralDiff, votingResultStakedIntegralDiff)
571578 }
572579
573580
574581 func refreshBoostEmissionIntegral () = {
575582 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
576583 let boostingV2LastUpdateHeightOption = getInteger(this, keyBoostingV2LastUpdateHeight())
577584 let boostingV2IngergalOption = getInteger(this, keyBoostingV2Integral())
578585 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
579586 let h = if ((height > emissionEnd))
580587 then emissionEnd
581588 else height
582589 let dh = match boostingV2LastUpdateHeightOption {
583590 case lastUpdateHeight: Int =>
584591 max([(h - lastUpdateHeight), 0])
585592 case _: Unit =>
586593 0
587594 case _ =>
588595 throw("Match error")
589596 }
590597 let boostEmissionPerBlock = ((wxEmissionPerBlock * (boostCoeff - 1)) / boostCoeff)
591598 let boostEmissionIntegralPrev = valueOrElse(boostingV2IngergalOption, 0)
592599 let boostEmissionIntegral = ((boostEmissionPerBlock * dh) + boostEmissionIntegralPrev)
593600 $Tuple2([IntegerEntry(keyBoostingV2Integral(), boostEmissionIntegral), IntegerEntry(keyBoostingV2LastUpdateHeight(), height)], boostEmissionIntegral)
594601 }
595602
596603
597604 func internalClaimWxBoost (lpAssetIdStr,userAddressStr,readOnly) = {
598605 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
599606 let userNum = userNumberByAddressOrFail(userAddress)
600607 if ((userNum == userNum))
601608 then {
602609 let EMPTYSTR = "empty"
603610 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
604611 then {
605612 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr)), wrapErr(("unsupported lp asset " + lpAssetIdStr)))
606613 getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
607614 }
608615 else if (readOnly)
609616 then 0
610617 else throwErr(("not readonly mode: unsupported lp asset " + lpAssetIdStr))
611618 let userLpBoostEmissionLastIntegralKEY = keyUserLpBoostEmissionLastINTEGRAL(userNum, lpAssetIdStr)
612619 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNum)
613620 let userBoostEmissionLastIntegral = valueOrElse(getInteger(this, userLpBoostEmissionLastIntegralKEY), getIntOrZero(this, userBoostEmissionLastIntegralKEY))
614621 let boostEmissionIntegral = refreshBoostEmissionIntegral()._2
615622 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
616623 if ((0 > userBoostEmissionIntegral))
617624 then throwErr("wrong calculations")
618625 else {
619- let $t02406524204 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
620- let stakedVotesIntegralsActions = $t02406524204._1
621- let userVoteIntegralDiff = $t02406524204._2
622- let totalVotesIntegralDiff = $t02406524204._3
626+ let $t02415224291 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
627+ let stakedVotesIntegralsActions = $t02415224291._1
628+ let userVoteIntegralDiff = $t02415224291._2
629+ let totalVotesIntegralDiff = $t02415224291._3
623630 let poolUserBoostEmissionIntegral = fraction(userBoostEmissionIntegral, poolWeight, POOLWEIGHTMULT)
624631 let userBoostAvaliableToClaimTotalNew = if ((totalVotesIntegralDiff == 0))
625632 then 0
626633 else fraction(poolUserBoostEmissionIntegral, userVoteIntegralDiff, totalVotesIntegralDiff)
627634 let dataState = ([IntegerEntry(userLpBoostEmissionLastIntegralKEY, boostEmissionIntegral)] ++ stakedVotesIntegralsActions)
628635 let debug = makeString([toString(userBoostEmissionLastIntegral), toString(userBoostEmissionIntegral), toString(poolWeight), toString(userVoteIntegralDiff), toString(totalVotesIntegralDiff)], ":")
629636 $Tuple3(userBoostAvaliableToClaimTotalNew, dataState, debug)
630637 }
631638 }
632639 else throw("Strict value is not equal to itself.")
633640 }
634641
635642
636643 func lockActions (i,durationMonths) = {
637644 let durationMonthsAllowed = [1, 3, 6, 12, 24, 48]
638645 if (!(containsElement(durationMonthsAllowed, durationMonths)))
639646 then throwErr("invalid duration")
640647 else {
641648 let duration = (durationMonths * blocksInMonth)
642649 let assetIdStr = toBase58String(assetId)
643650 if ((size(i.payments) != 1))
644651 then throwErr("invalid payment - exact one payment must be attached")
645652 else {
646653 let pmt = i.payments[0]
647654 let pmtAmount = pmt.amount
648655 if ((assetId != value(pmt.assetId)))
649656 then throwErr((("invalid asset is in payment - " + assetIdStr) + " is expected"))
650657 else {
651658 let nextUserNumKEY = keyNextUserNum()
652659 let userAddress = i.caller
653660 let userAddressStr = toString(userAddress)
654661 let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
655662 let userNumStr = if (userIsExisting)
656663 then value(getString(keyUser2NumMapping(userAddressStr)))
657664 else toString(getIntOrFail(this, nextUserNumKEY))
658665 let userNum = parseIntValue(userNumStr)
659666 let lockStart = height
660667 if (if ((minLockAmount > pmtAmount))
661668 then (userAddress != lpStakingPoolsContract)
662669 else false)
663670 then throwErr(("amount is less then minLockAmount=" + toString(minLockAmount)))
664671 else if ((minLockDuration > duration))
665672 then throwErr(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
666673 else if ((duration > maxLockDuration))
667674 then throwErr(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
668675 else {
669676 let coeffX8 = fraction(duration, MULT8, maxLockDuration)
670677 let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
671678 let gwxAmountTotal = getGwxAmountTotal()
672679 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNum)
673680 let boostEmissionIntegral = refreshBoostEmissionIntegral()._2
674681 let userGwxAmountTotal = getUserGwxAmountTotal(userAddress)
675682 let gwxRewardInv = invoke(gwxRewardContract, "refreshUserReward", [userAddress.bytes], nil)
676683 if ((gwxRewardInv == gwxRewardInv))
677684 then {
678685 let arr = if (userIsExisting)
679686 then nil
680687 else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
681688 $Tuple2(((((arr ++ LockParamsEntry(userAddress, i.transactionId, pmtAmount, lockStart, duration, gWxAmountStart, 0)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
682689 then 0
683690 else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, gWxAmountStart, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(keyGwxTotal(), (gwxAmountTotal + gWxAmountStart)), IntegerEntry(keyUserGwxAmountTotal(userAddress), (userGwxAmountTotal + gWxAmountStart))]), gWxAmountStart)
684691 }
685692 else throw("Strict value is not equal to itself.")
686693 }
687694 }
688695 }
689696 }
690697 }
691698
692699
693700 @Callable(i)
694701 func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = {
695702 let checkCaller = mustManager(i)
696703 if ((checkCaller == checkCaller))
697704 then ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
698705 else throw("Strict value is not equal to itself.")
699706 }
700707
701708
702709
703710 @Callable(i)
704711 func lockRef (duration,referrerAddress,signature) = {
705- let $t02818128246 = lockActions(i, duration)
706- let lockActionsResult = $t02818128246._1
707- let gWxAmountStart = $t02818128246._2
712+ let $t02826828333 = lockActions(i, duration)
713+ let lockActionsResult = $t02826828333._1
714+ let gWxAmountStart = $t02826828333._2
708715 let referralAddress = toString(i.caller)
709716 let refInv = if (if ((referrerAddress == ""))
710717 then true
711718 else (signature == base58''))
712719 then unit
713720 else invoke(referralsContractAddressOrFail, "createPair", [referralProgramName, referrerAddress, referralAddress, signature], nil)
714721 if ((refInv == refInv))
715722 then {
716723 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
717724 if ((updateRefActivity == updateRefActivity))
718725 then $Tuple2(lockActionsResult, unit)
719726 else throw("Strict value is not equal to itself.")
720727 }
721728 else throw("Strict value is not equal to itself.")
722729 }
723730
724731
725732
726733 @Callable(i)
727734 func lock (duration) = {
728- let $t02870428769 = lockActions(i, duration)
729- let lockActionsResult = $t02870428769._1
730- let gWxAmountStart = $t02870428769._2
735+ let $t02879128856 = lockActions(i, duration)
736+ let lockActionsResult = $t02879128856._1
737+ let gWxAmountStart = $t02879128856._2
731738 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
732739 if ((updateRefActivity == updateRefActivity))
733740 then $Tuple2(lockActionsResult, unit)
734741 else throw("Strict value is not equal to itself.")
735742 }
736743
737744
738745
739746 @Callable(i)
740747 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
741748 then throwErr("permissions denied")
742749 else {
743- let $t02907929181 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
744- let userBoostAvailable = $t02907929181._1
745- let dataState = $t02907929181._2
746- let debug = $t02907929181._3
750+ let $t02916629268 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
751+ let userBoostAvailable = $t02916629268._1
752+ let dataState = $t02916629268._2
753+ let debug = $t02916629268._3
747754 $Tuple2(dataState, [userBoostAvailable])
748755 }
749756
750757
751758
752759 @Callable(i)
753760 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
754- let $t02931329414 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
755- let userBoostAvailable = $t02931329414._1
756- let dataState = $t02931329414._2
757- let debug = $t02931329414._3
761+ let $t02940029501 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
762+ let userBoostAvailable = $t02940029501._1
763+ let dataState = $t02940029501._2
764+ let debug = $t02940029501._3
758765 $Tuple2(nil, [userBoostAvailable, debug])
759766 }
760767
761768
762769
763770 @Callable(i)
764771 func unlock (userAddressStr,txIdStr,amount) = {
765772 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
766773 let txId = fromBase58String(txIdStr)
767- let userRecordArray = readLockParamsRecordOrFail(userAddress, txId)
774+ let userRecordArray = readLockParamsRecordOrFail(userAddress, if ((txIdStr == ""))
775+ then txId
776+ else unit)
768777 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
769778 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
770779 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
771780 let lockEnd = (lockStart + lockDuration)
772781 let wxClaimed = parseIntValue(userRecordArray[IdxLockWxClaimed])
773782 let gwxAmount = parseIntValue(userRecordArray[IdxLockGwxAmount])
774783 let t = ((height - lockStart) / blocksInDay)
775784 let exponent = fraction(toBigInt(t), (toBigInt((8 * blocksInDay)) * MULT18BI), toBigInt(lockDuration))
776785 let wxWithdrawable = if ((height > lockEnd))
777786 then (userAmount - wxClaimed)
778787 else toInt(fraction(toBigInt(userAmount), (MULT18BI - pow(toBigInt(5), 1, exponent, SCALE18, SCALE18, DOWN)), MULT18BI))
779788 if ((amount > wxWithdrawable))
780789 then throwErr(("maximum amount to unlock: " + toString(wxWithdrawable)))
781790 else {
782791 let gwxBurned = max([amount, fraction((t * blocksInDay), userAmount, maxLockDuration)])
783792 let gwxRemaining = ensurePositive((gwxAmount - gwxBurned), "gwxRemaining")
784793 let lockedGwxAmount = getLockedGwxAmount(userAddress)
785794 if ((lockedGwxAmount > gwxRemaining))
786795 then throwErr(("locked gwx amount: " + toString(lockedGwxAmount)))
787796 else if ((0 >= userAmount))
788797 then throwErr("nothing to unlock")
789798 else {
790799 let gwxAmountTotal = getGwxAmountTotal()
791800 let userGwxAmountTotal = getUserGwxAmountTotal(userAddress)
792801 let gwxRewardInv = invoke(gwxRewardContract, "refreshUserReward", [userAddress.bytes], nil)
793802 if ((gwxRewardInv == gwxRewardInv))
794803 then ((((LockParamsEntry(userAddress, txId, userAmount, lockStart, lockDuration, gwxRemaining, (wxClaimed + amount)) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddressStr, userAmount, lockStart, lockDuration, gwxBurned, i)) :+ ScriptTransfer(userAddress, userAmount, assetId)) ++ [IntegerEntry(keyGwxTotal(), ensurePositive((gwxAmountTotal - gwxBurned), "gwxTotal")), IntegerEntry(keyUserGwxAmountTotal(userAddress), ensurePositive((userGwxAmountTotal - gwxBurned), "userGwxAmountTotal"))])
795804 else throw("Strict value is not equal to itself.")
796805 }
797806 }
798807 }
799808
800809
801810
802811 @Callable(i)
803812 func gwxUserInfoREADONLY (userAddressStr) = {
804813 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
805814 let gwxAmount = getUserGwxAmountTotal(userAddress)
806815 $Tuple2(nil, [gwxAmount])
807816 }
808817
809818
810819
811820 @Callable(i)
812821 func userMaxDurationREADONLY (userAddressStr) = $Tuple2(nil, $Tuple2("increaseLock", maxLockDuration))
813822
814823
815824
816825 @Callable(i)
817826 func getUserGwxAmountAtHeightREADONLY (userAddressStr,targetHeight) = {
818827 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
819828 let gwxAmount = getUserGwxAmountTotal(userAddress)
820829 $Tuple2(nil, gwxAmount)
821830 }
822831
823832
824833
825834 @Callable(i)
826835 func getUserGwxAmount (userAddressStr) = {
827836 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
828837 let gwxAmount = getUserGwxAmountTotal(userAddress)
829838 $Tuple2(nil, gwxAmount)
830839 }
831840
832841
833842
834843 @Callable(i)
835844 func getGwxTotalREADONLY () = $Tuple2(nil, getGwxAmountTotal())
836845
837846
838847
839848 @Callable(i)
840849 func onBoostEmissionUpdate () = {
841850 let checkCaller = if ((i.caller == emissionContract))
842851 then true
843852 else mustManager(i)
844853 if ((checkCaller == checkCaller))
845854 then refreshBoostEmissionIntegral()
846855 else throw("Strict value is not equal to itself.")
847856 }
848857
849858
850859
851860 @Callable(i)
852861 func onStakedVoteUpdate (lpAssetIdStr,userAddressStr,edge) = {
853862 let checkCaller = if ((i.caller == stakingContract))
854863 then true
855864 else mustManager(i)
856865 if ((checkCaller == checkCaller))
857866 then {
858867 let actions = refreshVoteStakedIntegral(lpAssetIdStr, userAddressStr, edge)
859868 $Tuple2(actions, unit)
860869 }
861870 else throw("Strict value is not equal to itself.")
862871 }
863872
864873
865874
866875 @Callable(i)
867876 func getVotingResultStakedREADONLY (lpAssetIdStr) = $Tuple2(nil, getVotingResultStaked(lpAssetIdStr))
868877
869878
870879
871880 @Callable(i)
872881 func getVotingResultStakedIntegralREADONLY (lpAssetIdStr) = $Tuple2(nil, getVotingResultStakedIntegral(lpAssetIdStr))
873882
874883
875884
876885 @Callable(i)
877886 func getUserVoteFinalizedREADONLY (lpAssetIdStr,userAddressStr) = $Tuple2(nil, getUserVoteFinalized(lpAssetIdStr, userAddressStr))
878887
879888
880889
881890 @Callable(i)
882891 func getUserVoteStakedIntegralREADONLY (lpAssetIdStr,userAddressStr) = $Tuple2(nil, getUserVoteStakedIntegral(lpAssetIdStr, userAddressStr))
883892
884893
885894 @Verifier(tx)
886895 func verify () = {
887896 let targetPublicKey = match managerPublicKeyOrUnit() {
888897 case pk: ByteVector =>
889898 pk
890899 case _: Unit =>
891900 tx.senderPublicKey
892901 case _ =>
893902 throw("Match error")
894903 }
895904 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
896905 }
897906

github/deemru/w8io/3ef1775 
163.49 ms