tx · B3dPSHTSBhqHxBvazhqsacBKmpAh3U8YXCyXZZUojSdC

3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy:  -0.02700000 Waves

2023.03.27 17:57 [2508515] smart account 3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy > SELF 0.00000000 Waves

{ "type": 13, "id": "B3dPSHTSBhqHxBvazhqsacBKmpAh3U8YXCyXZZUojSdC", "fee": 2700000, "feeAssetId": null, "timestamp": 1679929053829, "version": 2, "chainId": 84, "sender": "3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy", "senderPublicKey": "9W33iCCNfmFxUbiC6XZcH5x7f6xfwC7Jb3BoExT5q2PV", "proofs": [ "c9angpL8YU7yAT7NeuwAazC218gQfjbbRg7U5fTUdAcuSSNBTX3yRRJmwH1DKYsp928JG8t1cVRX9iSTjjqyxHn" ], "script": "base64:BgLULwgCEggKBggIAQEBCBIFCgMBCAISAwoBARIDCgEBEgQKAggIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgQKAggBEgASABIFCgMICAQSAwoBCBIDCgEIEgQKAggIEgQKAggIEgMKAQgSACIDU0VQIgZTQ0FMRTgiBU1VTFQ4Ig5QT09MV0VJR0hUTVVMVCIHd3JhcEVyciIDbXNnIgh0aHJvd0VyciIEc3RyZiIHYWRkcmVzcyIDa2V5IgNpb3oiA2lvZCIKZGVmYXVsdFZhbCIDaW9mIgNhYnMiA3ZhbCIDYWFsIgckbWF0Y2gwIgp2YWxBbnlMeXN0IgJhaSIGdmFsSW50IhtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MiHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbCIWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZSIacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQiE3JlZmVycmFsUHJvZ3JhbU5hbWUiEWtleUZhY3RvcnlBZGRyZXNzIhhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAiGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAiFElkeEZhY3RvcnlDZmdJZG9EYXBwIhVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAiGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAiFUlkeEZhY3RvcnlDZmdSZXN0RGFwcCIZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcCIUSWR4RmFjdG9yeUNmZ0Rhb0RhcHAiGklkeEZhY3RvcnlDZmdNYXJrZXRpbmdEYXBwIhpJZHhGYWN0b3J5Q2ZnR3d4UmV3YXJkRGFwcCIWSWR4RmFjdG9yeUNmZ0JpcmRzRGFwcCINa2V5RmFjdG9yeUNmZyIQa2V5RmFjdG9yeUxwTGlzdCIma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MiCmxwQXNzZXRTdHIiFGtleUZhY3RvcnlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiG2tleUZhY3RvcnlQb29sV2VpZ2h0SGlzdG9yeSILcG9vbEFkZHJlc3MiA251bSIYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsIgpyZWFkTHBMaXN0IhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsIgpmYWN0b3J5Q2ZnIhhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwiF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsIhlnZXRHd3hSZXdhcmRBZGRyZXNzT3JGYWlsIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50IiFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQiFWtleUVtaXNzaW9uU3RhcnRCbG9jayIda2V5Qm9vc3RpbmdWMkxhc3RVcGRhdGVIZWlnaHQiFWtleUJvb3N0aW5nVjJJbnRlZ3JhbCIba2V5RW1pc3Npb25EdXJhdGlvbkluQmxvY2tzIhNrZXlFbWlzc2lvbkVuZEJsb2NrIg1rZXlOZXh0UGVyaW9kIh9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0Ig1JZHhDZmdBc3NldElkIhNJZHhDZmdNaW5Mb2NrQW1vdW50IhVJZHhDZmdNaW5Mb2NrRHVyYXRpb24iFUlkeENmZ01heExvY2tEdXJhdGlvbiISSWR4Q2ZnTWF0aENvbnRyYWN0IglrZXlDb25maWciFXJlYWRDb25maWdBcnJheU9yRmFpbCIMbWF0aENvbnRyYWN0Ig1mb3JtYXRDb25maWdTIgdhc3NldElkIg1taW5Mb2NrQW1vdW50Ig9taW5Mb2NrRHVyYXRpb24iD21heExvY2tEdXJhdGlvbiIMZm9ybWF0Q29uZmlnIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IgFzIh1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCILbXVzdE1hbmFnZXIiAWkiAnBkIgJwayIOSWR4TG9ja1VzZXJOdW0iDUlkeExvY2tBbW91bnQiDElkeExvY2tTdGFydCIPSWR4TG9ja0R1cmF0aW9uIg1JZHhMb2NrUGFyYW1LIg1JZHhMb2NrUGFyYW1CIhNrZXlMb2NrUGFyYW1zUmVjb3JkIgt1c2VyQWRkcmVzcyIacmVhZExvY2tQYXJhbXNSZWNvcmRPckZhaWwiF2Zvcm1hdExvY2tQYXJhbXNSZWNvcmRTIgd1c2VyTnVtIgZhbW91bnQiBXN0YXJ0IghkdXJhdGlvbiIGcGFyYW1LIgZwYXJhbUIiEGxhc3RVcGRUaW1lc3RhbXAiCWd3eEFtb3VudCIWZm9ybWF0TG9ja1BhcmFtc1JlY29yZCIOa2V5TmV4dFVzZXJOdW0iEmtleVVzZXIyTnVtTWFwcGluZyISa2V5TnVtMlVzZXJNYXBwaW5nIhZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50IhZrZXlMb2NrUGFyYW1TdGFydEJsb2NrIhRrZXlMb2NrUGFyYW1EdXJhdGlvbiINa2V5TG9ja1BhcmFtSyINa2V5TG9ja1BhcmFtQiIVa2V5TG9ja1BhcmFtQnlQZXJpb2RLIgZwZXJpb2QiFWtleUxvY2tQYXJhbUJ5UGVyaW9kQiIXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQiIGtleVN0YXRzTG9ja3NEdXJhdGlvblN1bUluQmxvY2tzIhJrZXlTdGF0c0xvY2tzQ291bnQiEmtleVN0YXRzVXNlcnNDb3VudCIga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwiImtleVVzZXJMcEJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwiCWxwQXNzZXRJZCIXa2V5VXNlck1heEJvb3N0SU5URUdSQUwiGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTCIha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsIhNrZXlVc2VyQm9vc3RDbGFpbWVkIhFrZXlUb3RhbENhY2hlZEd3eCIba2V5VG90YWxDYWNoZWRHd3hDb3JyZWN0aXZlIgdrZXlWb3RlIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiBWVwb2NoIhVrZXlTdGFydEhlaWdodEJ5RXBvY2giEWtleUN1cnJlbnRFcG9jaFVpIhVrZXlWb3RpbmdSZXN1bHRTdGFrZWQiDGxwQXNzZXRJZFN0ciIda2V5Vm90aW5nUmVzdWx0U3Rha2VkSW50ZWdyYWwiJWtleVZvdGluZ1Jlc3VsdFN0YWtlZExhc3RVcGRhdGVIZWlnaHQiIWtleVZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsTGFzdCIVa2V5Vm90ZVN0YWtlZEludGVncmFsIh1rZXlWb3RlU3Rha2VkTGFzdFVwZGF0ZUhlaWdodCIZa2V5Vm90ZVN0YWtlZEludGVncmFsTGFzdCIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIPZmFjdG9yeUNvbnRyYWN0IhBlbWlzc2lvbkNvbnRyYWN0Ig9zdGFraW5nQ29udHJhY3QiEWd3eFJld2FyZENvbnRyYWN0IhZscFN0YWtpbmdQb29sc0NvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0Igpib29zdENvZWZmIgFAIhFnZXRUb3RhbENhY2hlZEd3eCIHY29ycmVjdCIOY3VycmVudEVwb2NoVWkiDmtleVRhcmdldEVwb2NoIhF0YXJnZXRFcG9jaE9wdGlvbiIRdG90YWxDYWNoZWRHd3hSYXciFWlzQ29ycmVjdGlvbkFjdGl2YXRlZCIKY29ycmVjdGl2ZSIMSGlzdG9yeUVudHJ5IgR0eXBlIgR1c2VyIglsb2NrU3RhcnQiAWsiAWIiCmhpc3RvcnlLRVkiC2hpc3RvcnlEQVRBIgpTdGF0c0VudHJ5Ig50b3RhbExvY2tlZEluYyILZHVyYXRpb25JbmMiDGxvY2tDb3VudEluYyINdXNlcnNDb3VudEluYyIbbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzS0VZIg1sb2Nrc0NvdW50S0VZIg11c2Vyc0NvdW50S0VZIg50b3RhbEFtb3VudEtFWSIYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzIgpsb2Nrc0NvdW50Igp1c2Vyc0NvdW50Igt0b3RhbEFtb3VudCINY2FsY0d3eEFtb3VudCIEa1JhdyIEYlJhdyIBaCIFU0NBTEUiD0xvY2tQYXJhbXNFbnRyeSINdXNlckFtb3VudEtFWSINc3RhcnRCbG9ja0tFWSILZHVyYXRpb25LRVkiBGtLRVkiBGJLRVkiDGtCeVBlcmlvZEtFWSIMYkJ5UGVyaW9kS0VZIiJleHRyYWN0T3B0aW9uYWxQYXltZW50QW1vdW50T3JGYWlsIg9leHBlY3RlZEFzc2V0SWQiA3BtdCIZY2FsY1VzZXJHd3hBbW91bnRBdEhlaWdodCIMdGFyZ2V0SGVpZ2h0IgVFTVBUWSISdXNlcjJOdW1NYXBwaW5nS0VZIg1nd3hBbW91bnRDYWxjIhRjYWxjQ3VycmVudEd3eEFtb3VudCIaZ2V0Vm90aW5nRW1pc3Npb25FcG9jaEluZm8iDSR0MDE3MDYyMTczNTIiEmxhc3RGaW5hbGl6ZWRFcG9jaCIXY3VycmVudEVwb2NoU3RhcnRIZWlnaHQiGGdldFBvb2xBc3NldHNCeUxwQXNzZXRJZCIQaWR4QW1vdW50QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIgdwb29sQ2ZnIhRnZXRVc2VyVm90ZUZpbmFsaXplZCINJHQwMTgwNDMxODEyMyINJHQwMTgxMjYxODIwMSILdXNlclZvdGVLZXkiCHVzZXJWb3RlIhFnZXRVc2VyVm90ZVN0YWtlZCIMc3Rha2VkQnlVc2VyIhVnZXRWb3RpbmdSZXN1bHRTdGFrZWQiDSR0MDE4NzQ1MTg4MjUiF3ZvdGluZ1Jlc3VsdFN0YWtlZFN0YXJ0IhJ2b3RpbmdSZXN1bHRTdGFrZWQiHWdldFZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsIg0kdDAxOTE4NzE5MjY3Ih52b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbFByZXYiInZvdGluZ1Jlc3VsdFN0YWtlZExhc3RVcGRhdGVIZWlnaHQiHHZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsRGgiGnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsIiFyZWZyZXNoVm90aW5nUmVzdWx0U3Rha2VkSW50ZWdyYWwiD3N0YWtlZFZvdGVEZWx0YSINJHQwMjAxMDQyMDE4NCIVdm90aW5nUmVzdWx0U3Rha2VkTmV3IhlnZXRVc2VyVm90ZVN0YWtlZEludGVncmFsIg0kdDAyMDc5NTIwODc1Ig51c2VyVm90ZVN0YWtlZCIadXNlclZvdGVTdGFrZWRJbnRlZ3JhbFByZXYiHnVzZXJWb3RlU3Rha2VkTGFzdFVwZGF0ZUhlaWdodCIYdXNlclZvdGVTdGFrZWRJbnRlZ3JhbERoIhZ1c2VyVm90ZVN0YWtlZEludGVncmFsIhlyZWZyZXNoVm90ZVN0YWtlZEludGVncmFsIgRlZGdlIg0kdDAyMTY2MzIxNzQzIhF1c2VyVm90ZUZpbmFsaXplZCIHYWN0aW9ucyITdm90aW5nUmVzdWx0QWN0aW9ucyILdm90ZUFjdGlvbnMiG2dldFN0YWtlZFZvdGVzSW50ZWdyYWxzRGlmZiINJHQwMjI1OTcyMjY3NyIddXNlclZvdGVTdGFrZWRJbnRlZ3JhbExhc3RLZXkiGnVzZXJWb3RlU3Rha2VkSW50ZWdyYWxMYXN0IiF2b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbExhc3RLZXkiHnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsTGFzdCIadXNlclZvdGVTdGFrZWRJbnRlZ3JhbERpZmYiHnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsRGlmZiIccmVmcmVzaEJvb3N0RW1pc3Npb25JbnRlZ3JhbCISd3hFbWlzc2lvblBlckJsb2NrIiBib29zdGluZ1YyTGFzdFVwZGF0ZUhlaWdodE9wdGlvbiIYYm9vc3RpbmdWMkluZ2VyZ2FsT3B0aW9uIgtlbWlzc2lvbkVuZCICZGgiEGxhc3RVcGRhdGVIZWlnaHQiFWJvb3N0RW1pc3Npb25QZXJCbG9jayIZYm9vc3RFbWlzc2lvbkludGVncmFsUHJldiIVYm9vc3RFbWlzc2lvbkludGVncmFsIhRpbnRlcm5hbENsYWltV3hCb29zdCIIcmVhZE9ubHkiEHVzZXJSZWNvcmRPcHRpb24iD3VzZXJSZWNvcmRBcnJheSIKdXNlck51bVN0ciIIRU1QVFlTVFIiCnBvb2xXZWlnaHQiDnBvb2xBZGRyZXNzU3RyIiJ1c2VyTHBCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZIiB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWSIddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwiGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwiDSR0MDI2Mjc4MjY0MTciG3N0YWtlZFZvdGVzSW50ZWdyYWxzQWN0aW9ucyIUdXNlclZvdGVJbnRlZ3JhbERpZmYiFnRvdGFsVm90ZXNJbnRlZ3JhbERpZmYiHXBvb2xVc2VyQm9vc3RFbWlzc2lvbkludGVncmFsIiF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXciCWRhdGFTdGF0ZSIFZGVidWciC2xvY2tBY3Rpb25zIghjZmdBcnJheSIKYXNzZXRJZFN0ciIJcG10QW1vdW50Ig5uZXh0VXNlck51bUtFWSIOdXNlcklzRXhpc3RpbmciB2NvZWZmWDgiDmdXeEFtb3VudFN0YXJ0IhNnV3hQYXJhbXNSZXN1bHRMaXN0IgNhcnIiEWZhY3RvcnlBZGRyZXNzU3RyIg5sb2NrQXNzZXRJZFN0ciILbWluRHVyYXRpb24iC21heER1cmF0aW9uIgtjaGVja0NhbGxlciIPcmVmZXJyZXJBZGRyZXNzIglzaWduYXR1cmUiDSR0MDMxMDA3MzEwNzIiEWxvY2tBY3Rpb25zUmVzdWx0Ig9yZWZlcnJhbEFkZHJlc3MiBnJlZkludiIRdXBkYXRlUmVmQWN0aXZpdHkiDSR0MDMxNTMwMzE1OTUiDWRlbHRhRHVyYXRpb24iCnVzZXJBbW91bnQiDGxvY2tEdXJhdGlvbiIHbG9ja0VuZCIRcmVtYWluaW5nRHVyYXRpb24iDXVzZXJBbW91bnROZXciD2xvY2tEdXJhdGlvbk5ldyIMbG9ja1N0YXJ0TmV3IgtjdXJyVXNlckd3eCIHZ3d4RGlmZiIXdG90YWxDYWNoZWRHd3hDb3JyZWN0ZWQiDSR0MDM0NjgyMzQ3ODQiEnVzZXJCb29zdEF2YWlsYWJsZSINJHQwMzQ5MTYzNTAxNyIQbWF4RGVsdGFEdXJhdGlvbiIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiFWNoZWNrTWFuYWdlclB1YmxpY0tleSICcG0iBWhhc1BNIgdjaGVja1BNIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXmLAQABYQICX18AAWIACAABYwCAwtcvAAFkBQFjAQFlAQFmCQC5CQIJAMwIAgIOYm9vc3RpbmcucmlkZToJAMwIAgUBZgUDbmlsAgEgAQFnAQFmCQACAQkBAWUBBQFmAQFoAgFpAWoJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQFpBQFqCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFqAg8gaXMgbm90IGRlZmluZWQBAWsCAWkBagkBC3ZhbHVlT3JFbHNlAgkAmggCBQFpBQFqAAABAWwDAWkBagFtCQELdmFsdWVPckVsc2UCCQCaCAIFAWkFAWoFAW0BAW4CAWkBagkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAWkFAWoJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAWoCDyBpcyBub3QgZGVmaW5lZAEBbwEBcAMJAGYCAAAFAXAJAQEtAQUBcAUBcAEBcQEBcAQBcgUBcAMJAAECBQFyAglMaXN0W0FueV0EAXMFAXIFAXMJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BAXQBAXAEAXIFAXADCQABAgUBcgIDSW50BAF1BQFyBQF1CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQF2AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIGY29uZmlnCQDMCAICGHJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwUDbmlsBQFhAAF3CQERQGV4dHJOYXRpdmUoMTA2MikBCQEBaAIFBHRoaXMJAQF2AAABeAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgILcHJvZ3JhbU5hbWUFA25pbAUBYQABeQIGd3hsb2NrAAF6CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAXgFAXkBAUEAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAFCAAEAAUMAAgABRAADAAFFAAQAAUYABQABRwAGAAFIAAcAAUkACAABSgAJAAFLAAoAAUwACwEBTQACESVzX19mYWN0b3J5Q29uZmlnAQFOAAIQJXNfX2xwVG9rZW5zTGlzdAEBTwEBUAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQFQCQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFhAQFRAQFSCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgpwb29sV2VpZ2h0CQDMCAIFAVIFA25pbAUBYQEBUwIBVAFVCQCsAgIJAKwCAgkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FAVQCAl9fCQCkAwEFAVUBAVYACQERQGV4dHJOYXRpdmUoMTA2MikBCQEBaAIFBHRoaXMJAQFBAAEBVwAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCCQEBVgAJAQFOAAIABQFhAQFYAQFZCQC1CQIJAQFoAgUBWQkBAU0ABQFhAQFaAQJhYQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhYQUBQwECYWIBAmFhCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFhBQFGAQJhYwECYWEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWEFAUIBAmFkAQJhYQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhYQUBSwECYWUAAhQlc19fbWFuYWdlclB1YmxpY0tleQECYWYAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAmFnAAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQJhaAACHiVzJXNfX3JhdGVQZXJCbG9ja01heF9fY3VycmVudAECYWkAAholcyVzX19lbWlzc2lvbl9fc3RhcnRCbG9jawECYWoAAhwlcyVzX19ib29zdGluZ1YyX19zdGFydEJsb2NrAQJhawACGiVzJXNfX2Jvb3N0aW5nVjJfX2ludGVncmFsAQJhbAACGCVzJXNfX2VtaXNzaW9uX19kdXJhdGlvbgECYW0AAhglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sBAmFuAAIOJXNfX25leHRQZXJpb2QBAmFvAAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAACYXAAAQACYXEAAgACYXIAAwACYXMABAACYXQABQECYXUAAgolc19fY29uZmlnAQJhdgAJALUJAgkBAWgCBQR0aGlzCQECYXUABQFhAAJhdwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCCQECYXYABQJhdAECYXgFAmF5AmF6AmFBAmFCAmF3CQC5CQIJAMwIAgIIJXMlZCVkJWQJAMwIAgUCYXkJAMwIAgUCYXoJAMwIAgUCYUEJAMwIAgUCYUIJAMwIAgUCYXcFA25pbAUBYQECYUMFAmF5AmF6AmFBAmFCAmF3CQECYXgFBQJheQkApAMBBQJhegkApAMBBQJhQQkApAMBBQJhQgUCYXcBAmFEAAQBcgkAoggBCQECYWUAAwkAAQIFAXICBlN0cmluZwQCYUUFAXIJANkEAQUCYUUDCQABAgUBcgIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJhRgAEAXIJAKIIAQkBAmFmAAMJAAECBQFyAgZTdHJpbmcEAmFFBQFyCQDZBAEFAmFFAwkAAQIFAXICBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYUcBAmFIBAJhSQkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAFyCQECYUQAAwkAAQIFAXICCkJ5dGVWZWN0b3IEAmFKBQFyAwkAAAIIBQJhSA9jYWxsZXJQdWJsaWNLZXkFAmFKBgUCYUkDCQABAgUBcgIEVW5pdAMJAAACCAUCYUgGY2FsbGVyBQR0aGlzBgUCYUkJAAIBAgtNYXRjaCBlcnJvcgACYUsAAQACYUwAAgACYU0AAwACYU4ABAACYU8ABQACYVAABgECYVEBAmFSCQC5CQIJAMwIAgIKJXMlc19fbG9jawkAzAgCBQJhUgUDbmlsBQFhAQJhUwECYVIJALUJAgkBAWgCBQR0aGlzCQECYVEBBQJhUgUBYQECYVQIAmFVAmFWAmFXAmFYAmFZAmFaAmJhAmJiCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCBQJhVQkAzAgCBQJhVgkAzAgCBQJhVwkAzAgCBQJhWAkAzAgCBQJhWQkAzAgCBQJhWgkAzAgCBQJiYQkAzAgCBQJiYgUDbmlsBQFhAQJiYwcCYVUCYVYCYVcCYVgCYVkCYVoCYmIJAQJhVAgFAmFVCQCkAwEFAmFWCQCkAwEFAmFXCQCkAwEFAmFYCQCkAwEFAmFZCQCkAwEFAmFaCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQCkAwEFAmJiAQJiZAACDyVzX19uZXh0VXNlck51bQECYmUBAmFSCQC5CQIJAMwIAgIZJXMlcyVzX19tYXBwaW5nX191c2VyMm51bQkAzAgCBQJhUgUDbmlsBQFhAQJiZgEBVQkAuQkCCQDMCAICGSVzJXMlc19fbWFwcGluZ19fbnVtMnVzZXIJAMwIAgUBVQUDbmlsBQFhAQJiZwECYVUJALkJAgkAzAgCAhYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQDMCAIFAmFVCQDMCAICBmFtb3VudAUDbmlsBQFhAQJiaAECYVUJALkJAgkAzAgCAhYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQDMCAIFAmFVCQDMCAICBXN0YXJ0BQNuaWwFAWEBAmJpAQJhVQkAuQkCCQDMCAICFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAMwIAgUCYVUJAMwIAgIIZHVyYXRpb24FA25pbAUBYQECYmoBAmFVCQC5CQIJAMwIAgIWJXMlZCVzX19wYXJhbUJ5VXNlck51bQkAzAgCBQJhVQkAzAgCAgFrBQNuaWwFAWEBAmJrAQJhVQkAuQkCCQDMCAICFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAMwIAgUCYVUJAMwIAgIBYgUDbmlsBQFhAQJibAICYVUCYm0JALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCBQJhVQkAzAgCAgFrCQDMCAIFAmJtBQNuaWwFAWEBAmJuAgJhVQJibQkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIFAmFVCQDMCAICAWIJAMwIAgUCYm0FA25pbAUBYQECYm8AAh4lcyVzX19zdGF0c19fYWN0aXZlVG90YWxMb2NrZWQBAmJwAAIlJXMlc19fc3RhdHNfX2xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwECYnEAAhclcyVzX19zdGF0c19fbG9ja3NDb3VudAECYnIAAh0lcyVzX19zdGF0c19fYWN0aXZlVXNlcnNDb3VudAECYnMBAmFVCQC5CQIJAMwIAgIgJXMlZF9fdXNlckJvb3N0RW1pc3Npb25MYXN0SW50VjIJAMwIAgUCYVUFA25pbAUBYQECYnQCAmFVAmJ1CQC5CQIJAMwIAgIgJXMlZF9fdXNlckJvb3N0RW1pc3Npb25MYXN0SW50VjIJAMwIAgUCYVUJAMwIAgUCYnUFA25pbAUBYQECYnYBAmFVCQC5CQIJAMwIAgIRJXMlZF9fbWF4Qm9vc3RJbnQJAMwIAgUCYVUFA25pbAUBYQECYncAAhglcyVzX19tYXhCb29zdEludF9fdG90YWwBAmJ4AQJhVQkAuQkCCQDMCAICJCVzJWRfX3VzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkAzAgCBQJhVQUDbmlsBQFhAQJieQECYVUJALkJAgkAzAgCAhYlcyVkX191c2VyQm9vc3RDbGFpbWVkCQDMCAIFAmFVBQNuaWwFAWEBAmJ6AAIWJXMlc19fZ3d4Q2FjaGVkX190b3RhbAECYkEAAhwlc19fZ3d4Q2FjaGVkVG90YWxDb3JyZWN0aXZlAQJiQgQCYkMCYkQBaQJiRQkAuQkCCQDMCAICCiVzJXMlcyVzJWQJAMwIAgIEdm90ZQkAzAgCBQJiQwkAzAgCBQJiRAkAzAgCCQClCAEFAWkJAMwIAgkApAMBBQJiRQUDbmlsBQFhAQJiRgECYkUJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUCYkUFA25pbAUBYQECYkcACQC5CQIJAMwIAgICJXMJAMwIAgIOY3VycmVudEVwb2NoVWkFA25pbAUBYQECYkgCAmJJAmJFCQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICEnZvdGluZ1Jlc3VsdFN0YWtlZAkAzAgCBQJiSQkAzAgCCQCkAwEFAmJFBQNuaWwFAWEBAmJKAgJiSQJiRQkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhp2b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbAkAzAgCBQJiSQkAzAgCCQCkAwEFAmJFBQNuaWwFAWEBAmJLAgJiSQJiRQkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAip2b3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbExhc3RVcGRhdGVIZWlnaHQJAMwIAgUCYkkJAMwIAgkApAMBBQJiRQUDbmlsBQFhAQJiTAMCYkkBaQJiRQkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICHnZvdGluZ1Jlc3VsdFN0YWtlZEludGVncmFsTGFzdAkAzAgCBQJiSQkAzAgCCQClCAEFAWkJAMwIAgkApAMBBQJiRQUDbmlsBQFhAQJiTQMCYkkBaQJiRQkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICEnZvdGVTdGFrZWRJbnRlZ3JhbAkAzAgCBQJiSQkAzAgCCQClCAEFAWkJAMwIAgkApAMBBQJiRQUDbmlsBQFhAQJiTgMCYkkBaQJiRQkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICInZvdGVTdGFrZWRJbnRlZ3JhbExhc3RVcGRhdGVIZWlnaHQJAMwIAgUCYkkJAMwIAgkApQgBBQFpCQDMCAIJAKQDAQUCYkUFA25pbAUBYQECYk8DAmJJAWkCYkUJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAhZ2b3RlU3Rha2VkSW50ZWdyYWxMYXN0CQDMCAIFAmJJCQDMCAIJAKUIAQUBaQkAzAgCCQCkAwEFAmJFBQNuaWwFAWEBAmJQAgJiUQJiSQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZzdGFrZWQJAMwIAgUCYlEJAMwIAgUCYkkFA25pbAUBYQACYlIJAQFWAAACYWEJAQFYAQUCYlIAAmJTCQECYWIBBQJhYQACYlQJAQJhYwEFAmFhAAJiVQkBAmFkAQUCYWEAAmJWCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJALkJAgkAzAgCAgIlcwkAzAgCAhZscFN0YWtpbmdQb29sc0NvbnRyYWN0BQNuaWwFAWEJAQFlAQIubHBfc3Rha2luZ19wb29scyBjb250cmFjdCBhZGRyZXNzIGlzIHVuZGVmaW5lZAkBAWUBAilpbnZhbGlkIGxwX3N0YWtpbmdfcG9vbHMgY29udHJhY3QgYWRkcmVzcwACYlcJALkJAgkAzAgCAgIlcwkAzAgCAhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWEAAmJYCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQJiUgUCYlcAAmJZCgACYloJAPwHBAUCYlMCFWdldEJvb3N0Q29lZmZSRUFET05MWQUDbmlsBQNuaWwDCQABAgUCYloCA0ludAUCYloJAAIBCQCsAgIJAAMBBQJiWgIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQJjYQECY2IEAmNjCQERQGV4dHJOYXRpdmUoMTA1MCkCBQJiWAkBAmJHAAQCY2QJALkJAgkAzAgCAgQlcyVzCQDMCAICKXRvdGFsQ2FjaGVkR3d4Q29ycmVjdGlvbl9fYWN0aXZhdGlvbkVwb2NoBQNuaWwFAWEEAmNlCQCaCAIFBHRoaXMFAmNkBAJjZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYnoAAAAEAmNnAwkBCWlzRGVmaW5lZAEFAmNlCQBnAgUCY2MJAQV2YWx1ZQEFAmNlBwQCY2gDAwUCY2cFAmNiBwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYkEAAAAAAAkAlgMBCQDMCAIAAAkAzAgCCQBkAgUCY2YFAmNoBQNuaWwBAmNpCAJjagJjawJhVgJjbAJhWAJjbQJjbgJhSAQCY28JALkJAgkAzAgCAhElcyVzJXMlc19faGlzdG9yeQkAzAgCBQJjagkAzAgCBQJjawkAzAgCCQDYBAEIBQJhSA10cmFuc2FjdGlvbklkBQNuaWwFAWEEAmNwCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJjbAkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCY20JAMwIAgkApAMBBQJjbgUDbmlsBQFhCQELU3RyaW5nRW50cnkCBQJjbwUCY3ABAmNxBAJjcgJjcwJjdAJjdQQCY3YJAQJicAAEAmN3CQECYnEABAJjeAkBAmJyAAQCY3kJAQJibwAEAmN6CQEBawIFBHRoaXMFAmN2BAJjQQkBAWsCBQR0aGlzBQJjdwQCY0IJAQFrAgUEdGhpcwUCY3gEAmNDCQEBawIFBHRoaXMFAmN5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjdgkAZAIFAmN6BQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCY3cJAGQCBQJjQQUCY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFAmN4CQBkAgUCY0IFAmN1CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjeQkAZAIFAmNDBQJjcgUDbmlsAQJjRAMCY0UCY0YCY0cEAmNIAOgHCQBpAgkAZAIJAGgCBQJjRQUCY0cFAmNGBQJjSAECY0kIAmFSAmFVAmFWAmFXAmFYAmNtAmNuAmJtBAJjSgkBAmJnAQUCYVUEAmNLCQECYmgBBQJhVQQCY0wJAQJiaQEFAmFVBAJjTQkBAmJqAQUCYVUEAmNOCQECYmsBBQJhVQQCY08JAQJibAIFAmFVBQJibQQCY1AJAQJibgIFAmFVBQJibQQCYmIJAQJjRAMFAmNtBQJjbgUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjSgUCYVYJAMwIAgkBDEludGVnZXJFbnRyeQIFAmNLBQJhVwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCY0wFAmFYCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjTQUCY20JAMwIAgkBDEludGVnZXJFbnRyeQIFAmNOBQJjbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCY08FAmNtCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjUAUCY24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFRAQUCYVIJAQJiYwcFAmFVBQJhVgUCYVcFAmFYBQJjbQUCY24FAmJiBQNuaWwBAmNRAgJhSAJjUgMJAGYCCQCQAwEIBQJhSAhwYXltZW50cwABCQACAQIbb25seSBvbmUgcGF5bWVudCBpcyBhbGxvd2VkAwkAAAIJAJADAQgFAmFICHBheW1lbnRzAAAAAAQCY1MJAJEDAggFAmFICHBheW1lbnRzAAADCQECIT0CCQEFdmFsdWUBCAUCY1MHYXNzZXRJZAUCY1IJAAIBAhtpbnZhbGlkIGFzc2V0IGlkIGluIHBheW1lbnQIBQJjUwZhbW91bnQBAmNUAgJhUgJjVQQCY1YCBWVtcHR5BAJjVwkBAmJlAQUCYVIEAmFVCQELdmFsdWVPckVsc2UCCQCiCAEFAmNXBQJjVgQCY20JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmJqAQUCYVUAAAQCY24JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmJrAQUCYVUAAAQCY1gJAQJjRAMFAmNtBQJjbgUCY1UEAmJiAwkAZgIAAAUCY1gAAAUCY1gFAmJiAQJjWQECYVIJAQJjVAIFAmFSBQZoZWlnaHQBAmNaAAQCZGEEAmNjCQEFdmFsdWUBCQCaCAIFAmJYCQECYkcABAJkYgkAZQIFAmNjAAEDCQBmAgAABQJkYgkBAWcBAg1pbnZhbGlkIGVwb2NoCQCUCgIFAmNjBQJkYgQCY2MIBQJkYQJfMQQCZGIIBQJkYQJfMgQCZGMJAQV2YWx1ZQEJAJoIAgUCYlgJAQJiRgEFAmNjCQCUCgIFAmRiBQJkYwECZGQBAmJJBAJkZQAEBAJkZgAFBAJkZwoAAmJaCQD8BwQFAmJSAiBnZXRQb29sQ29uZmlnQnlMcEFzc2V0SWRSRUFET05MWQkAzAgCBQJiSQUDbmlsBQNuaWwDCQABAgUCYloCCUxpc3RbQW55XQUCYloJAAIBCQCsAgIJAAMBBQJiWgIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldBAJiQwoAAmJaCQCRAwIFAmRnBQJkZQMJAAECBQJiWgIGU3RyaW5nBQJiWgkAAgEJAKwCAgkAAwEFAmJaAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcEAmJECgACYloJAJEDAgUCZGcFAmRmAwkAAQIFAmJaAgZTdHJpbmcFAmJaCQACAQkArAICCQADAQUCYloCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkAlAoCBQJiQwUCYkQBAmRoAgJiSQJiUQQCYVIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmJRBAJkaQkBAmNaAAQCZGIIBQJkaQJfMQQCZGMIBQJkaQJfMgQCZGoJAQJkZAEFAmJJBAJiQwgFAmRqAl8xBAJiRAgFAmRqAl8yBAJkawkBAmJCBAUCYkMFAmJEBQJhUgUCZGIEAmRsCQELdmFsdWVPckVsc2UCCQCaCAIFAmJYBQJkawAABQJkbAECZG0CAmJJAmJRBAJkbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQJiVAkBAmJQAgUCYlEFAmJJAAAEAmRsCQECZGgCBQJiSQUCYlEDCQAAAgUCZG4AAAAABQJkbAECZG8BAmJJBAJkcAkBAmNaAAQCZGIIBQJkcAJfMQQCZGMIBQJkcAJfMgQCZHEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYlgJAQJiSAIFAmJJBQJkYgAABAJkcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYkgCBQJiSQUCZGIFAmRxBQJkcgECZHMBAmJJBAJkdAkBAmNaAAQCZGIIBQJkdAJfMQQCZGMIBQJkdAJfMgQCZHIJAQJkbwEFAmJJBAJkdQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYkoCBQJiSQUCZGIAAAQCZHYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmJLAgUCYkkFAmRiBQJkYwQCZHcJAGUCBQZoZWlnaHQFAmR2BAJkeAkAZAIJAGgCBQJkdwUCZHIFAmR1BQJkeAECZHkCAmJJAmR6BAJkQQkBAmNaAAQCZGIIBQJkQQJfMQQCZGMIBQJkQQJfMgQCZHIJAQJkbwEFAmJJBAJkQgkAZAIFAmRyBQJkegQCZHgJAQJkcwEFAmJJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYkgCBQJiSQUCZGIFAmRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYksCBQJiSQUCZGIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmJKAgUCYkkFAmRiBQJkeAUDbmlsAQJkQwICYkkCYlEEAmRECQECY1oABAJkYggFAmREAl8xBAJkYwgFAmREAl8yBAJhUgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYlEEAmRFCQECZG0CBQJiSQUCYlEEAmRGCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJiTQMFAmJJBQJhUgUCZGIAAAQCZEcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmJOAwUCYkkFAmFSBQJkYgUCZGMEAmRICQBlAgUGaGVpZ2h0BQJkRwQCZEkJAGQCCQBoAgUCZEgFAmRFBQJkRgUCZEkBAmRKAwJiSQJiUQJkSwQCZEwJAQJjWgAEAmRiCAUCZEwCXzEEAmRjCAUCZEwCXzIEAmFSCQERQGV4dHJOYXRpdmUoMTA2MikBBQJiUQQCZE0JAQJkaAIFAmJJBQJiUQQCZE4DCQAAAgUCZE0AAAUDbmlsBAJkegMFAmRLBQJkTQkBAS0BBQJkTQQCZE8JAQJkeQIFAmJJBQJkegQCZEkJAQJkQwIFAmJJBQJiUQQCZFAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJiTgMFAmJJBQJhUgUCZGIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmJNAwUCYkkFAmFSBQJkYgUCZEkFA25pbAkAzggCBQJkTwUCZFAFAmROAQJkUQICYkkCYlEEAmRSCQECY1oABAJkYggFAmRSAl8xBAJkYwgFAmRSAl8yBAJhUgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYlEEAmRTCQECYk8DBQJiSQUCYVIFAmRiBAJkVAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJkUwAABAJkVQkBAmJMAwUCYkkFAmFSBQJkYgQCZFYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCZFUAAAQCZEkJAQJkQwIFAmJJBQJiUQQCZHgJAQJkcwEFAmJJBAJkVwkAZQIFAmRJBQJkVAQCZFgJAGUCBQJkeAUCZFYJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZFMFAmRJCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkVQUCZHgFA25pbAUCZFcFAmRYAQJkWQAEAmRaCQEBbgIFAmJTCQECYWcABAJlYQkAmggCBQR0aGlzCQECYWoABAJlYgkAmggCBQR0aGlzCQECYWsABAJlYwkBAW4CBQJiUwkBAmFtAAQCY0cDCQBmAgUGaGVpZ2h0BQJlYwUCZWMFBmhlaWdodAQCZWQEAXIFAmVhAwkAAQIFAXICA0ludAQCZWUFAXIJAJYDAQkAzAgCCQBlAgUCY0cFAmVlCQDMCAIAAAUDbmlsAwkAAQIFAXICBFVuaXQAAAkAAgECC01hdGNoIGVycm9yBAJlZgkAaQIJAGgCBQJkWgkAZQIFAmJZAAEFAmJZBAJlZwkBC3ZhbHVlT3JFbHNlAgUCZWIAAAQCZWgJAGQCCQBoAgUCZWYFAmVkBQJlZwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWsABQJlaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFqAAUGaGVpZ2h0BQNuaWwFAmVoAQJlaQMCYkkCYlECZWoEAmVrCQCdCAIFBHRoaXMJAQJhUQEFAmJRAwkAAAIFAmVrBQR1bml0CQCVCgMAAAUDbmlsAhV1c2VyUmVjb3JkOjppczo6ZW1wdHkEAmVsCQC1CQIJAQV2YWx1ZQEFAmVrBQFhBAJlbQkAkQMCBQJlbAUCYUsEAmVuAgVlbXB0eQQCZW8DCQECIT0CBQJiSQUCZW4EAmVwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYlIJAQFPAQUCYkkJAKwCAgIVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJiSQkBEUBleHRyTmF0aXZlKDEwNTApAgUCYlIJAQFRAQUCZXADBQJlagAACQACAQkArAICAihub3QgcmVhZG9ubHkgbW9kZTogdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJiSQQCZXEJAQJidAIFAmVtBQJiSQQCZXIJAQJicwEFAmVtBAJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJlcQkBAWsCBQR0aGlzBQJlcgQCZWgICQECZFkAAl8yBAJldAkAZQIFAmVoBQJlcwMJAGYCAAAFAmV0CQACAQISd3JvbmcgY2FsY3VsYXRpb25zBAJldQkBAmRRAgUCYkkFAmJRBAJldggFAmV1Al8xBAJldwgFAmV1Al8yBAJleAgFAmV1Al8zBAJleQkAawMFAmV0BQJlbwUBZAQCZXoDCQAAAgUCZXgAAAAACQBrAwUCZXkFAmV3BQJleAQCZUEJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZXEFAmVoBQNuaWwFAmV2BAJlQgkAuQkCCQDMCAIJAKQDAQUCZXMJAMwIAgkApAMBBQJldAkAzAgCCQCkAwEFAmVvCQDMCAIJAKQDAQUCZXcJAMwIAgkApAMBBQJleAUDbmlsAgE6CQCVCgMFAmV6BQJlQQUCZUIBAmVDAgJhSAJhWAQCZUQJAQJhdgAEAmVFCQCRAwIFAmVEBQJhcAQCYXkJANkEAQUCZUUEAmF6CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUQFAmFxBAJhQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVEBQJhcgQCYUIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlRAUCYXMDCQECIT0CCQCQAwEIBQJhSAhwYXltZW50cwABCQACAQI0aW52YWxpZCBwYXltZW50IC0gZXhhY3Qgb25lIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQCY1MJAJEDAggFAmFICHBheW1lbnRzAAAEAmVGCAUCY1MGYW1vdW50AwkBAiE9AgUCYXkJAQV2YWx1ZQEIBQJjUwdhc3NldElkCQACAQkArAICCQCsAgICHmludmFsaWQgYXNzZXQgaXMgaW4gcGF5bWVudCAtIAUCZUUCDCBpcyBleHBlY3RlZAQCZUcJAQJiZAAEAmJRCQClCAEIBQJhSAZjYWxsZXIEAmVICQEJaXNEZWZpbmVkAQkAoggBCQECYmUBBQJiUQQCZW0DBQJlSAkBBXZhbHVlAQkAoggBCQECYmUBBQJiUQkApAMBCQEBbgIFBHRoaXMFAmVHBAJhVQkBDXBhcnNlSW50VmFsdWUBBQJlbQQCY2wFBmhlaWdodAQCY0sJAQJiaAEFAmVtBAJjTAkBAmJpAQUCZW0EAmNKCQECYmcBBQJlbQMDCQBmAgUCYXoFAmVGCQECIT0CCAUCYUgGY2FsbGVyBQJiVgcJAAIBCQCsAgICImFtb3VudCBpcyBsZXNzIHRoZW4gbWluTG9ja0Ftb3VudD0JAKQDAQUCYXoDCQBmAgUCYUEFAmFYCQACAQkArAICAi1wYXNzZWQgZHVyYXRpb24gaXMgbGVzcyB0aGVuIG1pbkxvY2tEdXJhdGlvbj0JAKQDAQUCYUEDCQBmAgUCYVgFAmFCCQACAQkArAICAjBwYXNzZWQgZHVyYXRpb24gaXMgZ3JlYXRlciB0aGVuIG1heExvY2tEdXJhdGlvbj0JAKQDAQUCYUIDAwUCZUgJAGcCCQBkAgkBAW4CBQR0aGlzBQJjSwkBAW4CBQR0aGlzBQJjTAUCY2wHCQACAQI2dGhlcmUgaXMgYW4gYWN0aXZlIGxvY2sgLSBjb25zaWRlciB0byB1c2UgaW5jcmVhc2VMb2NrAwkAZgIJAQFrAgUEdGhpcwUCY0oAAAkAAgEJAKwCAgI0dGhlcmUgYXJlIGxvY2tlZCBXWHMgLSBjb25zaWRlciB0byB1c2UgaW5jcmVhc2VMb2NrIAUCY0oEAmVJCQBrAwUCYVgFAWMFAmFCBAJlSgkAawMFAmVGBQJlSQUBYwQCZUsJAQFxAQkA/AcEBQJhdwIVY2FsY0d3eFBhcmFtc1JFQURPTkxZCQDMCAIFAmVKCQDMCAIFAmNsCQDMCAIFAmFYBQNuaWwFA25pbAQCY20JAQF0AQkAkQMCBQJlSwAABAJjbgkBAXQBCQCRAwIFAmVLAAEEAmJtCQCkAwEJAQF0AQkAkQMCBQJlSwACBAJjZgkBAmNhAQcEAmVyCQECYnMBBQJlbQQCZWgICQECZFkAAl8yBAJlTAMFAmVIBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFAmVHCQBkAgUCYVUAAQkAzAgCCQELU3RyaW5nRW50cnkCCQECYmUBBQJiUQUCZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJmAQUCZW0FAmJRBQNuaWwJAJQKAgkAzggCCQDNCAIJAM4IAgkAzggCBQJlTAkBAmNJCAUCYlEFAmVtBQJlRgUCY2wFAmFYBQJjbQUCY24FAmJtCQECY3EEBQJlRgUCYVgAAQMFAmVIAAAAAQkBAmNpCAIEbG9jawUCYlEFAmVGBQJjbAUCYVgFAmNtBQJjbgUCYUgJAMwIAgkBDEludGVnZXJFbnRyeQIFAmVyBQJlaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmJ6AAkAZAIFAmNmBQJlSgUDbmlsBQJlShMCYUgBC2NvbnN0cnVjdG9yBgJlTQJlTgJhegJlTwJlUAJhdwQCZVEJAQJhRwEFAmFIAwkAAAIFAmVRBQJlUQkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmQAAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AAkBAmFDBQUCZU4FAmF6BQJlTwUCZVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFBAAUCZU0FA25pbAkBAmNxBAAAAAAAAAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFIAQdsb2NrUmVmAwJhWAJlUgJlUwQCZVQJAQJlQwIFAmFIBQJhWAQCZVUIBQJlVAJfMQQCZUoIBQJlVAJfMgQCZVYJAKUIAQgFAmFIBmNhbGxlcgQCZVcDAwkAAAIFAmVSAgAGCQAAAgUCZVMBAAUEdW5pdAkA/AcEBQF3AgpjcmVhdGVQYWlyCQDMCAIFAXoJAMwIAgUCZVIJAMwIAgUCZVYJAMwIAgUCZVMFA25pbAUDbmlsAwkAAAIFAmVXBQJlVwQCZVgJAPwHBAUCYXcCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgkApQgBCAUCYUgGY2FsbGVyCQDMCAIFAmVKBQNuaWwFA25pbAMJAAACBQJlWAUCZVgJAJQKAgUCZVUFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUgBBGxvY2sBAmFYBAJlWQkBAmVDAgUCYUgFAmFYBAJlVQgFAmVZAl8xBAJlSggFAmVZAl8yBAJlWAkA/AcEBQJhdwIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCCQClCAEIBQJhSAZjYWxsZXIJAMwIAgUCZUoFA25pbAUDbmlsAwkAAAIFAmVYBQJlWAkAlAoCBQJlVQUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSAEMaW5jcmVhc2VMb2NrAQJlWgQCZUQJAQJhdgAEAmVFCQCRAwIFAmVEBQJhcAQCYXkJANkEAQUCZUUEAmFBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUQFAmFyBAJhQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVEBQJhcwQCZUYJAQJjUQIFAmFIBQJheQQCYlEJAKUIAQgFAmFIBmNhbGxlcgQCZWwJAQJhUwEFAmJRBAJlbQkAkQMCBQJlbAUCYUsEAmZhCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZWwFAmFMBAJjbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVsBQJhTQQCZmIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlbAUCYU4EAmZjCQBkAgUCY2wFAmZiBAJmZAkAlgMBCQDMCAIJAGUCBQJmYwUGaGVpZ2h0CQDMCAIAAAUDbmlsBAJmZQkAZAIFAmZhBQJlRgQCZmYJAGQCBQJmZAUCZVoDCQBmAgAABQJlWgkAAgECGmR1cmF0aW9uIGlzIGxlc3MgdGhlbiB6ZXJvAwkAZgIFAmFBBQJmZgkAAgEJAKwCAgItbG9ja0R1cmF0aW9uTmV3IGlzIGxlc3MgdGhlbiBtaW5Mb2NrRHVyYXRpb249CQCkAwEFAmFBAwkAZgIFAmZmBQJhQgkAAgEJAKwCAgJEZGVsdGFEdXJhdGlvbiArIGV4aXN0ZWRMb2NrRHVyYXRpb24gaXMgZ3JlYXRlciB0aGVuIG1heExvY2tEdXJhdGlvbj0JAKQDAQUCYUIEAmVJCQBrAwUCZmYFAWMFAmFCBAJlSgkAawMFAmZlBQJlSQUBYwQCZVgJAPwHBAUCYXcCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgkApQgBCAUCYUgGY2FsbGVyCQDMCAIFAmVKBQNuaWwFA25pbAMJAAACBQJlWAUCZVgEAmZnBQZoZWlnaHQEAmVLCQEBcQEJAPwHBAUCYXcCFWNhbGNHd3hQYXJhbXNSRUFET05MWQkAzAgCBQJlSgkAzAgCBQJmZwkAzAgCBQJmZgUDbmlsBQNuaWwEAmNtCQEBdAEJAJEDAgUCZUsAAAQCY24JAQF0AQkAkQMCBQJlSwABBAJibQkApAMBCQEBdAEJAJEDAgUCZUsAAgQCZmgJAQJjWQEFAmJRBAJmaQkAZQIFAmVKBQJmaAMJAGYCAAAFAmZpCQACAQkArAICAhhnd3hEaWZmIGlzIGxlc3MgdGhlbiAwOiAJAKQDAQUCZmkEAmNmCQECY2EBBwQCZmoJAQJjYQEGCQDOCAIJAM0IAgkAzggCCQECY0kIBQJiUQUCZW0FAmZlBQJmZwUCZmYFAmNtBQJjbgUCYm0JAQJjcQQFAmVGBQJlWgAAAAAJAQJjaQgCBGxvY2sFAmJRBQJlRgUCY2wFAmZmBQJjbQUCY24FAmFICQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYnoACQBkAgUCY2YFAmZpBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUgBDGNsYWltV3hCb29zdAICYkkCYlEDCQECIT0CBQJiVAgFAmFIBmNhbGxlcgkAAgECEnBlcm1pc3Npb25zIGRlbmllZAQCZmsJAQJlaQMFAmJJBQJiUQcEAmZsCAUCZmsCXzEEAmVBCAUCZmsCXzIEAmVCCAUCZmsCXzMJAJQKAgUCZUEJAMwIAgUCZmwFA25pbAJhSAEUY2xhaW1XeEJvb3N0UkVBRE9OTFkCAmJJAmJRBAJmbQkBAmVpAwUCYkkFAmJRBgQCZmwIBQJmbQJfMQQCZUEIBQJmbQJfMgQCZUIIBQJmbQJfMwkAlAoCBQNuaWwJAMwIAgUCZmwJAMwIAgUCZUIFA25pbAJhSAEGdW5sb2NrAQJhUgQCZWwJAQJhUwEFAmFSBAJlbQkAkQMCBQJlbAUCYUsEAmZhCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZWwFAmFMBAJjbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVsBQJhTQQCZmIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlbAUCYU4EAmZjCQBkAgUCY2wFAmZiBAJlRAkBAmF2AAQCYXkJANkEAQkAkQMCBQJlRAUCYXADCQBnAgUCZmMFBmhlaWdodAkAAgEJAKwCAgkArAICAgV3YWl0IAkApAMBBQJmYwIKIHRvIHVubG9jawMJAGcCAAAFAmZhCQACAQIRbm90aGluZyB0byB1bmxvY2sEAmJtCQELdmFsdWVPckVsc2UCCQCaCAIFAmF3CQECYW4AAAAJAM0IAgkAzQgCCQDOCAIJAQJjSQgFAmFSBQJlbQAABQJjbAUCZmIAAAAACQCkAwEFAmJtCQECY3EECQEBLQEFAmZhAAAAAAD///////////8BCQECY2kIAgZ1bmxvY2sFAmFSBQJmYQUCY2wFAmZiAAAAAAUCYUgJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFSBQJmYQUCYXkCYUgBE2d3eFVzZXJJbmZvUkVBRE9OTFkBAmFSBAJiYgkBAmNZAQUCYVIJAJQKAgUDbmlsCQDMCAIFAmJiBQNuaWwCYUgBF3VzZXJNYXhEdXJhdGlvblJFQURPTkxZAQJiUQQCZUQJAQJhdgAEAmFCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUQFAmFzBAJlawkAnQgCBQR0aGlzCQECYVEBBQJiUQMJAAACBQJlawUEdW5pdAkAlAoCBQNuaWwJAJQKAgIEbG9jawUCYUIEAmVsCQC1CQIJAQV2YWx1ZQEFAmVrBQFhBAJjbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVsBQJhTQQCZmIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlbAUCYU4EAmZjCQBkAgUCY2wFAmZiBAJmZAkAlgMBCQDMCAIJAGUCBQJmYwUGaGVpZ2h0CQDMCAIAAAUDbmlsBAJmbgkAZQIFAmFCBQJmZAkAlAoCBQNuaWwJAJQKAgIMaW5jcmVhc2VMb2NrBQJmbgJhSAEgZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0UkVBRE9OTFkCAmFSAmNVBAJiYgkBAmNUAgUCYVIFAmNVCQCUCgIFA25pbAUCYmICYUgBGWdldFRvdGFsQ2FjaGVkR3d4UkVBRE9OTFkACQCUCgIFA25pbAkBAmNhAQYCYUgBFW9uQm9vc3RFbWlzc2lvblVwZGF0ZQAEAmVRAwkAAAIIBQJhSAZjYWxsZXIFAmJTBgkBAmFHAQUCYUgDCQAAAgUCZVEFAmVRCQECZFkACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFIARJvblN0YWtlZFZvdGVVcGRhdGUDAmJJAmJRAmRLBAJlUQMJAAACCAUCYUgGY2FsbGVyBQJiVAYJAQJhRwEFAmFIAwkAAAIFAmVRBQJlUQQCZE4JAQJkSgMFAmJJBQJiUQUCZEsJAJQKAgUCZE4FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUgBHWdldFZvdGluZ1Jlc3VsdFN0YWtlZFJFQURPTkxZAQJiSQkAlAoCBQNuaWwJAQJkbwEFAmJJAmFIASVnZXRWb3RpbmdSZXN1bHRTdGFrZWRJbnRlZ3JhbFJFQURPTkxZAQJiSQkAlAoCBQNuaWwJAQJkcwEFAmJJAmFIARxnZXRVc2VyVm90ZUZpbmFsaXplZFJFQURPTkxZAgJiSQJiUQkAlAoCBQNuaWwJAQJkaAIFAmJJBQJiUQJhSAEhZ2V0VXNlclZvdGVTdGFrZWRJbnRlZ3JhbFJFQURPTkxZAgJiSQJiUQkAlAoCBQNuaWwJAQJkQwIFAmJJBQJiUQJhSAEKc2V0TWFuYWdlcgECZm8EAmVRCQECYUcBBQJhSAMJAAACBQJlUQUCZVEEAmZwCQDZBAEFAmZvAwkAAAIFAmZwBQJmcAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWYABQJmbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFIAQ5jb25maXJtTWFuYWdlcgAEAmZxCQECYUYABAJmcgMJAQlpc0RlZmluZWQBBQJmcQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZnIFAmZyBAJmcwMJAAACCAUCYUgPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJmcQYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZnMFAmZzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQAJANgEAQkBBXZhbHVlAQUCZnEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFmAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmdAECZnUABAJmdgQBcgkBAmFEAAMJAAECBQFyAgpCeXRlVmVjdG9yBAJhSgUBcgUCYUoDCQABAgUBcgIEVW5pdAgFAmZ0D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJmdAlib2R5Qnl0ZXMJAJEDAggFAmZ0BnByb29mcwAABQJmdsKUUk4=", "height": 2508515, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: RstxjT3A62mftuWWm7EP7AU1SbwQNdj9X6DRhbcaBkr Next: 4THcn7Ks9pm4T91eUrorvHvzBTNusSHv7wFnk862wsxX Diff:
OldNewDifferences
8585 let IdxFactoryCfgBirdsDapp = 11
8686
8787 func keyFactoryCfg () = "%s__factoryConfig"
88-
89-
90-func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9188
9289
9390 func keyFactoryLpList () = "%s__lpTokensList"
449446
450447
451448 func getVotingEmissionEpochInfo () = {
452- let $t01719017480 = {
449+ let $t01706217352 = {
453450 let currentEpochUi = value(getInteger(votingEmissionContract, keyCurrentEpochUi()))
454451 let lastFinalizedEpoch = (currentEpochUi - 1)
455452 if ((0 > lastFinalizedEpoch))
456453 then throwErr("invalid epoch")
457454 else $Tuple2(currentEpochUi, lastFinalizedEpoch)
458455 }
459- let currentEpochUi = $t01719017480._1
460- let lastFinalizedEpoch = $t01719017480._2
456+ let currentEpochUi = $t01706217352._1
457+ let lastFinalizedEpoch = $t01706217352._2
461458 let currentEpochStartHeight = value(getInteger(votingEmissionContract, keyStartHeightByEpoch(currentEpochUi)))
462459 $Tuple2(lastFinalizedEpoch, currentEpochStartHeight)
463460 }
490487
491488 func getUserVoteFinalized (lpAssetIdStr,userAddressStr) = {
492489 let userAddress = addressFromStringValue(userAddressStr)
493- let $t01817118251 = getVotingEmissionEpochInfo()
494- let lastFinalizedEpoch = $t01817118251._1
495- let currentEpochStartHeight = $t01817118251._2
496- let $t01825418329 = getPoolAssetsByLpAssetId(lpAssetIdStr)
497- let amountAssetId = $t01825418329._1
498- let priceAssetId = $t01825418329._2
490+ let $t01804318123 = getVotingEmissionEpochInfo()
491+ let lastFinalizedEpoch = $t01804318123._1
492+ let currentEpochStartHeight = $t01804318123._2
493+ let $t01812618201 = getPoolAssetsByLpAssetId(lpAssetIdStr)
494+ let amountAssetId = $t01812618201._1
495+ let priceAssetId = $t01812618201._2
499496 let userVoteKey = keyVote(amountAssetId, priceAssetId, userAddress, lastFinalizedEpoch)
500497 let userVote = valueOrElse(getInteger(votingEmissionContract, userVoteKey), 0)
501498 userVote
512509
513510
514511 func getVotingResultStaked (lpAssetIdStr) = {
515- let $t01887318953 = getVotingEmissionEpochInfo()
516- let lastFinalizedEpoch = $t01887318953._1
517- let currentEpochStartHeight = $t01887318953._2
512+ let $t01874518825 = getVotingEmissionEpochInfo()
513+ let lastFinalizedEpoch = $t01874518825._1
514+ let currentEpochStartHeight = $t01874518825._2
518515 let votingResultStakedStart = valueOrElse(getInteger(votingEmissionContract, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), 0)
519516 let votingResultStaked = valueOrElse(getInteger(this, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), votingResultStakedStart)
520517 votingResultStaked
522519
523520
524521 func getVotingResultStakedIntegral (lpAssetIdStr) = {
525- let $t01931519395 = getVotingEmissionEpochInfo()
526- let lastFinalizedEpoch = $t01931519395._1
527- let currentEpochStartHeight = $t01931519395._2
522+ let $t01918719267 = getVotingEmissionEpochInfo()
523+ let lastFinalizedEpoch = $t01918719267._1
524+ let currentEpochStartHeight = $t01918719267._2
528525 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
529526 let votingResultStakedIntegralPrev = valueOrElse(getInteger(this, keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch)), 0)
530527 let votingResultStakedLastUpdateHeight = valueOrElse(getInteger(this, keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch)), currentEpochStartHeight)
535532
536533
537534 func refreshVotingResultStakedIntegral (lpAssetIdStr,stakedVoteDelta) = {
538- let $t02023220312 = getVotingEmissionEpochInfo()
539- let lastFinalizedEpoch = $t02023220312._1
540- let currentEpochStartHeight = $t02023220312._2
535+ let $t02010420184 = getVotingEmissionEpochInfo()
536+ let lastFinalizedEpoch = $t02010420184._1
537+ let currentEpochStartHeight = $t02010420184._2
541538 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
542539 let votingResultStakedNew = (votingResultStaked + stakedVoteDelta)
543540 let votingResultStakedIntegral = getVotingResultStakedIntegral(lpAssetIdStr)
546543
547544
548545 func getUserVoteStakedIntegral (lpAssetIdStr,userAddressStr) = {
549- let $t02092321003 = getVotingEmissionEpochInfo()
550- let lastFinalizedEpoch = $t02092321003._1
551- let currentEpochStartHeight = $t02092321003._2
546+ let $t02079520875 = getVotingEmissionEpochInfo()
547+ let lastFinalizedEpoch = $t02079520875._1
548+ let currentEpochStartHeight = $t02079520875._2
552549 let userAddress = addressFromStringValue(userAddressStr)
553550 let userVoteStaked = getUserVoteStaked(lpAssetIdStr, userAddressStr)
554551 let userVoteStakedIntegralPrev = valueOrElse(getInteger(this, keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch)), 0)
560557
561558
562559 func refreshVoteStakedIntegral (lpAssetIdStr,userAddressStr,edge) = {
563- let $t02179121871 = getVotingEmissionEpochInfo()
564- let lastFinalizedEpoch = $t02179121871._1
565- let currentEpochStartHeight = $t02179121871._2
560+ let $t02166321743 = getVotingEmissionEpochInfo()
561+ let lastFinalizedEpoch = $t02166321743._1
562+ let currentEpochStartHeight = $t02166321743._2
566563 let userAddress = addressFromStringValue(userAddressStr)
567564 let userVoteFinalized = getUserVoteFinalized(lpAssetIdStr, userAddressStr)
568565 let actions = if ((userVoteFinalized == 0))
581578
582579
583580 func getStakedVotesIntegralsDiff (lpAssetIdStr,userAddressStr) = {
584- let $t02272522805 = getVotingEmissionEpochInfo()
585- let lastFinalizedEpoch = $t02272522805._1
586- let currentEpochStartHeight = $t02272522805._2
581+ let $t02259722677 = getVotingEmissionEpochInfo()
582+ let lastFinalizedEpoch = $t02259722677._1
583+ let currentEpochStartHeight = $t02259722677._2
587584 let userAddress = addressFromStringValue(userAddressStr)
588585 let userVoteStakedIntegralLastKey = keyVoteStakedIntegralLast(lpAssetIdStr, userAddress, lastFinalizedEpoch)
589586 let userVoteStakedIntegralLast = valueOrElse(getInteger(this, userVoteStakedIntegralLastKey), 0)
630627 let EMPTYSTR = "empty"
631628 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
632629 then {
633- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
630+ let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
634631 getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
635632 }
636633 else if (readOnly)
644641 if ((0 > userBoostEmissionIntegral))
645642 then throw("wrong calculations")
646643 else {
647- let $t02639426533 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
648- let stakedVotesIntegralsActions = $t02639426533._1
649- let userVoteIntegralDiff = $t02639426533._2
650- let totalVotesIntegralDiff = $t02639426533._3
644+ let $t02627826417 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
645+ let stakedVotesIntegralsActions = $t02627826417._1
646+ let userVoteIntegralDiff = $t02627826417._2
647+ let totalVotesIntegralDiff = $t02627826417._3
651648 let poolUserBoostEmissionIntegral = fraction(userBoostEmissionIntegral, poolWeight, POOLWEIGHTMULT)
652649 let userBoostAvaliableToClaimTotalNew = if ((totalVotesIntegralDiff == 0))
653650 then 0
734731
735732 @Callable(i)
736733 func lockRef (duration,referrerAddress,signature) = {
737- let $t03112331188 = lockActions(i, duration)
738- let lockActionsResult = $t03112331188._1
739- let gWxAmountStart = $t03112331188._2
734+ let $t03100731072 = lockActions(i, duration)
735+ let lockActionsResult = $t03100731072._1
736+ let gWxAmountStart = $t03100731072._2
740737 let referralAddress = toString(i.caller)
741738 let refInv = if (if ((referrerAddress == ""))
742739 then true
757754
758755 @Callable(i)
759756 func lock (duration) = {
760- let $t03164631711 = lockActions(i, duration)
761- let lockActionsResult = $t03164631711._1
762- let gWxAmountStart = $t03164631711._2
757+ let $t03153031595 = lockActions(i, duration)
758+ let lockActionsResult = $t03153031595._1
759+ let gWxAmountStart = $t03153031595._2
763760 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
764761 if ((updateRefActivity == updateRefActivity))
765762 then $Tuple2(lockActionsResult, unit)
823820 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
824821 then throw("permissions denied")
825822 else {
826- let $t03479834900 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
827- let userBoostAvailable = $t03479834900._1
828- let dataState = $t03479834900._2
829- let debug = $t03479834900._3
823+ let $t03468234784 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
824+ let userBoostAvailable = $t03468234784._1
825+ let dataState = $t03468234784._2
826+ let debug = $t03468234784._3
830827 $Tuple2(dataState, [userBoostAvailable])
831828 }
832829
834831
835832 @Callable(i)
836833 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
837- let $t03503235133 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
838- let userBoostAvailable = $t03503235133._1
839- let dataState = $t03503235133._2
840- let debug = $t03503235133._3
834+ let $t03491635017 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
835+ let userBoostAvailable = $t03491635017._1
836+ let dataState = $t03491635017._2
837+ let debug = $t03491635017._3
841838 $Tuple2(nil, [userBoostAvailable, debug])
842839 }
843840
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 func wrapErr (msg) = makeString(["boosting.ride:", msg], " ")
1313
1414
1515 func throwErr (msg) = throw(wrapErr(msg))
1616
1717
1818 func strf (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
1919
2020
2121 func ioz (address,key) = valueOrElse(getInteger(address, key), 0)
2222
2323
2424 func iod (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
2525
2626
2727 func iof (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
2828
2929
3030 func abs (val) = if ((0 > val))
3131 then -(val)
3232 else val
3333
3434
3535 func aal (val) = match val {
3636 case valAnyLyst: List[Any] =>
3737 valAnyLyst
3838 case _ =>
3939 throw("fail to cast into List[Any]")
4040 }
4141
4242
4343 func ai (val) = match val {
4444 case valInt: Int =>
4545 valInt
4646 case _ =>
4747 throw("fail to cast into Int")
4848 }
4949
5050
5151 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
5252
5353
5454 let referralsContractAddressOrFail = addressFromStringValue(strf(this, keyReferralsContractAddress()))
5555
5656 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5757
5858 let referralProgramNameDefault = "wxlock"
5959
6060 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
6161
6262 func keyFactoryAddress () = "%s%s__config__factoryAddress"
6363
6464
6565 let IdxFactoryCfgStakingDapp = 1
6666
6767 let IdxFactoryCfgBoostingDapp = 2
6868
6969 let IdxFactoryCfgIdoDapp = 3
7070
7171 let IdxFactoryCfgTeamDapp = 4
7272
7373 let IdxFactoryCfgEmissionDapp = 5
7474
7575 let IdxFactoryCfgRestDapp = 6
7676
7777 let IdxFactoryCfgSlippageDapp = 7
7878
7979 let IdxFactoryCfgDaoDapp = 8
8080
8181 let IdxFactoryCfgMarketingDapp = 9
8282
8383 let IdxFactoryCfgGwxRewardDapp = 10
8484
8585 let IdxFactoryCfgBirdsDapp = 11
8686
8787 func keyFactoryCfg () = "%s__factoryConfig"
88-
89-
90-func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9188
9289
9390 func keyFactoryLpList () = "%s__lpTokensList"
9491
9592
9693 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9794
9895
9996 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
10097
10198
10299 func keyFactoryPoolWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
103100
104101
105102 func readFactoryAddressOrFail () = addressFromStringValue(strf(this, keyFactoryAddress()))
106103
107104
108105 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
109106
110107
111108 func readFactoryCfgOrFail (factory) = split(strf(factory, keyFactoryCfg()), SEP)
112109
113110
114111 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
115112
116113
117114 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
118115
119116
120117 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
121118
122119
123120 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
124121
125122
126123 func keyManagerPublicKey () = "%s__managerPublicKey"
127124
128125
129126 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
130127
131128
132129 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
133130
134131
135132 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
136133
137134
138135 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
139136
140137
141138 func keyBoostingV2LastUpdateHeight () = "%s%s__boostingV2__startBlock"
142139
143140
144141 func keyBoostingV2Integral () = "%s%s__boostingV2__integral"
145142
146143
147144 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
148145
149146
150147 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
151148
152149
153150 func keyNextPeriod () = "%s__nextPeriod"
154151
155152
156153 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
157154
158155
159156 let IdxCfgAssetId = 1
160157
161158 let IdxCfgMinLockAmount = 2
162159
163160 let IdxCfgMinLockDuration = 3
164161
165162 let IdxCfgMaxLockDuration = 4
166163
167164 let IdxCfgMathContract = 5
168165
169166 func keyConfig () = "%s__config"
170167
171168
172169 func readConfigArrayOrFail () = split(strf(this, keyConfig()), SEP)
173170
174171
175172 let mathContract = addressFromStringValue(readConfigArrayOrFail()[IdxCfgMathContract])
176173
177174 func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
178175
179176
180177 func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
181178
182179
183180 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
184181 case s: String =>
185182 fromBase58String(s)
186183 case _: Unit =>
187184 unit
188185 case _ =>
189186 throw("Match error")
190187 }
191188
192189
193190 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
194191 case s: String =>
195192 fromBase58String(s)
196193 case _: Unit =>
197194 unit
198195 case _ =>
199196 throw("Match error")
200197 }
201198
202199
203200 func mustManager (i) = {
204201 let pd = throw("Permission denied")
205202 match managerPublicKeyOrUnit() {
206203 case pk: ByteVector =>
207204 if ((i.callerPublicKey == pk))
208205 then true
209206 else pd
210207 case _: Unit =>
211208 if ((i.caller == this))
212209 then true
213210 else pd
214211 case _ =>
215212 throw("Match error")
216213 }
217214 }
218215
219216
220217 let IdxLockUserNum = 1
221218
222219 let IdxLockAmount = 2
223220
224221 let IdxLockStart = 3
225222
226223 let IdxLockDuration = 4
227224
228225 let IdxLockParamK = 5
229226
230227 let IdxLockParamB = 6
231228
232229 func keyLockParamsRecord (userAddress) = makeString(["%s%s__lock", userAddress], SEP)
233230
234231
235232 func readLockParamsRecordOrFail (userAddress) = split(strf(this, keyLockParamsRecord(userAddress)), SEP)
236233
237234
238235 func formatLockParamsRecordS (userNum,amount,start,duration,paramK,paramB,lastUpdTimestamp,gwxAmount) = makeString(["%d%d%d%d%d%d%d%d", userNum, amount, start, duration, paramK, paramB, lastUpdTimestamp, gwxAmount], SEP)
239236
240237
241238 func formatLockParamsRecord (userNum,amount,start,duration,paramK,paramB,gwxAmount) = formatLockParamsRecordS(userNum, toString(amount), toString(start), toString(duration), toString(paramK), toString(paramB), toString(lastBlock.timestamp), toString(gwxAmount))
242239
243240
244241 func keyNextUserNum () = "%s__nextUserNum"
245242
246243
247244 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
248245
249246
250247 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
251248
252249
253250 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
254251
255252
256253 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
257254
258255
259256 func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
260257
261258
262259 func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
263260
264261
265262 func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
266263
267264
268265 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
269266
270267
271268 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
272269
273270
274271 func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
275272
276273
277274 func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
278275
279276
280277 func keyStatsLocksCount () = "%s%s__stats__locksCount"
281278
282279
283280 func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
284281
285282
286283 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastIntV2", userNum], SEP)
287284
288285
289286 func keyUserLpBoostEmissionLastINTEGRAL (userNum,lpAssetId) = makeString(["%s%d__userBoostEmissionLastIntV2", userNum, lpAssetId], SEP)
290287
291288
292289 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
293290
294291
295292 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
296293
297294
298295 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
299296
300297
301298 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
302299
303300
304301 func keyTotalCachedGwx () = "%s%s__gwxCached__total"
305302
306303
307304 func keyTotalCachedGwxCorrective () = "%s__gwxCachedTotalCorrective"
308305
309306
310307 func keyVote (amountAssetId,priceAssetId,address,epoch) = makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], SEP)
311308
312309
313310 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], SEP)
314311
315312
316313 func keyCurrentEpochUi () = makeString(["%s", "currentEpochUi"], SEP)
317314
318315
319316 func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], SEP)
320317
321318
322319 func keyVotingResultStakedIntegral (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStakedIntegral", lpAssetIdStr, toString(epoch)], SEP)
323320
324321
325322 func keyVotingResultStakedLastUpdateHeight (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStakedIntegralLastUpdateHeight", lpAssetIdStr, toString(epoch)], SEP)
326323
327324
328325 func keyVotingResultStakedIntegralLast (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "votingResultStakedIntegralLast", lpAssetIdStr, toString(address), toString(epoch)], SEP)
329326
330327
331328 func keyVoteStakedIntegral (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegral", lpAssetIdStr, toString(address), toString(epoch)], SEP)
332329
333330
334331 func keyVoteStakedLastUpdateHeight (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegralLastUpdateHeight", lpAssetIdStr, toString(address), toString(epoch)], SEP)
335332
336333
337334 func keyVoteStakedIntegralLast (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegralLast", lpAssetIdStr, toString(address), toString(epoch)], SEP)
338335
339336
340337 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], SEP)
341338
342339
343340 let factoryContract = readFactoryAddressOrFail()
344341
345342 let factoryCfg = readFactoryCfgOrFail(factoryContract)
346343
347344 let emissionContract = getEmissionAddressOrFail(factoryCfg)
348345
349346 let stakingContract = getStakingAddressOrFail(factoryCfg)
350347
351348 let gwxRewardContract = getGwxRewardAddressOrFail(factoryCfg)
352349
353350 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"))
354351
355352 let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
356353
357354 let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract))
358355
359356 let boostCoeff = {
360357 let @ = invoke(emissionContract, "getBoostCoeffREADONLY", nil, nil)
361358 if ($isInstanceOf(@, "Int"))
362359 then @
363360 else throw(($getType(@) + " couldn't be cast to Int"))
364361 }
365362
366363 func getTotalCachedGwx (correct) = {
367364 let currentEpochUi = getIntegerValue(votingEmissionContract, keyCurrentEpochUi())
368365 let keyTargetEpoch = makeString(["%s%s", "totalCachedGwxCorrection__activationEpoch"], SEP)
369366 let targetEpochOption = getInteger(this, keyTargetEpoch)
370367 let totalCachedGwxRaw = valueOrElse(getInteger(this, keyTotalCachedGwx()), 0)
371368 let isCorrectionActivated = if (isDefined(targetEpochOption))
372369 then (currentEpochUi >= value(targetEpochOption))
373370 else false
374371 let corrective = if (if (isCorrectionActivated)
375372 then correct
376373 else false)
377374 then valueOrElse(getInteger(this, keyTotalCachedGwxCorrective()), 0)
378375 else 0
379376 max([0, (totalCachedGwxRaw + corrective)])
380377 }
381378
382379
383380 func HistoryEntry (type,user,amount,lockStart,duration,k,b,i) = {
384381 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
385382 let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(k), toString(b)], SEP)
386383 StringEntry(historyKEY, historyDATA)
387384 }
388385
389386
390387 func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
391388 let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
392389 let locksCountKEY = keyStatsLocksCount()
393390 let usersCountKEY = keyStatsUsersCount()
394391 let totalAmountKEY = keyLockParamTotalAmount()
395392 let locksDurationSumInBlocks = ioz(this, locksDurationSumInBlocksKEY)
396393 let locksCount = ioz(this, locksCountKEY)
397394 let usersCount = ioz(this, usersCountKEY)
398395 let totalAmount = ioz(this, totalAmountKEY)
399396 [IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
400397 }
401398
402399
403400 func calcGwxAmount (kRaw,bRaw,h) = {
404401 let SCALE = 1000
405402 (((kRaw * h) + bRaw) / SCALE)
406403 }
407404
408405
409406 func LockParamsEntry (userAddress,userNum,amount,start,duration,k,b,period) = {
410407 let userAmountKEY = keyLockParamUserAmount(userNum)
411408 let startBlockKEY = keyLockParamStartBlock(userNum)
412409 let durationKEY = keyLockParamDuration(userNum)
413410 let kKEY = keyLockParamK(userNum)
414411 let bKEY = keyLockParamB(userNum)
415412 let kByPeriodKEY = keyLockParamByPeriodK(userNum, period)
416413 let bByPeriodKEY = keyLockParamByPeriodB(userNum, period)
417414 let gwxAmount = calcGwxAmount(k, b, height)
418415 [IntegerEntry(userAmountKEY, amount), IntegerEntry(startBlockKEY, start), IntegerEntry(durationKEY, duration), IntegerEntry(kKEY, k), IntegerEntry(bKEY, b), IntegerEntry(kByPeriodKEY, k), IntegerEntry(bByPeriodKEY, b), StringEntry(keyLockParamsRecord(userAddress), formatLockParamsRecord(userNum, amount, start, duration, k, b, gwxAmount))]
419416 }
420417
421418
422419 func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
423420 then throw("only one payment is allowed")
424421 else if ((size(i.payments) == 0))
425422 then 0
426423 else {
427424 let pmt = i.payments[0]
428425 if ((value(pmt.assetId) != expectedAssetId))
429426 then throw("invalid asset id in payment")
430427 else pmt.amount
431428 }
432429
433430
434431 func calcUserGwxAmountAtHeight (userAddress,targetHeight) = {
435432 let EMPTY = "empty"
436433 let user2NumMappingKEY = keyUser2NumMapping(userAddress)
437434 let userNum = valueOrElse(getString(user2NumMappingKEY), EMPTY)
438435 let k = valueOrElse(getInteger(keyLockParamK(userNum)), 0)
439436 let b = valueOrElse(getInteger(keyLockParamB(userNum)), 0)
440437 let gwxAmountCalc = calcGwxAmount(k, b, targetHeight)
441438 let gwxAmount = if ((0 > gwxAmountCalc))
442439 then 0
443440 else gwxAmountCalc
444441 gwxAmount
445442 }
446443
447444
448445 func calcCurrentGwxAmount (userAddress) = calcUserGwxAmountAtHeight(userAddress, height)
449446
450447
451448 func getVotingEmissionEpochInfo () = {
452- let $t01719017480 = {
449+ let $t01706217352 = {
453450 let currentEpochUi = value(getInteger(votingEmissionContract, keyCurrentEpochUi()))
454451 let lastFinalizedEpoch = (currentEpochUi - 1)
455452 if ((0 > lastFinalizedEpoch))
456453 then throwErr("invalid epoch")
457454 else $Tuple2(currentEpochUi, lastFinalizedEpoch)
458455 }
459- let currentEpochUi = $t01719017480._1
460- let lastFinalizedEpoch = $t01719017480._2
456+ let currentEpochUi = $t01706217352._1
457+ let lastFinalizedEpoch = $t01706217352._2
461458 let currentEpochStartHeight = value(getInteger(votingEmissionContract, keyStartHeightByEpoch(currentEpochUi)))
462459 $Tuple2(lastFinalizedEpoch, currentEpochStartHeight)
463460 }
464461
465462
466463 func getPoolAssetsByLpAssetId (lpAssetIdStr) = {
467464 let idxAmountAssetId = 4
468465 let idxPriceAssetId = 5
469466 let poolCfg = {
470467 let @ = invoke(factoryContract, "getPoolConfigByLpAssetIdREADONLY", [lpAssetIdStr], nil)
471468 if ($isInstanceOf(@, "List[Any]"))
472469 then @
473470 else throw(($getType(@) + " couldn't be cast to List[Any]"))
474471 }
475472 let amountAssetId = {
476473 let @ = poolCfg[idxAmountAssetId]
477474 if ($isInstanceOf(@, "String"))
478475 then @
479476 else throw(($getType(@) + " couldn't be cast to String"))
480477 }
481478 let priceAssetId = {
482479 let @ = poolCfg[idxPriceAssetId]
483480 if ($isInstanceOf(@, "String"))
484481 then @
485482 else throw(($getType(@) + " couldn't be cast to String"))
486483 }
487484 $Tuple2(amountAssetId, priceAssetId)
488485 }
489486
490487
491488 func getUserVoteFinalized (lpAssetIdStr,userAddressStr) = {
492489 let userAddress = addressFromStringValue(userAddressStr)
493- let $t01817118251 = getVotingEmissionEpochInfo()
494- let lastFinalizedEpoch = $t01817118251._1
495- let currentEpochStartHeight = $t01817118251._2
496- let $t01825418329 = getPoolAssetsByLpAssetId(lpAssetIdStr)
497- let amountAssetId = $t01825418329._1
498- let priceAssetId = $t01825418329._2
490+ let $t01804318123 = getVotingEmissionEpochInfo()
491+ let lastFinalizedEpoch = $t01804318123._1
492+ let currentEpochStartHeight = $t01804318123._2
493+ let $t01812618201 = getPoolAssetsByLpAssetId(lpAssetIdStr)
494+ let amountAssetId = $t01812618201._1
495+ let priceAssetId = $t01812618201._2
499496 let userVoteKey = keyVote(amountAssetId, priceAssetId, userAddress, lastFinalizedEpoch)
500497 let userVote = valueOrElse(getInteger(votingEmissionContract, userVoteKey), 0)
501498 userVote
502499 }
503500
504501
505502 func getUserVoteStaked (lpAssetIdStr,userAddressStr) = {
506503 let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(userAddressStr, lpAssetIdStr)), 0)
507504 let userVote = getUserVoteFinalized(lpAssetIdStr, userAddressStr)
508505 if ((stakedByUser == 0))
509506 then 0
510507 else userVote
511508 }
512509
513510
514511 func getVotingResultStaked (lpAssetIdStr) = {
515- let $t01887318953 = getVotingEmissionEpochInfo()
516- let lastFinalizedEpoch = $t01887318953._1
517- let currentEpochStartHeight = $t01887318953._2
512+ let $t01874518825 = getVotingEmissionEpochInfo()
513+ let lastFinalizedEpoch = $t01874518825._1
514+ let currentEpochStartHeight = $t01874518825._2
518515 let votingResultStakedStart = valueOrElse(getInteger(votingEmissionContract, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), 0)
519516 let votingResultStaked = valueOrElse(getInteger(this, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), votingResultStakedStart)
520517 votingResultStaked
521518 }
522519
523520
524521 func getVotingResultStakedIntegral (lpAssetIdStr) = {
525- let $t01931519395 = getVotingEmissionEpochInfo()
526- let lastFinalizedEpoch = $t01931519395._1
527- let currentEpochStartHeight = $t01931519395._2
522+ let $t01918719267 = getVotingEmissionEpochInfo()
523+ let lastFinalizedEpoch = $t01918719267._1
524+ let currentEpochStartHeight = $t01918719267._2
528525 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
529526 let votingResultStakedIntegralPrev = valueOrElse(getInteger(this, keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch)), 0)
530527 let votingResultStakedLastUpdateHeight = valueOrElse(getInteger(this, keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch)), currentEpochStartHeight)
531528 let votingResultStakedIntegralDh = (height - votingResultStakedLastUpdateHeight)
532529 let votingResultStakedIntegral = ((votingResultStakedIntegralDh * votingResultStaked) + votingResultStakedIntegralPrev)
533530 votingResultStakedIntegral
534531 }
535532
536533
537534 func refreshVotingResultStakedIntegral (lpAssetIdStr,stakedVoteDelta) = {
538- let $t02023220312 = getVotingEmissionEpochInfo()
539- let lastFinalizedEpoch = $t02023220312._1
540- let currentEpochStartHeight = $t02023220312._2
535+ let $t02010420184 = getVotingEmissionEpochInfo()
536+ let lastFinalizedEpoch = $t02010420184._1
537+ let currentEpochStartHeight = $t02010420184._2
541538 let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
542539 let votingResultStakedNew = (votingResultStaked + stakedVoteDelta)
543540 let votingResultStakedIntegral = getVotingResultStakedIntegral(lpAssetIdStr)
544541 [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch), votingResultStakedNew), IntegerEntry(keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch), height), IntegerEntry(keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch), votingResultStakedIntegral)]
545542 }
546543
547544
548545 func getUserVoteStakedIntegral (lpAssetIdStr,userAddressStr) = {
549- let $t02092321003 = getVotingEmissionEpochInfo()
550- let lastFinalizedEpoch = $t02092321003._1
551- let currentEpochStartHeight = $t02092321003._2
546+ let $t02079520875 = getVotingEmissionEpochInfo()
547+ let lastFinalizedEpoch = $t02079520875._1
548+ let currentEpochStartHeight = $t02079520875._2
552549 let userAddress = addressFromStringValue(userAddressStr)
553550 let userVoteStaked = getUserVoteStaked(lpAssetIdStr, userAddressStr)
554551 let userVoteStakedIntegralPrev = valueOrElse(getInteger(this, keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch)), 0)
555552 let userVoteStakedLastUpdateHeight = valueOrElse(getInteger(this, keyVoteStakedLastUpdateHeight(lpAssetIdStr, userAddress, lastFinalizedEpoch)), currentEpochStartHeight)
556553 let userVoteStakedIntegralDh = (height - userVoteStakedLastUpdateHeight)
557554 let userVoteStakedIntegral = ((userVoteStakedIntegralDh * userVoteStaked) + userVoteStakedIntegralPrev)
558555 userVoteStakedIntegral
559556 }
560557
561558
562559 func refreshVoteStakedIntegral (lpAssetIdStr,userAddressStr,edge) = {
563- let $t02179121871 = getVotingEmissionEpochInfo()
564- let lastFinalizedEpoch = $t02179121871._1
565- let currentEpochStartHeight = $t02179121871._2
560+ let $t02166321743 = getVotingEmissionEpochInfo()
561+ let lastFinalizedEpoch = $t02166321743._1
562+ let currentEpochStartHeight = $t02166321743._2
566563 let userAddress = addressFromStringValue(userAddressStr)
567564 let userVoteFinalized = getUserVoteFinalized(lpAssetIdStr, userAddressStr)
568565 let actions = if ((userVoteFinalized == 0))
569566 then nil
570567 else {
571568 let stakedVoteDelta = if (edge)
572569 then userVoteFinalized
573570 else -(userVoteFinalized)
574571 let votingResultActions = refreshVotingResultStakedIntegral(lpAssetIdStr, stakedVoteDelta)
575572 let userVoteStakedIntegral = getUserVoteStakedIntegral(lpAssetIdStr, userAddressStr)
576573 let voteActions = [IntegerEntry(keyVoteStakedLastUpdateHeight(lpAssetIdStr, userAddress, lastFinalizedEpoch), height), IntegerEntry(keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch), userVoteStakedIntegral)]
577574 (votingResultActions ++ voteActions)
578575 }
579576 actions
580577 }
581578
582579
583580 func getStakedVotesIntegralsDiff (lpAssetIdStr,userAddressStr) = {
584- let $t02272522805 = getVotingEmissionEpochInfo()
585- let lastFinalizedEpoch = $t02272522805._1
586- let currentEpochStartHeight = $t02272522805._2
581+ let $t02259722677 = getVotingEmissionEpochInfo()
582+ let lastFinalizedEpoch = $t02259722677._1
583+ let currentEpochStartHeight = $t02259722677._2
587584 let userAddress = addressFromStringValue(userAddressStr)
588585 let userVoteStakedIntegralLastKey = keyVoteStakedIntegralLast(lpAssetIdStr, userAddress, lastFinalizedEpoch)
589586 let userVoteStakedIntegralLast = valueOrElse(getInteger(this, userVoteStakedIntegralLastKey), 0)
590587 let votingResultStakedIntegralLastKey = keyVotingResultStakedIntegralLast(lpAssetIdStr, userAddress, lastFinalizedEpoch)
591588 let votingResultStakedIntegralLast = valueOrElse(getInteger(this, votingResultStakedIntegralLastKey), 0)
592589 let userVoteStakedIntegral = getUserVoteStakedIntegral(lpAssetIdStr, userAddressStr)
593590 let votingResultStakedIntegral = getVotingResultStakedIntegral(lpAssetIdStr)
594591 let userVoteStakedIntegralDiff = (userVoteStakedIntegral - userVoteStakedIntegralLast)
595592 let votingResultStakedIntegralDiff = (votingResultStakedIntegral - votingResultStakedIntegralLast)
596593 $Tuple3([IntegerEntry(userVoteStakedIntegralLastKey, userVoteStakedIntegral), IntegerEntry(votingResultStakedIntegralLastKey, votingResultStakedIntegral)], userVoteStakedIntegralDiff, votingResultStakedIntegralDiff)
597594 }
598595
599596
600597 func refreshBoostEmissionIntegral () = {
601598 let wxEmissionPerBlock = iof(emissionContract, keyEmissionRatePerBlockCurrent())
602599 let boostingV2LastUpdateHeightOption = getInteger(this, keyBoostingV2LastUpdateHeight())
603600 let boostingV2IngergalOption = getInteger(this, keyBoostingV2Integral())
604601 let emissionEnd = iof(emissionContract, keyEmissionEndBlock())
605602 let h = if ((height > emissionEnd))
606603 then emissionEnd
607604 else height
608605 let dh = match boostingV2LastUpdateHeightOption {
609606 case lastUpdateHeight: Int =>
610607 max([(h - lastUpdateHeight), 0])
611608 case _: Unit =>
612609 0
613610 case _ =>
614611 throw("Match error")
615612 }
616613 let boostEmissionPerBlock = ((wxEmissionPerBlock * (boostCoeff - 1)) / boostCoeff)
617614 let boostEmissionIntegralPrev = valueOrElse(boostingV2IngergalOption, 0)
618615 let boostEmissionIntegral = ((boostEmissionPerBlock * dh) + boostEmissionIntegralPrev)
619616 $Tuple2([IntegerEntry(keyBoostingV2Integral(), boostEmissionIntegral), IntegerEntry(keyBoostingV2LastUpdateHeight(), height)], boostEmissionIntegral)
620617 }
621618
622619
623620 func internalClaimWxBoost (lpAssetIdStr,userAddressStr,readOnly) = {
624621 let userRecordOption = getString(this, keyLockParamsRecord(userAddressStr))
625622 if ((userRecordOption == unit))
626623 then $Tuple3(0, nil, "userRecord::is::empty")
627624 else {
628625 let userRecordArray = split(value(userRecordOption), SEP)
629626 let userNumStr = userRecordArray[IdxLockUserNum]
630627 let EMPTYSTR = "empty"
631628 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
632629 then {
633- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
630+ let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
634631 getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
635632 }
636633 else if (readOnly)
637634 then 0
638635 else throw(("not readonly mode: unsupported lp asset " + lpAssetIdStr))
639636 let userLpBoostEmissionLastIntegralKEY = keyUserLpBoostEmissionLastINTEGRAL(userNumStr, lpAssetIdStr)
640637 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
641638 let userBoostEmissionLastIntegral = valueOrElse(getInteger(this, userLpBoostEmissionLastIntegralKEY), ioz(this, userBoostEmissionLastIntegralKEY))
642639 let boostEmissionIntegral = refreshBoostEmissionIntegral()._2
643640 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
644641 if ((0 > userBoostEmissionIntegral))
645642 then throw("wrong calculations")
646643 else {
647- let $t02639426533 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
648- let stakedVotesIntegralsActions = $t02639426533._1
649- let userVoteIntegralDiff = $t02639426533._2
650- let totalVotesIntegralDiff = $t02639426533._3
644+ let $t02627826417 = getStakedVotesIntegralsDiff(lpAssetIdStr, userAddressStr)
645+ let stakedVotesIntegralsActions = $t02627826417._1
646+ let userVoteIntegralDiff = $t02627826417._2
647+ let totalVotesIntegralDiff = $t02627826417._3
651648 let poolUserBoostEmissionIntegral = fraction(userBoostEmissionIntegral, poolWeight, POOLWEIGHTMULT)
652649 let userBoostAvaliableToClaimTotalNew = if ((totalVotesIntegralDiff == 0))
653650 then 0
654651 else fraction(poolUserBoostEmissionIntegral, userVoteIntegralDiff, totalVotesIntegralDiff)
655652 let dataState = ([IntegerEntry(userLpBoostEmissionLastIntegralKEY, boostEmissionIntegral)] ++ stakedVotesIntegralsActions)
656653 let debug = makeString([toString(userBoostEmissionLastIntegral), toString(userBoostEmissionIntegral), toString(poolWeight), toString(userVoteIntegralDiff), toString(totalVotesIntegralDiff)], ":")
657654 $Tuple3(userBoostAvaliableToClaimTotalNew, dataState, debug)
658655 }
659656 }
660657 }
661658
662659
663660 func lockActions (i,duration) = {
664661 let cfgArray = readConfigArrayOrFail()
665662 let assetIdStr = cfgArray[IdxCfgAssetId]
666663 let assetId = fromBase58String(assetIdStr)
667664 let minLockAmount = parseIntValue(cfgArray[IdxCfgMinLockAmount])
668665 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
669666 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
670667 if ((size(i.payments) != 1))
671668 then throw("invalid payment - exact one payment must be attached")
672669 else {
673670 let pmt = i.payments[0]
674671 let pmtAmount = pmt.amount
675672 if ((assetId != value(pmt.assetId)))
676673 then throw((("invalid asset is in payment - " + assetIdStr) + " is expected"))
677674 else {
678675 let nextUserNumKEY = keyNextUserNum()
679676 let userAddressStr = toString(i.caller)
680677 let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
681678 let userNumStr = if (userIsExisting)
682679 then value(getString(keyUser2NumMapping(userAddressStr)))
683680 else toString(iof(this, nextUserNumKEY))
684681 let userNum = parseIntValue(userNumStr)
685682 let lockStart = height
686683 let startBlockKEY = keyLockParamStartBlock(userNumStr)
687684 let durationKEY = keyLockParamDuration(userNumStr)
688685 let userAmountKEY = keyLockParamUserAmount(userNumStr)
689686 if (if ((minLockAmount > pmtAmount))
690687 then (i.caller != lpStakingPoolsContract)
691688 else false)
692689 then throw(("amount is less then minLockAmount=" + toString(minLockAmount)))
693690 else if ((minLockDuration > duration))
694691 then throw(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
695692 else if ((duration > maxLockDuration))
696693 then throw(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
697694 else if (if (userIsExisting)
698695 then ((iof(this, startBlockKEY) + iof(this, durationKEY)) >= lockStart)
699696 else false)
700697 then throw("there is an active lock - consider to use increaseLock")
701698 else if ((ioz(this, userAmountKEY) > 0))
702699 then throw(("there are locked WXs - consider to use increaseLock " + userAmountKEY))
703700 else {
704701 let coeffX8 = fraction(duration, MULT8, maxLockDuration)
705702 let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
706703 let gWxParamsResultList = aal(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStart, duration], nil))
707704 let k = ai(gWxParamsResultList[0])
708705 let b = ai(gWxParamsResultList[1])
709706 let period = toString(ai(gWxParamsResultList[2]))
710707 let totalCachedGwxRaw = getTotalCachedGwx(false)
711708 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
712709 let boostEmissionIntegral = refreshBoostEmissionIntegral()._2
713710 let arr = if (userIsExisting)
714711 then nil
715712 else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
716713 $Tuple2(((((arr ++ LockParamsEntry(userAddressStr, userNumStr, pmtAmount, lockStart, duration, k, b, period)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
717714 then 0
718715 else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, k, b, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(keyTotalCachedGwx(), (totalCachedGwxRaw + gWxAmountStart))]), gWxAmountStart)
719716 }
720717 }
721718 }
722719 }
723720
724721
725722 @Callable(i)
726723 func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = {
727724 let checkCaller = mustManager(i)
728725 if ((checkCaller == checkCaller))
729726 then ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
730727 else throw("Strict value is not equal to itself.")
731728 }
732729
733730
734731
735732 @Callable(i)
736733 func lockRef (duration,referrerAddress,signature) = {
737- let $t03112331188 = lockActions(i, duration)
738- let lockActionsResult = $t03112331188._1
739- let gWxAmountStart = $t03112331188._2
734+ let $t03100731072 = lockActions(i, duration)
735+ let lockActionsResult = $t03100731072._1
736+ let gWxAmountStart = $t03100731072._2
740737 let referralAddress = toString(i.caller)
741738 let refInv = if (if ((referrerAddress == ""))
742739 then true
743740 else (signature == base58''))
744741 then unit
745742 else invoke(referralsContractAddressOrFail, "createPair", [referralProgramName, referrerAddress, referralAddress, signature], nil)
746743 if ((refInv == refInv))
747744 then {
748745 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
749746 if ((updateRefActivity == updateRefActivity))
750747 then $Tuple2(lockActionsResult, unit)
751748 else throw("Strict value is not equal to itself.")
752749 }
753750 else throw("Strict value is not equal to itself.")
754751 }
755752
756753
757754
758755 @Callable(i)
759756 func lock (duration) = {
760- let $t03164631711 = lockActions(i, duration)
761- let lockActionsResult = $t03164631711._1
762- let gWxAmountStart = $t03164631711._2
757+ let $t03153031595 = lockActions(i, duration)
758+ let lockActionsResult = $t03153031595._1
759+ let gWxAmountStart = $t03153031595._2
763760 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
764761 if ((updateRefActivity == updateRefActivity))
765762 then $Tuple2(lockActionsResult, unit)
766763 else throw("Strict value is not equal to itself.")
767764 }
768765
769766
770767
771768 @Callable(i)
772769 func increaseLock (deltaDuration) = {
773770 let cfgArray = readConfigArrayOrFail()
774771 let assetIdStr = cfgArray[IdxCfgAssetId]
775772 let assetId = fromBase58String(assetIdStr)
776773 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
777774 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
778775 let pmtAmount = extractOptionalPaymentAmountOrFail(i, assetId)
779776 let userAddressStr = toString(i.caller)
780777 let userRecordArray = readLockParamsRecordOrFail(userAddressStr)
781778 let userNumStr = userRecordArray[IdxLockUserNum]
782779 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
783780 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
784781 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
785782 let lockEnd = (lockStart + lockDuration)
786783 let remainingDuration = max([(lockEnd - height), 0])
787784 let userAmountNew = (userAmount + pmtAmount)
788785 let lockDurationNew = (remainingDuration + deltaDuration)
789786 if ((0 > deltaDuration))
790787 then throw("duration is less then zero")
791788 else if ((minLockDuration > lockDurationNew))
792789 then throw(("lockDurationNew is less then minLockDuration=" + toString(minLockDuration)))
793790 else if ((lockDurationNew > maxLockDuration))
794791 then throw(("deltaDuration + existedLockDuration is greater then maxLockDuration=" + toString(maxLockDuration)))
795792 else {
796793 let coeffX8 = fraction(lockDurationNew, MULT8, maxLockDuration)
797794 let gWxAmountStart = fraction(userAmountNew, coeffX8, MULT8)
798795 let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
799796 if ((updateRefActivity == updateRefActivity))
800797 then {
801798 let lockStartNew = height
802799 let gWxParamsResultList = aal(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStartNew, lockDurationNew], nil))
803800 let k = ai(gWxParamsResultList[0])
804801 let b = ai(gWxParamsResultList[1])
805802 let period = toString(ai(gWxParamsResultList[2]))
806803 let currUserGwx = calcCurrentGwxAmount(userAddressStr)
807804 let gwxDiff = (gWxAmountStart - currUserGwx)
808805 if ((0 > gwxDiff))
809806 then throw(("gwxDiff is less then 0: " + toString(gwxDiff)))
810807 else {
811808 let totalCachedGwxRaw = getTotalCachedGwx(false)
812809 let totalCachedGwxCorrected = getTotalCachedGwx(true)
813810 (((LockParamsEntry(userAddressStr, userNumStr, userAmountNew, lockStartNew, lockDurationNew, k, b, period) ++ StatsEntry(pmtAmount, deltaDuration, 0, 0)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, lockDurationNew, k, b, i)) ++ [IntegerEntry(keyTotalCachedGwx(), (totalCachedGwxRaw + gwxDiff))])
814811 }
815812 }
816813 else throw("Strict value is not equal to itself.")
817814 }
818815 }
819816
820817
821818
822819 @Callable(i)
823820 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
824821 then throw("permissions denied")
825822 else {
826- let $t03479834900 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
827- let userBoostAvailable = $t03479834900._1
828- let dataState = $t03479834900._2
829- let debug = $t03479834900._3
823+ let $t03468234784 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
824+ let userBoostAvailable = $t03468234784._1
825+ let dataState = $t03468234784._2
826+ let debug = $t03468234784._3
830827 $Tuple2(dataState, [userBoostAvailable])
831828 }
832829
833830
834831
835832 @Callable(i)
836833 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
837- let $t03503235133 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
838- let userBoostAvailable = $t03503235133._1
839- let dataState = $t03503235133._2
840- let debug = $t03503235133._3
834+ let $t03491635017 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
835+ let userBoostAvailable = $t03491635017._1
836+ let dataState = $t03491635017._2
837+ let debug = $t03491635017._3
841838 $Tuple2(nil, [userBoostAvailable, debug])
842839 }
843840
844841
845842
846843 @Callable(i)
847844 func unlock (userAddress) = {
848845 let userRecordArray = readLockParamsRecordOrFail(userAddress)
849846 let userNumStr = userRecordArray[IdxLockUserNum]
850847 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
851848 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
852849 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
853850 let lockEnd = (lockStart + lockDuration)
854851 let cfgArray = readConfigArrayOrFail()
855852 let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
856853 if ((lockEnd >= height))
857854 then throw((("wait " + toString(lockEnd)) + " to unlock"))
858855 else if ((0 >= userAmount))
859856 then throw("nothing to unlock")
860857 else {
861858 let period = valueOrElse(getInteger(mathContract, keyNextPeriod()), 0)
862859 (((LockParamsEntry(userAddress, userNumStr, 0, lockStart, lockDuration, 0, 0, toString(period)) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddress, userAmount, lockStart, lockDuration, 0, 0, i)) :+ ScriptTransfer(addressFromStringValue(userAddress), userAmount, assetId))
863860 }
864861 }
865862
866863
867864
868865 @Callable(i)
869866 func gwxUserInfoREADONLY (userAddress) = {
870867 let gwxAmount = calcCurrentGwxAmount(userAddress)
871868 $Tuple2(nil, [gwxAmount])
872869 }
873870
874871
875872
876873 @Callable(i)
877874 func userMaxDurationREADONLY (userAddressStr) = {
878875 let cfgArray = readConfigArrayOrFail()
879876 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
880877 let userRecordOption = getString(this, keyLockParamsRecord(userAddressStr))
881878 if ((userRecordOption == unit))
882879 then $Tuple2(nil, $Tuple2("lock", maxLockDuration))
883880 else {
884881 let userRecordArray = split(value(userRecordOption), SEP)
885882 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
886883 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
887884 let lockEnd = (lockStart + lockDuration)
888885 let remainingDuration = max([(lockEnd - height), 0])
889886 let maxDeltaDuration = (maxLockDuration - remainingDuration)
890887 $Tuple2(nil, $Tuple2("increaseLock", maxDeltaDuration))
891888 }
892889 }
893890
894891
895892
896893 @Callable(i)
897894 func getUserGwxAmountAtHeightREADONLY (userAddress,targetHeight) = {
898895 let gwxAmount = calcUserGwxAmountAtHeight(userAddress, targetHeight)
899896 $Tuple2(nil, gwxAmount)
900897 }
901898
902899
903900
904901 @Callable(i)
905902 func getTotalCachedGwxREADONLY () = $Tuple2(nil, getTotalCachedGwx(true))
906903
907904
908905
909906 @Callable(i)
910907 func onBoostEmissionUpdate () = {
911908 let checkCaller = if ((i.caller == emissionContract))
912909 then true
913910 else mustManager(i)
914911 if ((checkCaller == checkCaller))
915912 then refreshBoostEmissionIntegral()
916913 else throw("Strict value is not equal to itself.")
917914 }
918915
919916
920917
921918 @Callable(i)
922919 func onStakedVoteUpdate (lpAssetIdStr,userAddressStr,edge) = {
923920 let checkCaller = if ((i.caller == stakingContract))
924921 then true
925922 else mustManager(i)
926923 if ((checkCaller == checkCaller))
927924 then {
928925 let actions = refreshVoteStakedIntegral(lpAssetIdStr, userAddressStr, edge)
929926 $Tuple2(actions, unit)
930927 }
931928 else throw("Strict value is not equal to itself.")
932929 }
933930
934931
935932
936933 @Callable(i)
937934 func getVotingResultStakedREADONLY (lpAssetIdStr) = $Tuple2(nil, getVotingResultStaked(lpAssetIdStr))
938935
939936
940937
941938 @Callable(i)
942939 func getVotingResultStakedIntegralREADONLY (lpAssetIdStr) = $Tuple2(nil, getVotingResultStakedIntegral(lpAssetIdStr))
943940
944941
945942
946943 @Callable(i)
947944 func getUserVoteFinalizedREADONLY (lpAssetIdStr,userAddressStr) = $Tuple2(nil, getUserVoteFinalized(lpAssetIdStr, userAddressStr))
948945
949946
950947
951948 @Callable(i)
952949 func getUserVoteStakedIntegralREADONLY (lpAssetIdStr,userAddressStr) = $Tuple2(nil, getUserVoteStakedIntegral(lpAssetIdStr, userAddressStr))
953950
954951
955952
956953 @Callable(i)
957954 func setManager (pendingManagerPublicKey) = {
958955 let checkCaller = mustManager(i)
959956 if ((checkCaller == checkCaller))
960957 then {
961958 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
962959 if ((checkManagerPublicKey == checkManagerPublicKey))
963960 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
964961 else throw("Strict value is not equal to itself.")
965962 }
966963 else throw("Strict value is not equal to itself.")
967964 }
968965
969966
970967
971968 @Callable(i)
972969 func confirmManager () = {
973970 let pm = pendingManagerPublicKeyOrUnit()
974971 let hasPM = if (isDefined(pm))
975972 then true
976973 else throw("No pending manager")
977974 if ((hasPM == hasPM))
978975 then {
979976 let checkPM = if ((i.callerPublicKey == value(pm)))
980977 then true
981978 else throw("You are not pending manager")
982979 if ((checkPM == checkPM))
983980 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
984981 else throw("Strict value is not equal to itself.")
985982 }
986983 else throw("Strict value is not equal to itself.")
987984 }
988985
989986
990987 @Verifier(tx)
991988 func verify () = {
992989 let targetPublicKey = match managerPublicKeyOrUnit() {
993990 case pk: ByteVector =>
994991 pk
995992 case _: Unit =>
996993 tx.senderPublicKey
997994 case _ =>
998995 throw("Match error")
999996 }
1000997 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
1001998 }
1002999

github/deemru/w8io/3ef1775 
166.62 ms