tx · 4txV1dQqfrrFpbYNiniG6RUbPMMqDpKrV9ty6G8AmpvQ

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.03100000 Waves

2022.09.21 15:59 [2238926] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "4txV1dQqfrrFpbYNiniG6RUbPMMqDpKrV9ty6G8AmpvQ", "fee": 3100000, "feeAssetId": null, "timestamp": 1663765150889, "version": 1, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "5y95oY8EtmuoktMBQdbTKKzD8vhBbx46Fbj4ab6cXphNw6VWaYTmyVqi3fWQH9zPpzn3VxV7nFoijHdeWHCYv4Ta" ], "script": "base64:BgKDHwgCEgMKAQgSAwoBCBIAEgQKAgEEEgcKBQEBAQEEEgQKAgEEEgQKAgEIEgQKAgEIEgMKAQESABIHCgUBAQEIARIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIIgZzY2FsZTgiDHNjYWxlOEJpZ0ludCIHc2NhbGUxOCIKemVyb0JpZ0ludCIJb25lQmlnSW50IgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiAmZjIgNtcGsiBHBtcGsiAnBsIgJwaCIBaCIBdCIDcGF1IgJ1YSIEdHhJZCIDZ2F1IgJhYSICcGEiA2FtcCIDYWRhIgZrZXlGZWUiA2ZlZSIEZmNmZyIEbXRwayICcGMiBmlBbXRBcyIFaVByQXMiA21iYSIFYkFTdHIiA2FwcyIca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaCIWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcyIDdG9lIgNvclYiBnNlbmRyViIGbWF0Y2hWIgNzdHIiByRtYXRjaDAiBnZhbFN0ciIEc3RyZiIEYWRkciIDa2V5IgRpbnRmIgNmY2EiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIPc2xpcGFnZUNvbnRyYWN0Igtnd3hDb250cmFjdCIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIEY3BiaSIIcHJBbXRYMTgiCGFtQW10WDE4IgN2YWQiAkExIgJBMiIIc2xpcHBhZ2UiBGRpZmYiBHBhc3MiAnZkIgJEMSICRDAiBHNscGciBGZhaWwiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iB2luQW1BbXQiBmluQW1JZCIHaW5QckFtdCIGaW5QcklkIgZpc0V2YWwiBmVtaXRMcCIKaXNPbmVBc3NldCIQdmFsaWRhdGVTbGlwcGFnZSIGcG10QW10IgVwbXRJZCIHYW1JZFN0ciIHcHJJZFN0ciIJaW5BbUlkU3RyIglpblBySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDE2MjM3MTY1ODIiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgNtb2EiBW9yZGVyIgdhbXRBc0lkIgZwckFzSWQiD2FjY0FtdEFzQmFsYW5jZSIOYWNjUHJBc0JhbGFuY2UiCm9yQW10QXNzZXQiCm9yQW10QXNTdHIiCW9yUHJBc3NldCIJb3JQckFzU3RyIgpvcmRlclByaWNlIg5jYXN0T3JkZXJQcmljZSIRaXNPcmRlclByaWNlVmFsaWQiAmNnIgFpIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiE2VzdGltYXRlUHV0T25lVGtuVjIiCXBtdEFtdFJhdyIKcG9vbENvbmZpZyINJHQwMjA5MDgyMDk1MyINJHQwMjA5NTcyMTQxOCIMYW1CYWxhbmNlTm93IgxwckJhbGFuY2VOb3ciDSR0MDIxNDIyMjE1NTYiEGFtQmFsYW5jZUZvckNhbGMiEHByQmFsYW5jZUZvckNhbGMiCnhQcmVjaXNpb24iBnJlc3VsdCIBQCINJHQwMjIwMjUyMjEyMSILYW1Bc3NldFBhcnQiC3ByQXNzZXRQYXJ0IgZlc3RQdXQiB2VzdGltTFAiCWxwQXNzZXRJZCITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAyMzQ3MzIzNTgxIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDIzNzY4MjM4NTUiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIgRidXJuIgFtIgFzIgJwbSICcGQiAm1tIgJwayIBYyIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiAmNtIgNocG0iA2NwbSIEc2xpcCIJYXV0b1N0YWtlIgdmYWN0Q2ZnIgtzdGFraW5nQ250ciIIc2xpcENudHIiAWUiAmVsIgZsZWdhY3kiAnNhIgJzcCIIbHBUcm5zZnIiAnNzIgVvdXRMcCIHZ3d4Q250ciIHcG9vbENmZyIFYWRkb24iEHBheW1lbnRBbW91bnRSYXciDSR0MDI5MDUxMjkxMDMiDSR0MDI5MjYzMjk4NzkiDHZpcnRTd2FwSW5BbSINdmlydFN3YXBPdXRQciIMdmlydFN3YXBJblByIg12aXJ0U3dhcE91dEFtIgZEMHZzRDEiCWxwQ2FsY1JlcyIQc2VuZEZlZVRvTWF0Y2hlciINcGF5bWVudEFtb3VudCIOcGF5bWVudEFzc2V0SWQiD2xwQXNzZXRFbWlzc2lvbiINJHQwMzQ3MDYzNTAxNSIQcHJpY2VBc3NldEFtb3VudCIRYW1vdW50QXNzZXRBbW91bnQiCWxwQW10Qm90aCIPbHBBc3NldFByaWNlT25lIhBscEFzc2V0UHJpY2VCb3RoIgVib251cyIHbWF4U2xwZyIJb3V0QW10QW10IgFiIgpleGNoUmVzdWx0Igdub3RVc2VkIglvdXRBbW91bnQiCmVzdGltQW1BbXQiCmVzdGltUHJBbXQiDSR0MDM4Mjk2Mzg3NTYiC3RvdGFsR2V0UmF3IghmaW5hbFJlcyINJHQwMzk1MDMzOTYwNyIRb3V0QXNzZXRJZE9yV2F2ZXMiDSR0MDQwNjMyNDA3ODciDWxwQXNzZXRBbW91bnQiDSR0MDQxMjk3NDE1NjgiFGFtb3VudEJhbGFuY2VGb3JTd2FwIhNwcmljZUJhbGFuY2VGb3JTd2FwIgxhbW91bnRUb1N3YXAiCnlQcmVjaXNpb24iDSR0MDQyMTQwNDIxODkiDSR0MDQyNTMzNDI2NDgiEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig1jaGVja1BheW1lbnRzIgpmYWN0b3J5Q2ZnIgdzdGFraW5nIgp1bnN0YWtlSW52IgF2IgVidXJuQSINdW5zdGFrZUFtb3VudCINJHQwNDUwNjg0NTI1NiIIYW10QXNTdHIiB3ByQXNTdHIiAWsiAnByIgxyZXNTY2FsZU11bHQiB3VzckFkZHIiB3BtdEFzSWQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleSIKbWF0Y2hlclB1YiIKb3JkZXJWYWxpZCILc2VuZGVyVmFsaWQiDG1hdGNoZXJWYWxpZCIHbmV3SGFzaCILYWxsb3dlZEhhc2giC2N1cnJlbnRIYXNoVwABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZAkAtgIBAAAAAWUJALYCAQABAAFmCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABZwIDMTAwAAFoAgExAAFpAgJfXwABagIAAAFrAAEAAWwAAgABbQADAAFuAAQAAW8AAQABcAACAAFxAAMAAXIABAABcwAFAAF0AAYAAXUABwABdgAIAAF3AAkAAXgAAQABeQAHAAF6AAoAAUEJAGsDAAUFAWEAkE4BAUICAUMBRAkAvAIDCQC2AgEFAUMFAWMJALYCAQUBRAEBRQIBRgFHCQCgAwEJALwCAwUBRgkAtgIBBQFHBQFjAQFIAwFJAUoBSwkAawMFAUkFAUoFAUsBAUwBAUYDCQC/AgIFAWQFAUYJAL4CAQUBRgUBRgEBTQACEyVzX19mYWN0b3J5Q29udHJhY3QBAU4AAhQlc19fbWFuYWdlclB1YmxpY0tleQEBTwACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBUAACESVzJXNfX3ByaWNlX19sYXN0AQFRAgFSAVMJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFSCQDMCAIJAKQDAQUBUwUDbmlsBQFpAQFUAgFVAVYJAKwCAgkArAICCQCsAgICCyVzJXMlc19fUF9fBQFVAgJfXwUBVgEBVwIBVQFWCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUBVQICX18FAVYBAVgAAg8lc19fYW1vdW50QXNzZXQBAVkAAg4lc19fcHJpY2VBc3NldAEBWgACByVzX19hbXABAmFhAAINJXNfX2FkZG9uQWRkcgACYWICByVzX19mZWUAAmFjCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFiBQFBAQJhZAACESVzX19mYWN0b3J5Q29uZmlnAQJhZQACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQECYWYCAmFnAmFoCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQJhZwICX18FAmFoAghfX2NvbmZpZwECYWkBAmFqCQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmFqAQJhawACDCVzX19zaHV0ZG93bgECYWwAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAECYW0AAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwECYW4DAmFvAmFwAmFxCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmFvAgsgc25kclZhbGlkPQkApQMBBQJhcAIMIG10Y2hyVmFsaWQ9CQClAwEFAmFxAQJhcgEBRgQCYXMFAUYDCQABAgUCYXMCBlN0cmluZwQCYXQFAmFzBQJhdAkAAgECE2ZhaWwgY2FzdCB0byBTdHJpbmcBAmF1AgJhdgJhdwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmF2BQJhdwkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhdgkAzAgCAgEuCQDMCAIFAmF3CQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmF4AgJhdgJhdwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmF2BQJhdwkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhdgkAzAgCAgEuCQDMCAIFAmF3CQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgAAAmF5CQERQGV4dHJOYXRpdmUoMTA2MikBCQECYXUCBQR0aGlzCQEBTQAAAmF6CQECYXUCBQR0aGlzCQEBWgABAmFBAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJheQkBAmFrAAcBAmFCAAkA2QQBCQECYXUCBQJheQkBAmFlAAACYUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhdQIFAmF5CQECYW0AAQJhRAAEAmFFCQECYXUCBQR0aGlzCQEBWAAEAmFGCQECYXUCBQR0aGlzCQEBWQAEAmFHCQECYXgCBQJheQkBAmFpAQUCYUYEAmFnCQECYXgCBQJheQkBAmFpAQUCYUUJALUJAgkBAmF1AgUCYXkJAQJhZgIJAKQDAQUCYWcJAKQDAQUCYUcFAWkBAmFIAAkAtQkCCQECYXUCBQJheQkBAmFkAAUBaQACYUkJAQJhSAAAAmFKCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhSQUBeAIgSW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MAAmFLCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhSQUBeQIgSW52YWxpZCBzbGlwYWdlIGNvbnRyYWN0IGFkZHJlc3MAAmFMCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhSQUBegIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYU0KAmFOAmFPAmFQAmFRAmFSAmFTAmFUAmFVAmFWAmFXCQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJhTgkAzAgCCQCkAwEFAmFPCQDMCAIJAKQDAQUCYVAJAMwIAgkApAMBBQJhUQkAzAgCCQCkAwEFAmFSCQDMCAIJAKQDAQUCYVMJAMwIAgkApAMBBQJhVAkAzAgCCQCkAwEFAmFVCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwUDbmlsBQFpAQJhWAYCYVkCYVoCYmECYVECYVQCYVUJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJhWQkAzAgCCQCkAwEFAmFaCQDMCAIJAKQDAQUCYmEJAMwIAgkApAMBBQJhUQkAzAgCCQCkAwEFAmFUCQDMCAIJAKQDAQUCYVUFA25pbAUBaQECYmIBAmJjAwkAAAIFAmJjAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiYwECYmQCAmJlAmJmCQC8AgMFAmJlBQFjBQJiZgECYmcDAmJoAmJpAmJqBAJiawkAvAIDCQC4AgIFAmJoBQJiaQUBYgUCYmkEAmJsCQC/AgIJALgCAgUCYmoJAQFMAQUCYmsFAWQDCQEBIQEFAmJsCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmJrCQCUCgIFAmJsCQCZAwEJAMwIAgUCYmgJAMwIAgUCYmkFA25pbAECYm0DAmJuAmJvAmJwBAJiawkAvAIDBQJibwUBYgUCYm4EAmJxCQC/AgIFAmJwBQJiawMDBQJicQYJAL8CAgUCYm8FAmJuCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJibwIBIAkApgMBBQJibgIBIAkApgMBBQJiawIBIAkApgMBBQJicAUCYnEBAmJyBAJicwJidAJidQJidgQCYncJAQFCAgUCYnUFAmJzBAJieAkBAUICBQJidgUCYnQJAQJiZAIFAmJ4BQJidwECYnkDAmJ1AmJ2AmJ6BAJiQQkBAmFEAAQCYkIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQQUBdAQCYkMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQQUBdQQCYkQJAQJicgQFAmJCBQJiQwUCYnUFAmJ2BAJiZgkBAUICBQJidQUCYkIEAmJlCQEBQgIFAmJ2BQJiQwQCYkUJAQFCAgUCYnoFAWEEAmJGCQECYmQCBQJiZgUCYkUEAmJHCQECYmQCBQJiZQUCYkUJAMwIAgUCYkQJAMwIAgUCYkYJAMwIAgUCYkcFA25pbAECYkgDAmJ1AmJ2AmJ6BAJiSQkBAmJ5AwUCYnUFAmJ2BQJiegkAzAgCCQEBRQIJAJEDAgUCYkkAAAUBYQkAzAgCCQEBRQIJAJEDAgUCYkkAAQUBYQkAzAgCCQEBRQIJAJEDAgUCYkkAAgUBYQUDbmlsAQJiSgECYksEAmJMCQBrAwUCYksFAmFjBQFhCQCUCgIJAGUCBQJiSwUCYkwFAmJMAQJiTQQCYk4CYk8CYlACYlEEAmJBCQECYUQABAJiUgkAkQMCBQJiQQUBcQQCYlMJAJEDAgUCYkEFAXIEAmJUCQCRAwIFAmJBBQFzBAJiVQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJBBQF0BAJiVgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJBBQF1BAJiVwkAkQMCBQJiQQUBcAQCYlgICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiUgILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQJiUgUCYk8JAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmJZCQECYmIBBQJiUwQCYloJAQFCAgUCYlkFAmJVBAJjYQkBAmJiAQUCYlQEAmNiCQEBQgIFAmNhBQJiVgQCY2MJAQJiZAIFAmNiBQJiWgQCY2QJAQFFAgUCY2MFAWEEAmNlCQEBQgIFAmJQBQFhBAJjZgkBAUICBQJiWAUBYQQCY2cJALwCAwUCYloFAmNlBQJjZgQCY2gJALwCAwUCY2IFAmNlBQJjZgQCY2kJAQFFAgUCY2cFAmJVBAJjagkBAUUCBQJjaAUCYlYEAmNrAwkAAAIFAmJOAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiUQUCY2kDCQAAAgUCYlMCBVdBVkVTBQR1bml0CQDZBAEFAmJTCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJRBQJjagMJAAACBQJiVAIFV0FWRVMFBHVuaXQJANkEAQUCYlQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVcCCQClCAEFAmJRBQJiTgkBAmFYBgUCY2kFAmNqBQJiUAUCY2QFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFQAAUCY2QJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY2QFA25pbAkAnAoKBQJjaQUCY2oFAmJTBQJiVAUCYlkFAmNhBQJiWAUCY2MFAmJXBQJjawECY2wNAmJOAmJqAmNtAmNuAmNvAmNwAmJRAmNxAmNyAmNzAmN0AmN1AmN2BAJiQQkBAmFEAAQCYlIJANkEAQkAkQMCBQJiQQUBcQQCY3cJAJEDAgUCYkEFAXIEAmN4CQCRAwIFAmJBBQFzBAJjeQkAkQMCBQJiQQUBdgQCY3oJAJEDAgUCYkEFAXcEAmNBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkEFAXQEAmNCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkEFAXUEAmJXCQCRAwIFAmJBBQFwBAJjQwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJiUgIIV3IgbHAgYXMIcXVhbnRpdHkEAmJZAwUCY3EJAQJiYgEFAmN3AwMFAmNzCQAAAgUCY3YFAmN3BwkAZQIJAQJiYgEFAmN3BQJjdQMFAmNzCQECYmIBBQJjdwkAZQIJAQJiYgEFAmN3BQJjbQQCY2EDBQJjcQkBAmJiAQUCY3gDAwUCY3MJAAACBQJjdgUCY3gHCQBlAgkBAmJiAQUCY3gFAmN1AwUCY3MJAQJiYgEFAmN4CQBlAgkBAmJiAQUCY3gFAmNvBAJjRAkBAUICBQJjbQUCY0EEAmNFCQEBQgIFAmNvBQJjQgQCY0YJAQJiZAIFAmNFBQJjRAQCYloJAQFCAgUCYlkFAmNBBAJjYgkBAUICBQJjYQUCY0IEAmNHAwkAAAIFAmNDAAAEAmNjBQFkBAJjSAUBZAQCYkUJAHYGCQC5AgIFAmNEBQJjRQAACQC2AgEABQABAAAFBERPV04JAJcKBQkBAUUCBQJiRQUBYQkBAUUCBQJjRAUCY0EJAQFFAgUCY0UFAmNCCQECYmQCCQC3AgIFAmNiBQJjRQkAtwICBQJiWgUCY0QFAmNIBAJjYwkBAmJkAgUCY2IFAmJaBAJjSQkAvAIDCQEBTAEJALgCAgUCY2MFAmNGBQFjBQJjYwQCY0gJAQFCAgUCYmoFAWEDAwMFAmN0CQECIT0CBQJjYwUBZAcJAL8CAgUCY0kFAmNIBwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQJjSQIDID4gCQCmAwEFAmNIBAJjSgkBAUICBQJjQwUBYQQCY0sJALwCAwUCY0QFAmNjBQFjBAJjTAkAvAIDBQJjRQUBYwUCY2MEAmNNAwkAvwICBQJjSwUCY0UJAJQKAgUCY0wFAmNFCQCUCgIFAmNEBQJjSwQCY04IBQJjTQJfMQQCY08IBQJjTQJfMgQCYkUJALwCAwUCY0oFAmNPBQJjYgkAlwoFCQEBRQIFAmJFBQFhCQEBRQIFAmNOBQJjQQkBAUUCBQJjTwUCY0IFAmNjBQJjSAQCY1AIBQJjRwJfMQQCY1EIBQJjRwJfMgQCY1IIBQJjRwJfMwQCY2QJAQFFAggFAmNHAl80BQFhBAJjUwkBAUUCCAUCY0cCXzUFAWEDCQBnAgAABQJjUAkAAgECB0xQIDw9IDAEAmNUAwkBASEBBQJjcgAABQJjUAQCY1UJAGUCBQJjbQUCY1EEAmNWCQBlAgUCY28FAmNSBAJjVwMDBQJjcwkAAAIFAmN2BQJjdwcJAJQKAgUCY3UAAAMDBQJjcwkAAAIFAmN2BQJjeAcJAJQKAgAABQJjdQkAlAoCBQJjUQUCY1IEAmNYCAUCY1cCXzEEAmNZCAUCY1cCXzIEAmNaCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUAAFAmNkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAgUCYlEFAmJOCQECYU0KBQJjWAUCY1kFAmNUBQJjZAUCYmoFAmNTBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjVQUCY1YFA25pbAkAnwoNBQJjUAUCY1QFAmNkBQJiWQUCY2EFAmNDBQJiUgUCYlcFAmNaBQJjVQUCY1YFAmNuBQJjcAECZGEBAmRiBAJiQQkBAmFEAAQCZGMJAJEDAgUCYkEFAXIEAmRkCQCRAwIFAmJBBQFzBAJiVwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJBBQFwBAJiQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJBBQF0BAJiQwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJBBQF1BAJkZQkBAmJiAQUCZGMEAmRmCQECYmIBBQJkZAQCY2MDCQAAAggFAmRiCW9yZGVyVHlwZQUDQnV5CQECYnIEBQJiQgUCYkMJAGQCBQJkZQgFAmRiBmFtb3VudAUCZGYJAQJicgQFAmJCBQJiQwkAZQIFAmRlCAUCZGIGYW1vdW50BQJkZgQCY2QJAQFFAgUCY2MFAWEDAwMJAQJhQQAGCQAAAgUCYlcFAW0GCQAAAgUCYlcFAW4JAAIBAg1BZG1pbiBibG9ja2VkBAJkZwgIBQJkYglhc3NldFBhaXILYW1vdW50QXNzZXQEAmRoAwkAAAIFAmRnBQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQJkZwQCZGkICAUCZGIJYXNzZXRQYWlyCnByaWNlQXNzZXQEAmRqAwkAAAIFAmRpBQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQJkaQMDCQECIT0CBQJkaAUCZGMGCQECIT0CBQJkagUCZGQJAAIBAglXciBhc3NldHMEAmRrCAUCZGIFcHJpY2UEAmNCCQBrAwUBYQUCYkMFAmJCBAJkbAkBAUgDBQJkawUBYQUCY0IEAmRtAwkAAAIIBQJkYglvcmRlclR5cGUFA0J1eQkAZwIFAmNkBQJkbAkAZwIFAmRsBQJjZAYBAmRuAQJkbwMJAQIhPQIJAJADAQgFAmRvCHBheW1lbnRzAAEJAAIBAgoxIHBtbnQgZXhwBAJkcAkBBXZhbHVlAQkAkQMCCAUCZG8IcGF5bWVudHMAAAQCYk8JAQV2YWx1ZQEIBQJkcAdhc3NldElkBAJjdQgFAmRwBmFtb3VudAQCY0cJAQJiTQQJANgEAQgFAmRvDXRyYW5zYWN0aW9uSWQJANgEAQUCYk8FAmN1CAUCZG8GY2FsbGVyBAJjaQgFAmNHAl8xBAJjaggFAmNHAl8yBAJiVwkBDXBhcnNlSW50VmFsdWUBCAUCY0cCXzkEAmNrCAUCY0cDXzEwAwMJAQJhQQAGCQAAAgUCYlcFAW4JAAIBCQCsAgICD0FkbWluIGJsb2NrZWQ6IAkApAMBBQJiVwkAlwoFBQJjaQUCY2oFAmN1BQJiTwUCY2sBAmRxCgJkcgFWAmRzAmR0AmJqAmNyAmNzAmN0AmN1AmN2BAJjRwkBAmNsDQUBVgUCYmoICQEFdmFsdWUBBQJkcwZhbW91bnQICQEFdmFsdWUBBQJkcwdhc3NldElkCAkBBXZhbHVlAQUCZHQGYW1vdW50CAkBBXZhbHVlAQUCZHQHYXNzZXRJZAUCZHIHBQJjcgUCY3MFAmN0BQJjdQUCY3YEAmJXCQENcGFyc2VJbnRWYWx1ZQEIBQJjRwJfOAMDAwkBAmFBAAYJAAACBQJiVwUBbAYJAAACBQJiVwUBbgkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCYlcFAmNHAQJkdQQCZHYCYk8CYlEBVgQCZHcJAQJhRAAEAmJTCQCRAwIFAmR3BQFyBAJiVAkAkQMCBQJkdwUBcwQCYlkJAQJiYgEFAmJTBAJjYQkBAmJiAQUCYlQEAmR4CQECYkoBBQJkdgQCY3UIBQJkeAJfMQQCYkwIBQJkeAJfMgQCZHkDCQAAAgUBVgIACQCUCgIFAmJZBQJjYQMJAAACBQJiTwUCYlMDCQBmAgUCZHYFAmJZCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUCYlkFAmR2BQJjYQMJAAACBQJiTwUCYlQDCQBmAgUCZHYFAmNhCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQJiWQkAZQIFAmNhBQJkdgkAAgECEHdyb25nIHBtdEFzc2V0SWQEAmR6CAUCZHkCXzEEAmRBCAUCZHkCXzIEAmRCAwkAAAIFAmJPBQJiUwkAlAoCBQJkegUCZEEJAJQKAgUCZEEFAmR6BAJkQwgFAmRCAl8xBAJkRAgFAmRCAl8yBAJkRQABBAJkRgoAAmRHCQD8BwQFAmFMAgxjYWxjUHV0WE9ubHkJAMwIAgkApAMBBQJjdQkAzAgCCQCkAwEFAmRDCQDMCAIJAKQDAQUCZEQJAMwIAgIACQDMCAIFAmF6CQDMCAIFAWcJAMwIAgkApAMBBQJkRQkAzAgCBQFoBQNuaWwFA25pbAMJAAECBQJkRwIKKEludCwgSW50KQUCZEcJAAIBCQCsAgIJAAMBCQD8BwQFAmFMAgxjYWxjUHV0WE9ubHkJAMwIAgkApAMBBQJjdQkAzAgCCQCkAwEFAmRDCQDMCAIJAKQDAQUCZEQJAMwIAgIACQDMCAIFAmF6CQDMCAIFAWcJAMwIAgkApAMBBQJkRQkAzAgCBQFoBQNuaWwFA25pbAIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZEgDCQAAAgUCYk8FAmJTBQJkRgkAlAoCCAUCZEYCXzIIBQJkRgJfMQQCZEkIBQJkSAJfMQQCZEoIBQJkSAJfMgQCZEsJAQJkcQoFAmJRBQFWCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiUwUCZEkJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJUBQJkSgAABgYHBQJjdQUCYk8EAmRMCAUCZEsCXzIEAmRNCAUCZEsCXzcEAmNrCAUCZEsCXzkEAmNVCAUCZEsDXzEwBAJjVggFAmRLA18xMQUCZEsBAmROBgJkTwJkUAJkUQJkcgJkUgJkUwMJAQIhPQIJAJADAQUCZFEAAQkAAgECCzEgcG1udCBleHBkBAJkdwkBAmFEAAQCYlIJAJEDAgUCZHcFAXEEAmJTCQCRAwIFAmR3BQFyBAJiVAkAkQMCBQJkdwUBcwQCZFQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkdwUBdAQCZFUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkdwUBdQQCZFYJAJEDAgUCZHcFAXAEAmJRAwkAAAIFAmRyBQR0aGlzBQJkUgUCZHIEAmRwCQEFdmFsdWUBCQCRAwIFAmRRAAAEAmJPCQEFdmFsdWUBCAUCZHAHYXNzZXRJZAQCY3UIBQJkcAZhbW91bnQDCQBmAgCAlOvcAwUCY3UJAAIBAg1NaW4gcG10IDEwIExQBAJiTgkA2AQBBQJkUwMJAQIhPQIFAmJSCQDYBAEFAmJPCQACAQIIV3JvbmcgTFAEAmJZCQECYmIBBQJiUwQCY2EJAQJiYgEFAmJUBAJkVwoAAmRHCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZE8JAMwIAgUCY3UFA25pbAUDbmlsAwkAAQIFAmRHAgooSW50LCBJbnQpBQJkRwkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJkTwkAzAgCBQJjdQUDbmlsBQNuaWwCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmRYCAUCZFcCXzEEAmJMCAUCZFcCXzIEAmRZAwMJAGYCBQJkUAAACQBmAgUCZFAFAmRYBwkAAgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZFAFA25pbAIABQJkWAQCZFoDCQAAAgUCZE8FAmJTCQCUCgIFAmRZAAAJAJQKAgAABQJkWQQCZWEIBQJkWgJfMQQCZWIIBQJkWgJfMgQCZWMJAQJiZAIJAQFCAgUCY2EFAmRVCQEBQgIFAmJZBQJkVAQCZWQJAQFFAgUCZWMFAWEEAmNrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJRBQJkWQMJAAACBQJkTwIFV0FWRVMFBHVuaXQJANkEAQUCZE8JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVcCCQClCAEFAmJRBQJiTgkBAmFYBgUCZWEFAmViBQJjdQUCZWQFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFQAAUCZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZWQFA25pbAMJAAACBQJjawUCY2sEAmVlCQD8BwQFAmF5AgRidXJuCQDMCAIFAmN1BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJPBQJjdQUDbmlsAwkAAAIFAmVlBQJlZQkAlAoCBQJjawUCZFkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmVmAAQCYXMJAKIIAQkBAU4AAwkAAQIFAmFzAgZTdHJpbmcEAmVnBQJhcwkA2QQBBQJlZwMJAAECBQJhcwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJlaAAEAmFzCQCiCAEJAQFPAAMJAAECBQJhcwIGU3RyaW5nBAJlZwUCYXMJANkEAQUCZWcDCQABAgUCYXMCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZWkJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZWoBAmRvBAJhcwkBAmVmAAMJAAECBQJhcwIKQnl0ZVZlY3RvcgQCZWsFAmFzAwkAAAIIBQJkbw9jYWxsZXJQdWJsaWNLZXkFAmVrBgUCZWkDCQABAgUCYXMCBFVuaXQDCQAAAggFAmRvBmNhbGxlcgUEdGhpcwYFAmVpCQACAQILTWF0Y2ggZXJyb3IcAmRvAQtjb25zdHJ1Y3RvcgEBTQQCZWwJAQJlagEFAmRvAwkAAAIFAmVsBQJlbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBTQAFAU0FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkbwEKc2V0TWFuYWdlcgECZW0EAmVsCQECZWoBBQJkbwMJAAACBQJlbAUCZWwEAmVuCQDZBAEFAmVtAwkAAAIFAmVuBQJlbgkAzAgCCQELU3RyaW5nRW50cnkCCQEBTwAFAmVtBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZG8BDmNvbmZpcm1NYW5hZ2VyAAQCYkkJAQJlaAAEAmVvAwkBCWlzRGVmaW5lZAEFAmJJBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJlbwUCZW8EAmVwAwkAAAIIBQJkbw9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmJJBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJlcAUCZXAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ACQDYBAEJAQV2YWx1ZQEFAmJJCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQNwdXQCAmVxAmVyBAJlcwkBAmFIAAQCZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmVzBQF4AgpXciBzdCBhZGRyBAJldQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZXMFAXkCCldyIHNsIGFkZHIDCQBmAgAABQJlcQkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZG8IcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZXYJAQJkcQoJAKUIAQgFAmRvBmNhbGxlcgkA2AQBCAUCZG8NdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkbwhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkbwhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZG8IcGF5bWVudHMAAQUCZXEGBwYAAAIABAJjVAgFAmV2Al8yBAJkTQgFAmV2Al83BAJjawgFAmV2Al85BAJjVQgFAmV2A18xMAQCY1YIBQJldgNfMTEEAmJTCAUCZXYDXzEyBAJiVAgFAmV2A18xMwQCY0cJAPwHBAUCYXkCBGVtaXQJAMwIAgUCY1QFA25pbAUDbmlsAwkAAAIFAmNHBQJjRwQCZXcEAmFzBQJjRwMJAAECBQJhcwIHQWRkcmVzcwQCZXgFAmFzCQD8BwQFAmV4AgRlbWl0CQDMCAIFAmNUBQNuaWwFA25pbAUEdW5pdAMJAAACBQJldwUCZXcEAmV5AwkAZgIFAmNVAAAJAPwHBAUCZXUCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiUwUCY1UFA25pbAUDbmlsAwkAAAIFAmV5BQJleQQCZXoDCQBmAgUCY1YAAAkA/AcEBQJldQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJUBQJjVgUDbmlsBQNuaWwDCQAAAgUCZXoFAmV6BAJlQQMFAmVyBAJlQgkA/AcEBQJldAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZE0FAmNUBQNuaWwDCQAAAgUCZUIFAmVCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRvBmNhbGxlcgUCY1QFAmRNBQNuaWwJAM4IAgUCY2sFAmVBCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQlwdXRPbmVUa24FAmRJAmRKAmVDAmJqAmVyBAJiQQkBAmFIAAQCZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJBBQF4AgpXciBzdCBhZGRyBAJldQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYkEFAXkCCldyIHNsIGFkZHIEAmVECQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiQQUBegILV3IgZ3d4IGFkZHIEAmVFCQECYUQABAJiUwkAkQMCBQJlRQUBcgQCYlQJAJEDAgUCZUUFAXMEAmJVCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUUFAXQEAmJWCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZUUFAXUEAmVGCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQJhYQACAAQCYlEDCQAAAgUCZUYJAKUIAQgFAmRvBmNhbGxlcggFAmRvDG9yaWdpbkNhbGxlcggFAmRvBmNhbGxlcgMDAwMJAGcCAAAFAmJqBgkAZwIAAAUCZEkGCQBnAgAABQJkSgYJAGcCAAAFAmVDCQACAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgkAkAMBCAUCZG8IcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBAJkcAkBBXZhbHVlAQkAkQMCCAUCZG8IcGF5bWVudHMAAAQCYk8JANgEAQkBBXZhbHVlAQgFAmRwB2Fzc2V0SWQEAmVHCAUCZHAGYW1vdW50BAJlSAkBAmJKAQUCZUcEAmN1CAUCZUgCXzEEAmJMCAUCZUgCXzIDCQBmAgCAreIEBQJlRwkAAgECDVdyb25nIHBtdCBhbXQEAmJZCQECYmIBBQJiUwQCY2EJAQJiYgEFAmJUBAJlSQMJAAACBQJiTwUCYlMDAwkAZgIFAmVHBQJiWQYJAGYCBQJkSQUCY3UJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCYCgYJAGUCBQJiWQUCZUcFAmNhCQBlAgUCY3UFAmRJBQJkSgAAAAADCQAAAgUCYk8FAmJUAwMJAGYCBQJlRwUCY2EGCQBmAgUCZEoFAmN1CQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAmAoGBQJiWQkAZQIFAmNhBQJlRwAAAAAJAGUCBQJjdQUCZEoFAmRJCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZHoIBQJlSQJfMQQCZEEIBQJlSQJfMgQCZUoIBQJlSQJfMwQCZUsIBQJlSQJfNAQCZUwIBQJlSQJfNQQCZU0IBQJlSQJfNgQCYm8JAPwHBAUCZUQCBWNhbGNECQDMCAIJAKQDAQUCZHoJAMwIAgkApAMBBQJkQQkAzAgCBQJhegkAzAgCBQFnCQDMCAIFAWgFA25pbAUDbmlsBAJibgkA/AcEBQJlRAIFY2FsY0QJAMwIAgkApgMBCQC2AgEJAGUCCQBkAgUCZHoFAmVKBQJlTQkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQJkQQUCZUwFAmVLCQDMCAIFAmF6CQDMCAIFAWcJAMwIAgUBaAUDbmlsBQNuaWwEAmVOCQECYm0DCQCnAwEJAQJhcgEFAmJuCQCnAwEJAQJhcgEFAmJvBQFmAwkAAAIFAmVOBQJlTgQCZEsJAQJkcQoJAKUIAQgFAmRvBmNhbGxlcgkA2AQBCAUCZG8NdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYlMFAmRJCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiVAUCZEoFAmJqBgYGBQJjdQUCYk8EAmRMCAUCZEsCXzIEAmRNCAUCZEsCXzcEAmNrCAUCZEsCXzkEAmNVCAUCZEsDXzEwBAJjVggFAmRLA18xMQQCZU8JAQJiZwMJALYCAQUCZEwJALYCAQUCZUMJALYCAQUCYmoEAmNUCQCgAwEIBQJlTwJfMgQCZXYJAPwHBAUCYXkCBGVtaXQJAMwIAgUCY1QFA25pbAUDbmlsAwkAAAIFAmV2BQJldgQCZXcEAmFzBQJldgMJAAECBQJhcwIHQWRkcmVzcwQCZXgFAmFzCQD8BwQFAmV4AgRlbWl0CQDMCAIFAmNUBQNuaWwFA25pbAUEdW5pdAMJAAACBQJldwUCZXcEAmV5AwkAZgIFAmNVAAAJAPwHBAUCZXUCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJTBQJjVQUDbmlsBQNuaWwDCQAAAgUCZXkFAmV5BAJlegMJAGYCBQJjVgAACQD8BwQFAmV1AgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiVAUCY1YFA25pbAUDbmlsAwkAAAIFAmV6BQJlegQCZUEDBQJlcgQCZUIJAPwHBAUCZXQCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRNBQJjVAUDbmlsAwkAAAIFAmVCBQJlQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkbwZjYWxsZXIFAmNUBQJkTQUDbmlsBAJlUAMJAGYCBQJiTAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFDBQJiTAkA2QQBBQJiTwUDbmlsBQNuaWwJAM4IAgkAzggCBQJjawUCZUEFAmVQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQtwdXRPbmVUa25WMgICZFACZXIDCQECIT0CCQCQAwEIBQJkbwhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQEAmR3CQECYUQABAJiUwkAkQMCBQJkdwUBcgQCYlQJAJEDAgUCZHcFAXMEAmRUCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZHcFAXQEAmRVCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZHcFAXUEAmJRAwkAAAIIBQJkbwZjYWxsZXIFBHRoaXMIBQJkbwxvcmlnaW5DYWxsZXIIBQJkbwZjYWxsZXIEAmRwCQEFdmFsdWUBCQCRAwIIBQJkbwhwYXltZW50cwAABAJiTwkA2AQBCQEFdmFsdWUBCAUCZHAHYXNzZXRJZAQCY3UIBQJkcAZhbW91bnQDCQBmAgCAreIEBQJjdQkAAgECDVdyb25nIHBtdCBhbXQEAmNHCQECZHUEBQJjdQUCYk8JAKUIAQUCYlEJANgEAQgFAmRvDXRyYW5zYWN0aW9uSWQEAmRMCAUCY0cCXzIEAmRNCAUCY0cCXzcEAmNrCAUCY0cCXzkEAmNVCAUCY0cDXzEwBAJjVggFAmNHA18xMQQCY1QDAwkAZgIFAmRQAAAJAGYCBQJkUAUCZEwHCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJkUAUDbmlsAgAFAmRMBAJldgkA/AcEBQJheQIEZW1pdAkAzAgCBQJjVAUDbmlsBQNuaWwDCQAAAgUCZXYFAmV2BAJldwQCYXMFAmV2AwkAAQIFAmFzAgdBZGRyZXNzBAJleAUCYXMJAPwHBAUCZXgCBGVtaXQJAMwIAgUCY1QFA25pbAUDbmlsBQR1bml0AwkAAAIFAmV3BQJldwQCZXkDCQBmAgUCY1UAAAkA/AcEBQJhSwIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYlMFAmNVBQNuaWwFA25pbAMJAAACBQJleQUCZXkEAmV6AwkAZgIFAmNWAAAJAPwHBAUCYUsCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJUBQJjVgUDbmlsBQNuaWwDCQAAAgUCZXoFAmV6BAJlQQMFAmVyBAJlQgkA/AcEBQJhSgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZE0FAmNUBQNuaWwDCQAAAgUCZUIFAmVCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRvBmNhbGxlcgUCY1QFAmRNBQNuaWwJAJQKAgkAzggCBQJjawUCZUEFAmNUCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvARNwdXRPbmVUa25WMlJFQURPTkxZAgJlUQJlUgQCY0cJAQJkdQQFAmVRBQJlUgIAAgAEAmRMCAUCY0cCXzIEAmRNCAUCY0cCXzcEAmNrCAUCY0cCXzkEAmNVCAUCY0cDXzEwBAJjVggFAmNHA18xMQkAlAoCBQNuaWwFAmRMAmRvARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJlUQJlUgQCZHcJAQJhRAAEAmJTCQCRAwIFAmR3BQFyBAJiVAkAkQMCBQJkdwUBcwQCYlkJAQJiYgEFAmJTBAJjYQkBAmJiAQUCYlQEAmNHCQECZHUEBQJlUQUCZVICAAIABAJkTAgFAmNHAl8yBAJjZAgFAmNHAl8zBAJlUwgFAmNHAl82BAJkTQgFAmNHAl83BAJlVAMJAAACBQJlUgUCYlMEAmVVCQBrAwUCZVEFAmNkBQFhCQCUCgIFAmVRBQJlVQQCZVYJAGsDBQJlUQUBYQUCY2QJAJQKAgUCZVYFAmVRBAJlVggFAmVUAl8xBAJlVQgFAmVUAl8yBAJlVwkAawMFAmVTBQJlVQUCY2EEAmVYAwkAAAIFAmVSBQJiUwkAawMFAmVWBQFhBQJkTAkAawMFAmVVBQFhBQJkTAQCZVkJAGsDCQBkAgUCZVUFAmVWBQFhBQJlVwQCZVoJAGsDCQBlAgUCZVkFAmVYBQFhBQJlWAQCYkwICQECYkoBBQJlUQJfMgkAlAoCBQNuaWwJAJUKAwUCZEwFAmJMBQJlWgJkbwEKcHV0Rm9yRnJlZQECZmEDCQBmAgAABQJmYQkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJkbwhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJkSwkBAmRxCgkApQgBCAUCZG8GY2FsbGVyCQDYBAEIBQJkbw10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmRvCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmRvCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkbwhwYXltZW50cwABBQJmYQcHBgAAAgAIBQJkSwJfOQJkbwEDZ2V0AAQCY0cJAQJkbgEFAmRvBAJmYggFAmNHAl8xBAJjaggFAmNHAl8yBAJjdQgFAmNHAl8zBAJiTwgFAmNHAl80BAJjawgFAmNHAl81BAJmYwkA/AcEBQJheQIEYnVybgkAzAgCBQJjdQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiTwUCY3UFA25pbAMJAAACBQJmYwUCZmMFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQlnZXRPbmVUa24FAmZkAmZlAmZmAmRPAmJqAwkBAiE9AgkAkAMBCAUCZG8IcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBAJiQQkBAmFEAAQCYlIJAJEDAgUCYkEFAXEEAmJTCQCRAwIFAmJBBQFyBAJiVAkAkQMCBQJiQQUBcwQCYlUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQQUBdAQCYlYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQQUBdQQCYlcJAJEDAgUCYkEFAXAEAmVzCQECYUgABAJlRAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZXMFAXoCCldyIHNsIGFkZHIEAmRwCQEFdmFsdWUBCQCRAwIIBQJkbwhwYXltZW50cwAABAJlRgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQECYWEAAgAEAmJRAwkAAAIFAmVGCQClCAEIBQJkbwZjYWxsZXIIBQJkbwxvcmlnaW5DYWxsZXIIBQJkbwZjYWxsZXIEAmJOCQDYBAEIBQJkbw10cmFuc2FjdGlvbklkBAJiTwkBBXZhbHVlAQgFAmRwB2Fzc2V0SWQEAmN1CAUCZHAGYW1vdW50AwkAZgIAgJTr3AMFAmN1CQACAQINTWluIHBtdCAxMCBMUAMDAwkAZgIAAAUCYmoGCQBmAgAABQJmZAYJAGYCAAAFAmZmCQACAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgUCYlIJANgEAQUCYk8JAAIBAghXcm9uZyBMUAQCY0cJAQJiTQQJANgEAQgFAmRvDXRyYW5zYWN0aW9uSWQJANgEAQUCYk8FAmN1CAUCZG8GY2FsbGVyBAJmZwgFAmNHAl8xBAJmaAgFAmNHAl8yBAJiWQkBAmJiAQUCYlMEAmNhCQECYmIBBQJiVAQCZmkDCQAAAgUCZE8FAmJTCQCZCgcJAGUCBQJiWQUCZmcJAGUCBQJjYQUCZmgFAmZkBQJmaAAAAAAJAGQCBQJmZwUCZmQDCQAAAgUCZE8FAmJUCQCZCgcJAGUCBQJiWQUCZmcJAGUCBQJjYQUCZmgAAAAABQJmZAUCZmcJAGQCBQJmaAUCZmQJAAIBAhB3cm9uZyBvdXRBc3NldElkBAJkeggFAmZpAl8xBAJkQQgFAmZpAl8yBAJlSggFAmZpAl8zBAJlSwgFAmZpAl80BAJlTAgFAmZpAl81BAJlTQgFAmZpAl82BAJmaggFAmZpAl83AwMJAGYCAAAFAmVKBgkAZgIAAAUCZUwJAAIBAgpXcm9uZyBjYWxjBAJibwkA/AcEBQJlRAIFY2FsY0QJAMwIAgkApAMBBQJkegkAzAgCCQCkAwEFAmRBCQDMCAIFAmF6CQDMCAIFAWcJAMwIAgUBaAUDbmlsBQNuaWwEAmJuCQD8BwQFAmVEAgVjYWxjRAkAzAgCCQCkAwEJAGQCCQBlAgUCZHoFAmVKBQJlTQkAzAgCCQCkAwEJAGUCCQBkAgUCZEEFAmVLBQJlTAkAzAgCBQJhegkAzAgCBQFnCQDMCAIFAWgFA25pbAUDbmlsBAJlTgkBAmJtAwkApwMBCQECYXIBBQJibgkApwMBCQECYXIBBQJibwUBZgMJAAACBQJlTgUCZU4EAmRYCAkBAmJKAQUCZmoCXzEEAmZrCQECYmcDCQC2AgEFAmRYCQC2AgEFAmZmCQC2AgEFAmJqAwkAAAIFAmZrBQJmawQCZmwDCQAAAgUCZE8FAmJTCQCUCgIJAKADAQgFAmZrAl8yAAAJAJQKAgAACQCgAwEIBQJmawJfMgQCZWEIBQJmbAJfMQQCZWIIBQJmbAJfMgQCZFkJAGQCBQJlYQUCZWIEAmJMCQBlAgUCZmoFAmRYBAJmbQMJAAACBQJkTwIFV0FWRVMFBHVuaXQJANkEAQUCZE8EAmVQAwkAZgIFAmJMAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUMFAmJMBQJmbQUDbmlsBQNuaWwEAmVjCQECYmQCCQEBQgIFAmNhBQJiVgkBAUICBQJiWQUCYlUEAmVkCQEBRQIFAmVjBQFhBAJjawkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiUQUCZFkFAmZtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFXAgkApQgBBQJiUQUCYk4JAQJhWAYFAmVhBQJlYgUCY3UFAmVkBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUAAFAmVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmVkBQNuaWwDCQAAAgUCY2sFAmNrBAJlZQkA/AcEBQJheQIEYnVybgkAzAgCBQJjdQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiTwUCY3UFA25pbAMJAAACBQJlZQUCZWUJAM4IAgUCY2sFAmVQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQtnZXRPbmVUa25WMgICZE8CZFAEAmZuCQECZE4GBQJkTwUCZFAIBQJkbwhwYXltZW50cwgFAmRvBmNhbGxlcggFAmRvDG9yaWdpbkNhbGxlcggFAmRvDXRyYW5zYWN0aW9uSWQEAmNrCAUCZm4CXzEEAmRZCAUCZm4CXzIJAJQKAgUCY2sFAmRZAmRvARNnZXRPbmVUa25WMlJFQURPTkxZAgJkTwJmbwQCZHcJAQJhRAAEAmJSCQCRAwIFAmR3BQFxBAJiUwkAkQMCBQJkdwUBcgQCYlQJAJEDAgUCZHcFAXMEAmNHCQECYk0EAgAFAmJSBQJmbwUEdGhpcwQCZmcIBQJjRwJfMQQCZmgIBQJjRwJfMgQCYlkJAQJiYgEFAmJTBAJjYQkBAmJiAQUCYlQEAmR6CQBlAgUCYlkFAmZnBAJkQQkAZQIFAmNhBQJmaAQCZnADCQAAAgUCZE8FAmJTCQCVCgMFAmRBBQJkegUCZmgDCQAAAgUCZE8FAmJUCQCVCgMFAmR6BQJkQQUCZmcJAAIBAhB3cm9uZyBvdXRBc3NldElkBAJmcQgFAmZwAl8xBAJmcggFAmZwAl8yBAJmcwgFAmZwAl8zBAJmdAABBAJmZAoAAmRHCQD8BwQFAmFMAgxjYWxjU3dhcFhUb1kJAMwIAgkApAMBBQJmcwkAzAgCCQCkAwEFAmZxCQDMCAIJAKQDAQUCZnIJAMwIAgIACQDMCAIFAmF6CQDMCAIFAWcJAMwIAgkApAMBBQJmdAkAzAgCBQFoBQNuaWwFA25pbAMJAAECBQJkRwIDSW50BQJkRwkAAgEJAKwCAgkAAwEJAPwHBAUCYUwCDGNhbGNTd2FwWFRvWQkAzAgCCQCkAwEFAmZzCQDMCAIJAKQDAQUCZnEJAMwIAgkApAMBBQJmcgkAzAgCAgAJAMwIAgUCYXoJAMwIAgUBZwkAzAgCCQCkAwEFAmZ0CQDMCAIFAWgFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmZqCQBkAgUCZmQDCQAAAgUCZE8FAmJTBQJmZwUCZmgEAmZ1CQECYkoBBQJmagQCZFgIBQJmdQJfMQQCYkwIBQJmdQJfMgkAlAoCBQNuaWwJAJQKAgUCZFgFAmJMAmRvARxnZXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJkTwJmbwQCZHcJAQJhRAAEAmJTCQCRAwIFAmR3BQFyBAJiVAkAkQMCBQJkdwUBcwQCYlIJAJEDAgUCZHcFAXEEAmJZCQECYmIBBQJiUwQCY2EJAQJiYgEFAmJUBAJmdgoAAmRHCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZE8JAMwIAgUCZm8FA25pbAUDbmlsAwkAAQIFAmRHAgooSW50LCBJbnQpBQJkRwkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJkTwkAzAgCBQJmbwUDbmlsBQNuaWwCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmRYCAUCZnYCXzEEAmJMCAUCZnYCXzIEAmNHCQECYk0EAgAFAmJSBQJmbwUEdGhpcwQCY2kIBQJjRwJfMQQCY2oIBQJjRwJfMgQCZVgJAGsDBQJkWAUBYQUCZm8EAmVZCQBrAwkAZAIFAmNpBQJjagUBYQUCZm8EAmVaCQBrAwkAZQIFAmVYBQJlWQUBYQUCZVkJAJQKAgUDbmlsCQCVCgMFAmRYBQJiTAUCZVoCZG8BCWdldE5vTGVzcwICZncCZngEAmNHCQECZG4BBQJkbwQCY2kIBQJjRwJfMQQCY2oIBQJjRwJfMgQCY3UIBQJjRwJfMwQCYk8IBQJjRwJfNAQCY2sIBQJjRwJfNQMJAGYCBQJmdwUCY2kJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY2kCAyA8IAkApAMBBQJmdwMJAGYCBQJmeAUCY2oJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjagIDIDwgCQCkAwEFAmZ4BAJmeQkA/AcEBQJheQIEYnVybgkAzAgCBQJjdQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiTwUCY3UFA25pbAMJAAACBQJmeQUCZnkFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQ11bnN0YWtlQW5kR2V0AQJiSwQCZnoDCQECIT0CCQCQAwEIBQJkbwhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZnoFAmZ6BAJiQQkBAmFEAAQCZkEJAQJhSAAEAmRNCQDZBAEJAJEDAgUCYkEFAXEEAmZCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmQQUBeAIKV3Igc3QgYWRkcgQCZkMJAPwHBAUCZkICB3Vuc3Rha2UJAMwIAgkA2AQBBQJkTQkAzAgCBQJiSwUDbmlsBQNuaWwDCQAAAgUCZkMFAmZDBAJjRwkBAmJNBAkA2AQBCAUCZG8NdHJhbnNhY3Rpb25JZAkA2AQBBQJkTQUCYksIBQJkbwZjYWxsZXIEAmJXCQENcGFyc2VJbnRWYWx1ZQEIBQJjRwJfOQQCY2sIBQJjRwNfMTAEAmZEAwMJAQJhQQAGCQAAAgUCYlcFAW4JAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJiVwYDCQAAAgUCZkQFAmZEBAJmRQkA/AcEBQJheQIEYnVybgkAzAgCBQJiSwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkTQUCYksFA25pbAMJAAACBQJmRQUCZkUFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvARN1bnN0YWtlQW5kR2V0T25lVGtuAwJmRgJkTwJkUAQCZnoDCQECIT0CCQCQAwEIBQJkbwhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZnoFAmZ6BAJiQQkBAmFEAAQCZkEJAQJhSAAEAmRNCQDZBAEJAJEDAgUCYkEFAXEEAmZCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmQQUBeAIKV3Igc3QgYWRkcgQCZkMJAPwHBAUCZkICB3Vuc3Rha2UJAMwIAgkA2AQBBQJkTQkAzAgCBQJmRgUDbmlsBQNuaWwDCQAAAgUCZkMFAmZDBAJmRwkBAmROBgUCZE8FAmRQCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkTQUCZkYFA25pbAgFAmRvBmNhbGxlcggFAmRvDG9yaWdpbkNhbGxlcggFAmRvDXRyYW5zYWN0aW9uSWQEAmNrCAUCZkcCXzEEAmRZCAUCZkcCXzIJAJQKAgUCY2sFAmRZCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRvAQhhY3RpdmF0ZQICZkgCZkkDCQECIT0CCQClCAEIBQJkbwZjYWxsZXIJAKUIAQUCYXkJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWAAFAmZICQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFZAAUCZkkFA25pbAIHc3VjY2VzcwJkbwEEc2V0UwICZkoCZkQDCQECIT0CCQClCAEIBQJkbwZjYWxsZXIJAQJhdQIFBHRoaXMJAQJhYQAFAmVpCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmZKBQJmRAUDbmlsAmRvAQRzZXRJAgJmSgJmRAMJAQIhPQIJAKUIAQgFAmRvBmNhbGxlcgkBAmF1AgUEdGhpcwkBAmFhAAUCZWkJAMwIAgkBDEludGVnZXJFbnRyeQIFAmZKBQJmRAUDbmlsAmRvARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhRAACZG8BHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJjCQCUCgIFA25pbAkBAmJiAQUCYmMCZG8BGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJ1AmJ2AmJ6BAJmSwkBAmJ5AwUCYnUFAmJ2BQJiegkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmZLAAAJAMwIAgkApgMBCQCRAwIFAmZLAAEJAMwIAgkApgMBCQCRAwIFAmZLAAIFA25pbAJkbwEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBRgJmTAkAlAoCBQNuaWwJAQFFAgkApwMBBQFGBQJmTAJkbwEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUMBRAkAlAoCBQNuaWwJAKYDAQkBAUICBQFDBQFEAmRvAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJlAmJmCQCUCgIFA25pbAkApgMBCQECYmQCCQCnAwEFAmJlCQCnAwEFAmJmAmRvASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCYk4CYmoCY20CY24CY28CY3ACZk0CY3ECY3IJAJQKAgUDbmlsCQECY2wNBQJiTgUCYmoFAmNtBQJjbgUCY28FAmNwBQJmTQUCY3EFAmNyBgcAAAIAAmRvASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCYk4CZk4CYlACZk0EAmNHCQECYk0EBQJiTgUCZk4FAmJQCQERQGV4dHJOYXRpdmUoMTA2MikBBQJmTQkAlAoCBQNuaWwJAJwKCggFAmNHAl8xCAUCY0cCXzIIBQJjRwJfMwgFAmNHAl80CAUCY0cCXzUIBQJjRwJfNggFAmNHAl83CQCmAwEIBQJjRwJfOAgFAmNHAl85CAUCY0cDXzEwAQJmTwECZlAABAJmUQQCYXMJAQJlZgADCQABAgUCYXMCCkJ5dGVWZWN0b3IEAmVrBQJhcwUCZWsDCQABAgUCYXMCBFVuaXQIBQJmTw9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQCYXMFAmZPAwkAAQIFAmFzAgVPcmRlcgQCZGIFAmFzBAJmUgkBAmFCAAQCZlMJAQJkYQEFAmRiBAJmVAkA9AMDCAUCZGIJYm9keUJ5dGVzCQCRAwIIBQJkYgZwcm9vZnMAAAgFAmRiD3NlbmRlclB1YmxpY0tleQQCZlUJAPQDAwgFAmRiCWJvZHlCeXRlcwkAkQMCCAUCZGIGcHJvb2ZzAAEFAmZSAwMDBQJmUwUCZlQHBQJmVQcGCQECYW4DBQJmUwUCZlQFAmZVAwkAAQIFAmFzAhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQCZWcFAmFzBAJmVgkA9gMBCQEFdmFsdWUBCAUCZWcGc2NyaXB0BAJmVwkA2wQBCQEFdmFsdWUBCQCdCAIFAmF5CQECYWwABAJmWAkA8QcBBQR0aGlzAwMJAAACBQJmVwUCZlYJAQIhPQIFAmZYBQJmVgcGCQD0AwMIBQJmTwlib2R5Qnl0ZXMJAJEDAggFAmZPBnByb29mcwAABQJmUQkA9AMDCAUCZk8JYm9keUJ5dGVzCQCRAwIIBQJmTwZwcm9vZnMAAAUCZlHaWHaq", "chainId": 84, "height": 2238926, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BCT5DVDFZvtYQgFjB7pYYxWNNnkz2biiYZDAWZpPTPWn Next: 9WuaxFz8AxHpHJJUf7DeEemUnEZ336TtcnXyJ48Fwaf4 Diff:
OldNewDifferences
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
9-
10-let thousand = 1000
119
1210 let zeroBigInt = toBigInt(0)
1311
5553
5654 let idxFactGwxRewCntr = 10
5755
58-let feePermilleDefault = 0
56+let feeDefault = fraction(5, scale8, 10000)
5957
6058 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6159
104102 func ada () = "%s__addonAddr"
105103
106104
107-let keyFeePermille = "%s__feePermille"
105+let keyFee = "%s__fee"
108106
109-let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
107+let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
110108
111109 func fcfg () = "%s__factoryConfig"
112110
240238
241239
242240 func takeFee (amount) = {
243- let fee = fraction(amount, feePermille, thousand)
244- $Tuple2((amount - fee), fee)
241+ let feeAmount = fraction(amount, fee, scale8)
242+ $Tuple2((amount - feeAmount), feeAmount)
245243 }
246244
247245
358356 else calcLpAmt
359357 let amDiff = (inAmAmt - calcAmAssetPmt)
360358 let prDiff = (inPrAmt - calcPrAssetPmt)
361- let $t01627116616 = if (if (isOneAsset)
359+ let $t01623716582 = if (if (isOneAsset)
362360 then (pmtId == amIdStr)
363361 else false)
364362 then $Tuple2(pmtAmt, 0)
367365 else false)
368366 then $Tuple2(0, pmtAmt)
369367 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
370- let writeAmAmt = $t01627116616._1
371- let writePrAmt = $t01627116616._2
368+ let writeAmAmt = $t01623716582._1
369+ let writePrAmt = $t01623716582._2
372370 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
373371 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
374372 }
458456 let prId = poolConfig[idxPrAsId]
459457 let amBalance = getAccBalance(amId)
460458 let prBalance = getAccBalance(prId)
461- let $t02094220987 = takeFee(pmtAmtRaw)
462- let pmtAmt = $t02094220987._1
463- let feeAmount = $t02094220987._2
464- let $t02099121452 = if ((txId == ""))
459+ let $t02090820953 = takeFee(pmtAmtRaw)
460+ let pmtAmt = $t02090820953._1
461+ let feeAmount = $t02090820953._2
462+ let $t02095721418 = if ((txId == ""))
465463 then $Tuple2(amBalance, prBalance)
466464 else if ((pmtAssetId == amId))
467465 then if ((pmtAmtRaw > amBalance))
472470 then throw("invalid payment amount")
473471 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
474472 else throw("wrong pmtAssetId")
475- let amBalanceNow = $t02099121452._1
476- let prBalanceNow = $t02099121452._2
477- let $t02145621590 = if ((pmtAssetId == amId))
473+ let amBalanceNow = $t02095721418._1
474+ let prBalanceNow = $t02095721418._2
475+ let $t02142221556 = if ((pmtAssetId == amId))
478476 then $Tuple2(amBalanceNow, prBalanceNow)
479477 else $Tuple2(prBalanceNow, amBalanceNow)
480- let amBalanceForCalc = $t02145621590._1
481- let prBalanceForCalc = $t02145621590._2
478+ let amBalanceForCalc = $t02142221556._1
479+ let prBalanceForCalc = $t02142221556._2
482480 let xPrecision = 1
483481 let result = {
484482 let @ = invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)
486484 then @
487485 else throw(($getType(invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)) + " couldn't be cast to (Int, Int)"))
488486 }
489- let $t02205922155 = if ((pmtAssetId == amId))
487+ let $t02202522121 = if ((pmtAssetId == amId))
490488 then result
491489 else $Tuple2(result._2, result._1)
492- let amAssetPart = $t02205922155._1
493- let prAssetPart = $t02205922155._2
490+ let amAssetPart = $t02202522121._1
491+ let prAssetPart = $t02202522121._2
494492 let estPut = cp(userAddress, txId, AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), 0, true, true, false, pmtAmt, pmtAssetId)
495493 let estimLP = estPut._2
496494 let lpAssetId = estPut._7
526524 else {
527525 let amBalance = getAccBalance(amId)
528526 let prBalance = getAccBalance(prId)
529- let $t02350723615 = {
527+ let $t02347323581 = {
530528 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
531529 if ($isInstanceOf(@, "(Int, Int)"))
532530 then @
533531 else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)) + " couldn't be cast to (Int, Int)"))
534532 }
535- let totalGet = $t02350723615._1
536- let feeAmount = $t02350723615._2
533+ let totalGet = $t02347323581._1
534+ let feeAmount = $t02347323581._2
537535 let totalAmount = if (if ((minOutAmount > 0))
538536 then (minOutAmount > totalGet)
539537 else false)
540538 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
541539 else totalGet
542- let $t02380223889 = if ((outAssetId == amId))
540+ let $t02376823855 = if ((outAssetId == amId))
543541 then $Tuple2(totalAmount, 0)
544542 else $Tuple2(0, totalAmount)
545- let outAm = $t02380223889._1
546- let outPr = $t02380223889._2
543+ let outAm = $t02376823855._1
544+ let outPr = $t02376823855._2
547545 let curPrX18 = cpbi(t1(prBalance, prDecimals), t1(amBalance, amDecimals))
548546 let curPr = f1(curPrX18, scale8)
549547 let state = [ScriptTransfer(userAddress, totalAmount, if ((outAssetId == "WAVES"))
733731 let pmt = value(i.payments[0])
734732 let pmtAssetId = toBase58String(value(pmt.assetId))
735733 let paymentAmountRaw = pmt.amount
736- let $t02908529137 = takeFee(paymentAmountRaw)
737- let pmtAmt = $t02908529137._1
738- let feeAmount = $t02908529137._2
734+ let $t02905129103 = takeFee(paymentAmountRaw)
735+ let pmtAmt = $t02905129103._1
736+ let feeAmount = $t02905129103._2
739737 if ((10000000 > paymentAmountRaw))
740738 then throw("Wrong pmt amt")
741739 else {
742740 let amBalance = getAccBalance(amId)
743741 let prBalance = getAccBalance(prId)
744- let $t02929729913 = if ((pmtAssetId == amId))
742+ let $t02926329879 = if ((pmtAssetId == amId))
745743 then if (if ((paymentAmountRaw > amBalance))
746744 then true
747745 else (amAssetPart > pmtAmt))
754752 then throw("invalid payment amount")
755753 else $Tuple6(amBalance, (prBalance - paymentAmountRaw), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
756754 else throw("wrong pmtAssetId")
757- let amBalanceNow = $t02929729913._1
758- let prBalanceNow = $t02929729913._2
759- let virtSwapInAm = $t02929729913._3
760- let virtSwapOutPr = $t02929729913._4
761- let virtSwapInPr = $t02929729913._5
762- let virtSwapOutAm = $t02929729913._6
755+ let amBalanceNow = $t02926329879._1
756+ let prBalanceNow = $t02926329879._2
757+ let virtSwapInAm = $t02926329879._3
758+ let virtSwapOutPr = $t02926329879._4
759+ let virtSwapInPr = $t02926329879._5
760+ let virtSwapOutAm = $t02926329879._6
763761 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
764762 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
765763 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
919917 let curPrice = r._3
920918 let lpAssetEmission = r._6
921919 let lpAssetId = r._7
922- let $t03474035049 = if ((paymentAssetId == amId))
920+ let $t03470635015 = if ((paymentAssetId == amId))
923921 then {
924922 let priceAssetAmount = fraction(paymentAmount, curPrice, scale8)
925923 $Tuple2(paymentAmount, priceAssetAmount)
928926 let amountAssetAmount = fraction(paymentAmount, scale8, curPrice)
929927 $Tuple2(amountAssetAmount, paymentAmount)
930928 }
931- let amountAssetAmount = $t03474035049._1
932- let priceAssetAmount = $t03474035049._2
929+ let amountAssetAmount = $t03470635015._1
930+ let priceAssetAmount = $t03470635015._2
933931 let lpAmtBoth = fraction(lpAssetEmission, priceAssetAmount, prBalance)
934932 let lpAssetPriceOne = if ((paymentAssetId == amId))
935933 then fraction(amountAssetAmount, scale8, estimLP)
10071005 let estimPrAmt = r._2
10081006 let amBalance = getAccBalance(amId)
10091007 let prBalance = getAccBalance(prId)
1010- let $t03833038790 = if ((outAssetId == amId))
1008+ let $t03829638756 = if ((outAssetId == amId))
10111009 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
10121010 else if ((outAssetId == prId))
10131011 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
10141012 else throw("wrong outAssetId")
1015- let amBalanceNow = $t03833038790._1
1016- let prBalanceNow = $t03833038790._2
1017- let virtSwapInAm = $t03833038790._3
1018- let virtSwapOutPr = $t03833038790._4
1019- let virtSwapInPr = $t03833038790._5
1020- let virtSwapOutAm = $t03833038790._6
1021- let totalGetRaw = $t03833038790._7
1013+ let amBalanceNow = $t03829638756._1
1014+ let prBalanceNow = $t03829638756._2
1015+ let virtSwapInAm = $t03829638756._3
1016+ let virtSwapOutPr = $t03829638756._4
1017+ let virtSwapInPr = $t03829638756._5
1018+ let virtSwapOutAm = $t03829638756._6
1019+ let totalGetRaw = $t03829638756._7
10221020 if (if ((0 > virtSwapInAm))
10231021 then true
10241022 else (0 > virtSwapInPr))
10331031 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
10341032 if ((finalRes == finalRes))
10351033 then {
1036- let $t03953739641 = if ((outAssetId == amId))
1034+ let $t03950339607 = if ((outAssetId == amId))
10371035 then $Tuple2(toInt(finalRes._2), 0)
10381036 else $Tuple2(0, toInt(finalRes._2))
1039- let outAm = $t03953739641._1
1040- let outPr = $t03953739641._2
1037+ let outAm = $t03950339607._1
1038+ let outPr = $t03950339607._2
10411039 let totalAmount = (outAm + outPr)
10421040 let feeAmount = (totalGetRaw - totalGet)
10431041 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
10691067
10701068 @Callable(i)
10711069 func getOneTknV2 (outAssetId,minOutAmount) = {
1072- let $t04066640821 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1073- let state = $t04066640821._1
1074- let totalAmount = $t04066640821._2
1070+ let $t04063240787 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1071+ let state = $t04063240787._1
1072+ let totalAmount = $t04063240787._2
10751073 $Tuple2(state, totalAmount)
10761074 }
10771075
10901088 let prBalance = getAccBalance(prId)
10911089 let amBalanceNow = (amBalance - estimAmAmt)
10921090 let prBalanceNow = (prBalance - estimPrAmt)
1093- let $t04133141602 = if ((outAssetId == amId))
1091+ let $t04129741568 = if ((outAssetId == amId))
10941092 then $Tuple3(prBalanceNow, amBalanceNow, estimPrAmt)
10951093 else if ((outAssetId == prId))
10961094 then $Tuple3(amBalanceNow, prBalanceNow, estimAmAmt)
10971095 else throw("wrong outAssetId")
1098- let amountBalanceForSwap = $t04133141602._1
1099- let priceBalanceForSwap = $t04133141602._2
1100- let amountToSwap = $t04133141602._3
1096+ let amountBalanceForSwap = $t04129741568._1
1097+ let priceBalanceForSwap = $t04129741568._2
1098+ let amountToSwap = $t04129741568._3
11011099 let yPrecision = 1
11021100 let exchResult = {
11031101 let @ = invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)
11081106 let totalGetRaw = (exchResult + (if ((outAssetId == amId))
11091107 then estimAmAmt
11101108 else estimPrAmt))
1111- let $t04217442223 = takeFee(totalGetRaw)
1112- let totalGet = $t04217442223._1
1113- let feeAmount = $t04217442223._2
1109+ let $t04214042189 = takeFee(totalGetRaw)
1110+ let totalGet = $t04214042189._1
1111+ let feeAmount = $t04214042189._2
11141112 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
11151113 }
11161114
11241122 let lpId = poolConfig[idxLPAsId]
11251123 let amBalance = getAccBalance(amId)
11261124 let prBalance = getAccBalance(prId)
1127- let $t04256742682 = {
1125+ let $t04253342648 = {
11281126 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11291127 if ($isInstanceOf(@, "(Int, Int)"))
11301128 then @
11311129 else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)) + " couldn't be cast to (Int, Int)"))
11321130 }
1133- let totalGet = $t04256742682._1
1134- let feeAmount = $t04256742682._2
1131+ let totalGet = $t04253342648._1
1132+ let feeAmount = $t04253342648._2
11351133 let r = ego("", lpId, lpAssetAmount, this)
11361134 let outAmAmt = r._1
11371135 let outPrAmt = r._2
12171215 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
12181216 if ((unstakeInv == unstakeInv))
12191217 then {
1220- let $t04510245290 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1221- let state = $t04510245290._1
1222- let totalAmount = $t04510245290._2
1218+ let $t04506845256 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1219+ let state = $t04506845256._1
1220+ let totalAmount = $t04506845256._2
12231221 $Tuple2(state, totalAmount)
12241222 }
12251223 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
9-
10-let thousand = 1000
119
1210 let zeroBigInt = toBigInt(0)
1311
1412 let oneBigInt = toBigInt(1)
1513
1614 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1715
1816 let Amult = "100"
1917
2018 let Dconv = "1"
2119
2220 let SEP = "__"
2321
2422 let EMPTY = ""
2523
2624 let PoolActive = 1
2725
2826 let PoolPutDis = 2
2927
3028 let PoolMatcherDis = 3
3129
3230 let PoolShutdown = 4
3331
3432 let idxPoolAddress = 1
3533
3634 let idxPoolSt = 2
3735
3836 let idxLPAsId = 3
3937
4038 let idxAmAsId = 4
4139
4240 let idxPrAsId = 5
4341
4442 let idxAmtAsDcm = 6
4543
4644 let idxPriceAsDcm = 7
4745
4846 let idxIAmtAsId = 8
4947
5048 let idxIPriceAsId = 9
5149
5250 let idxFactStakCntr = 1
5351
5452 let idxFactSlippCntr = 7
5553
5654 let idxFactGwxRewCntr = 10
5755
58-let feePermilleDefault = 0
56+let feeDefault = fraction(5, scale8, 10000)
5957
6058 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6159
6260
6361 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6462
6563
6664 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6765
6866
6967 func abs (val) = if ((zeroBigInt > val))
7068 then -(val)
7169 else val
7270
7371
7472 func fc () = "%s__factoryContract"
7573
7674
7775 func mpk () = "%s__managerPublicKey"
7876
7977
8078 func pmpk () = "%s__pendingManagerPublicKey"
8179
8280
8381 func pl () = "%s%s__price__last"
8482
8583
8684 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8785
8886
8987 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9088
9189
9290 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9391
9492
9593 func aa () = "%s__amountAsset"
9694
9795
9896 func pa () = "%s__priceAsset"
9997
10098
10199 func amp () = "%s__amp"
102100
103101
104102 func ada () = "%s__addonAddr"
105103
106104
107-let keyFeePermille = "%s__feePermille"
105+let keyFee = "%s__fee"
108106
109-let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
107+let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
110108
111109 func fcfg () = "%s__factoryConfig"
112110
113111
114112 func mtpk () = "%s%s__matcher__publicKey"
115113
116114
117115 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
118116
119117
120118 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
121119
122120
123121 func aps () = "%s__shutdown"
124122
125123
126124 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
127125
128126
129127 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
130128
131129
132130 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
133131
134132
135133 func str (val) = match val {
136134 case valStr: String =>
137135 valStr
138136 case _ =>
139137 throw("fail cast to String")
140138 }
141139
142140
143141 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
144142
145143
146144 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
147145
148146
149147 let fca = addressFromStringValue(strf(this, fc()))
150148
151149 let A = strf(this, amp())
152150
153151 func igs () = valueOrElse(getBoolean(fca, aps()), false)
154152
155153
156154 func mp () = fromBase58String(strf(fca, mtpk()))
157155
158156
159157 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
160158
161159 func gpc () = {
162160 let amtAs = strf(this, aa())
163161 let priceAs = strf(this, pa())
164162 let iPriceAs = intf(fca, mba(priceAs))
165163 let iAmtAs = intf(fca, mba(amtAs))
166164 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
167165 }
168166
169167
170168 func gfc () = split(strf(fca, fcfg()), SEP)
171169
172170
173171 let factoryConfig = gfc()
174172
175173 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
176174
177175 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
178176
179177 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
180178
181179 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
182180
183181
184182 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
185183
186184
187185 func getAccBalance (assetId) = if ((assetId == "WAVES"))
188186 then wavesBalance(this).available
189187 else assetBalance(this, fromBase58String(assetId))
190188
191189
192190 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
193191
194192
195193 func vad (A1,A2,slippage) = {
196194 let diff = fraction((A1 - A2), scale8BigInt, A2)
197195 let pass = ((slippage - abs(diff)) > zeroBigInt)
198196 if (!(pass))
199197 then throw(("Big slpg: " + toString(diff)))
200198 else $Tuple2(pass, min([A1, A2]))
201199 }
202200
203201
204202 func vd (D1,D0,slpg) = {
205203 let diff = fraction(D0, scale8BigInt, D1)
206204 let fail = (slpg > diff)
207205 if (if (fail)
208206 then true
209207 else (D0 > D1))
210208 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
211209 else fail
212210 }
213211
214212
215213 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
216214 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
217215 let prAsAmtX18 = t1(prAmt, prAssetDcm)
218216 cpbi(prAsAmtX18, amtAsAmtX18)
219217 }
220218
221219
222220 func calcPrices (amAmt,prAmt,lpAmt) = {
223221 let cfg = gpc()
224222 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
225223 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
226224 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
227225 let amAmtX18 = t1(amAmt, amtAsDcm)
228226 let prAmtX18 = t1(prAmt, prAsDcm)
229227 let lpAmtX18 = t1(lpAmt, scale8)
230228 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
231229 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
232230 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
233231 }
234232
235233
236234 func calculatePrices (amAmt,prAmt,lpAmt) = {
237235 let p = calcPrices(amAmt, prAmt, lpAmt)
238236 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
239237 }
240238
241239
242240 func takeFee (amount) = {
243- let fee = fraction(amount, feePermille, thousand)
244- $Tuple2((amount - fee), fee)
241+ let feeAmount = fraction(amount, fee, scale8)
242+ $Tuple2((amount - feeAmount), feeAmount)
245243 }
246244
247245
248246 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
249247 let cfg = gpc()
250248 let lpId = cfg[idxLPAsId]
251249 let amId = cfg[idxAmAsId]
252250 let prId = cfg[idxPrAsId]
253251 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
254252 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
255253 let sts = cfg[idxPoolSt]
256254 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
257255 if ((lpId != pmtAssetId))
258256 then throw("Wrong pmt asset")
259257 else {
260258 let amBalance = getAccBalance(amId)
261259 let amBalanceX18 = t1(amBalance, amDcm)
262260 let prBalance = getAccBalance(prId)
263261 let prBalanceX18 = t1(prBalance, prDcm)
264262 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
265263 let curPrice = f1(curPriceX18, scale8)
266264 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
267265 let lpEmissX18 = t1(lpEmiss, scale8)
268266 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
269267 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
270268 let outAmAmt = f1(outAmAmtX18, amDcm)
271269 let outPrAmt = f1(outPrAmtX18, prDcm)
272270 let state = if ((txId58 == ""))
273271 then nil
274272 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
275273 then unit
276274 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
277275 then unit
278276 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
279277 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
280278 }
281279 }
282280
283281
284282 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
285283 let cfg = gpc()
286284 let lpId = fromBase58String(cfg[idxLPAsId])
287285 let amIdStr = cfg[idxAmAsId]
288286 let prIdStr = cfg[idxPrAsId]
289287 let inAmIdStr = cfg[idxIAmtAsId]
290288 let inPrIdStr = cfg[idxIPriceAsId]
291289 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
292290 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
293291 let sts = cfg[idxPoolSt]
294292 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
295293 let amBalance = if (isEval)
296294 then getAccBalance(amIdStr)
297295 else if (if (isOneAsset)
298296 then (pmtId == amIdStr)
299297 else false)
300298 then (getAccBalance(amIdStr) - pmtAmt)
301299 else if (isOneAsset)
302300 then getAccBalance(amIdStr)
303301 else (getAccBalance(amIdStr) - inAmAmt)
304302 let prBalance = if (isEval)
305303 then getAccBalance(prIdStr)
306304 else if (if (isOneAsset)
307305 then (pmtId == prIdStr)
308306 else false)
309307 then (getAccBalance(prIdStr) - pmtAmt)
310308 else if (isOneAsset)
311309 then getAccBalance(prIdStr)
312310 else (getAccBalance(prIdStr) - inPrAmt)
313311 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
314312 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
315313 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
316314 let amBalanceX18 = t1(amBalance, amtDcm)
317315 let prBalanceX18 = t1(prBalance, priceDcm)
318316 let r = if ((lpEm == 0))
319317 then {
320318 let curPriceX18 = zeroBigInt
321319 let slippageX18 = zeroBigInt
322320 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
323321 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
324322 }
325323 else {
326324 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
327325 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
328326 let slippageX18 = t1(slippage, scale8)
329327 if (if (if (validateSlippage)
330328 then (curPriceX18 != zeroBigInt)
331329 else false)
332330 then (slippageRealX18 > slippageX18)
333331 else false)
334332 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
335333 else {
336334 let lpEmissionX18 = t1(lpEm, scale8)
337335 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
338336 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
339337 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
340338 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
341339 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
342340 let expAmtAssetAmtX18 = expectedAmts._1
343341 let expPriceAssetAmtX18 = expectedAmts._2
344342 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
345343 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
346344 }
347345 }
348346 let calcLpAmt = r._1
349347 let calcAmAssetPmt = r._2
350348 let calcPrAssetPmt = r._3
351349 let curPrice = f1(r._4, scale8)
352350 let slippageCalc = f1(r._5, scale8)
353351 if ((0 >= calcLpAmt))
354352 then throw("LP <= 0")
355353 else {
356354 let emitLpAmt = if (!(emitLp))
357355 then 0
358356 else calcLpAmt
359357 let amDiff = (inAmAmt - calcAmAssetPmt)
360358 let prDiff = (inPrAmt - calcPrAssetPmt)
361- let $t01627116616 = if (if (isOneAsset)
359+ let $t01623716582 = if (if (isOneAsset)
362360 then (pmtId == amIdStr)
363361 else false)
364362 then $Tuple2(pmtAmt, 0)
365363 else if (if (isOneAsset)
366364 then (pmtId == prIdStr)
367365 else false)
368366 then $Tuple2(0, pmtAmt)
369367 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
370- let writeAmAmt = $t01627116616._1
371- let writePrAmt = $t01627116616._2
368+ let writeAmAmt = $t01623716582._1
369+ let writePrAmt = $t01623716582._2
372370 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
373371 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
374372 }
375373 }
376374
377375
378376 func moa (order) = {
379377 let cfg = gpc()
380378 let amtAsId = cfg[idxAmAsId]
381379 let prAsId = cfg[idxPrAsId]
382380 let sts = parseIntValue(cfg[idxPoolSt])
383381 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
384382 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
385383 let accAmtAsBalance = getAccBalance(amtAsId)
386384 let accPrAsBalance = getAccBalance(prAsId)
387385 let curPriceX18 = if ((order.orderType == Buy))
388386 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
389387 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
390388 let curPrice = f1(curPriceX18, scale8)
391389 if (if (if (igs())
392390 then true
393391 else (sts == PoolMatcherDis))
394392 then true
395393 else (sts == PoolShutdown))
396394 then throw("Admin blocked")
397395 else {
398396 let orAmtAsset = order.assetPair.amountAsset
399397 let orAmtAsStr = if ((orAmtAsset == unit))
400398 then "WAVES"
401399 else toBase58String(value(orAmtAsset))
402400 let orPrAsset = order.assetPair.priceAsset
403401 let orPrAsStr = if ((orPrAsset == unit))
404402 then "WAVES"
405403 else toBase58String(value(orPrAsset))
406404 if (if ((orAmtAsStr != amtAsId))
407405 then true
408406 else (orPrAsStr != prAsId))
409407 then throw("Wr assets")
410408 else {
411409 let orderPrice = order.price
412410 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
413411 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
414412 let isOrderPriceValid = if ((order.orderType == Buy))
415413 then (curPrice >= castOrderPrice)
416414 else (castOrderPrice >= curPrice)
417415 true
418416 }
419417 }
420418 }
421419
422420
423421 func cg (i) = if ((size(i.payments) != 1))
424422 then throw("1 pmnt exp")
425423 else {
426424 let pmt = value(i.payments[0])
427425 let pmtAssetId = value(pmt.assetId)
428426 let pmtAmt = pmt.amount
429427 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
430428 let outAmAmt = r._1
431429 let outPrAmt = r._2
432430 let sts = parseIntValue(r._9)
433431 let state = r._10
434432 if (if (igs())
435433 then true
436434 else (sts == PoolShutdown))
437435 then throw(("Admin blocked: " + toString(sts)))
438436 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
439437 }
440438
441439
442440 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
443441 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
444442 let sts = parseIntValue(r._8)
445443 if (if (if (igs())
446444 then true
447445 else (sts == PoolPutDis))
448446 then true
449447 else (sts == PoolShutdown))
450448 then throw(("Blocked:" + toString(sts)))
451449 else r
452450 }
453451
454452
455453 func estimatePutOneTknV2 (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
456454 let poolConfig = gpc()
457455 let amId = poolConfig[idxAmAsId]
458456 let prId = poolConfig[idxPrAsId]
459457 let amBalance = getAccBalance(amId)
460458 let prBalance = getAccBalance(prId)
461- let $t02094220987 = takeFee(pmtAmtRaw)
462- let pmtAmt = $t02094220987._1
463- let feeAmount = $t02094220987._2
464- let $t02099121452 = if ((txId == ""))
459+ let $t02090820953 = takeFee(pmtAmtRaw)
460+ let pmtAmt = $t02090820953._1
461+ let feeAmount = $t02090820953._2
462+ let $t02095721418 = if ((txId == ""))
465463 then $Tuple2(amBalance, prBalance)
466464 else if ((pmtAssetId == amId))
467465 then if ((pmtAmtRaw > amBalance))
468466 then throw("invalid payment amount")
469467 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
470468 else if ((pmtAssetId == prId))
471469 then if ((pmtAmtRaw > prBalance))
472470 then throw("invalid payment amount")
473471 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
474472 else throw("wrong pmtAssetId")
475- let amBalanceNow = $t02099121452._1
476- let prBalanceNow = $t02099121452._2
477- let $t02145621590 = if ((pmtAssetId == amId))
473+ let amBalanceNow = $t02095721418._1
474+ let prBalanceNow = $t02095721418._2
475+ let $t02142221556 = if ((pmtAssetId == amId))
478476 then $Tuple2(amBalanceNow, prBalanceNow)
479477 else $Tuple2(prBalanceNow, amBalanceNow)
480- let amBalanceForCalc = $t02145621590._1
481- let prBalanceForCalc = $t02145621590._2
478+ let amBalanceForCalc = $t02142221556._1
479+ let prBalanceForCalc = $t02142221556._2
482480 let xPrecision = 1
483481 let result = {
484482 let @ = invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)
485483 if ($isInstanceOf(@, "(Int, Int)"))
486484 then @
487485 else throw(($getType(invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)) + " couldn't be cast to (Int, Int)"))
488486 }
489- let $t02205922155 = if ((pmtAssetId == amId))
487+ let $t02202522121 = if ((pmtAssetId == amId))
490488 then result
491489 else $Tuple2(result._2, result._1)
492- let amAssetPart = $t02205922155._1
493- let prAssetPart = $t02205922155._2
490+ let amAssetPart = $t02202522121._1
491+ let prAssetPart = $t02202522121._2
494492 let estPut = cp(userAddress, txId, AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), 0, true, true, false, pmtAmt, pmtAssetId)
495493 let estimLP = estPut._2
496494 let lpAssetId = estPut._7
497495 let state = estPut._9
498496 let amDiff = estPut._10
499497 let prDiff = estPut._11
500498 estPut
501499 }
502500
503501
504502 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
505503 then throw("1 pmnt expd")
506504 else {
507505 let poolConfig = gpc()
508506 let lpId = poolConfig[idxLPAsId]
509507 let amId = poolConfig[idxAmAsId]
510508 let prId = poolConfig[idxPrAsId]
511509 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
512510 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
513511 let poolStatus = poolConfig[idxPoolSt]
514512 let userAddress = if ((caller == this))
515513 then originCaller
516514 else caller
517515 let pmt = value(payments[0])
518516 let pmtAssetId = value(pmt.assetId)
519517 let pmtAmt = pmt.amount
520518 if ((1000000000 > pmtAmt))
521519 then throw("Min pmt 10 LP")
522520 else {
523521 let txId58 = toBase58String(transactionId)
524522 if ((lpId != toBase58String(pmtAssetId)))
525523 then throw("Wrong LP")
526524 else {
527525 let amBalance = getAccBalance(amId)
528526 let prBalance = getAccBalance(prId)
529- let $t02350723615 = {
527+ let $t02347323581 = {
530528 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
531529 if ($isInstanceOf(@, "(Int, Int)"))
532530 then @
533531 else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)) + " couldn't be cast to (Int, Int)"))
534532 }
535- let totalGet = $t02350723615._1
536- let feeAmount = $t02350723615._2
533+ let totalGet = $t02347323581._1
534+ let feeAmount = $t02347323581._2
537535 let totalAmount = if (if ((minOutAmount > 0))
538536 then (minOutAmount > totalGet)
539537 else false)
540538 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
541539 else totalGet
542- let $t02380223889 = if ((outAssetId == amId))
540+ let $t02376823855 = if ((outAssetId == amId))
543541 then $Tuple2(totalAmount, 0)
544542 else $Tuple2(0, totalAmount)
545- let outAm = $t02380223889._1
546- let outPr = $t02380223889._2
543+ let outAm = $t02376823855._1
544+ let outPr = $t02376823855._2
547545 let curPrX18 = cpbi(t1(prBalance, prDecimals), t1(amBalance, amDecimals))
548546 let curPr = f1(curPrX18, scale8)
549547 let state = [ScriptTransfer(userAddress, totalAmount, if ((outAssetId == "WAVES"))
550548 then unit
551549 else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
552550 if ((state == state))
553551 then {
554552 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
555553 if ((burn == burn))
556554 then $Tuple2(state, totalAmount)
557555 else throw("Strict value is not equal to itself.")
558556 }
559557 else throw("Strict value is not equal to itself.")
560558 }
561559 }
562560 }
563561
564562
565563 func m () = match getString(mpk()) {
566564 case s: String =>
567565 fromBase58String(s)
568566 case _: Unit =>
569567 unit
570568 case _ =>
571569 throw("Match error")
572570 }
573571
574572
575573 func pm () = match getString(pmpk()) {
576574 case s: String =>
577575 fromBase58String(s)
578576 case _: Unit =>
579577 unit
580578 case _ =>
581579 throw("Match error")
582580 }
583581
584582
585583 let pd = throw("Permission denied")
586584
587585 func mm (i) = match m() {
588586 case pk: ByteVector =>
589587 if ((i.callerPublicKey == pk))
590588 then true
591589 else pd
592590 case _: Unit =>
593591 if ((i.caller == this))
594592 then true
595593 else pd
596594 case _ =>
597595 throw("Match error")
598596 }
599597
600598
601599 @Callable(i)
602600 func constructor (fc) = {
603601 let c = mm(i)
604602 if ((c == c))
605603 then [StringEntry(fc(), fc)]
606604 else throw("Strict value is not equal to itself.")
607605 }
608606
609607
610608
611609 @Callable(i)
612610 func setManager (pendingManagerPublicKey) = {
613611 let c = mm(i)
614612 if ((c == c))
615613 then {
616614 let cm = fromBase58String(pendingManagerPublicKey)
617615 if ((cm == cm))
618616 then [StringEntry(pmpk(), pendingManagerPublicKey)]
619617 else throw("Strict value is not equal to itself.")
620618 }
621619 else throw("Strict value is not equal to itself.")
622620 }
623621
624622
625623
626624 @Callable(i)
627625 func confirmManager () = {
628626 let p = pm()
629627 let hpm = if (isDefined(p))
630628 then true
631629 else throw("No pending manager")
632630 if ((hpm == hpm))
633631 then {
634632 let cpm = if ((i.callerPublicKey == value(p)))
635633 then true
636634 else throw("You are not pending manager")
637635 if ((cpm == cpm))
638636 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
639637 else throw("Strict value is not equal to itself.")
640638 }
641639 else throw("Strict value is not equal to itself.")
642640 }
643641
644642
645643
646644 @Callable(i)
647645 func put (slip,autoStake) = {
648646 let factCfg = gfc()
649647 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
650648 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
651649 if ((0 > slip))
652650 then throw("Wrong slippage")
653651 else if ((size(i.payments) != 2))
654652 then throw("2 pmnts expd")
655653 else {
656654 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
657655 let emitLpAmt = e._2
658656 let lpAssetId = e._7
659657 let state = e._9
660658 let amDiff = e._10
661659 let prDiff = e._11
662660 let amId = e._12
663661 let prId = e._13
664662 let r = invoke(fca, "emit", [emitLpAmt], nil)
665663 if ((r == r))
666664 then {
667665 let el = match r {
668666 case legacy: Address =>
669667 invoke(legacy, "emit", [emitLpAmt], nil)
670668 case _ =>
671669 unit
672670 }
673671 if ((el == el))
674672 then {
675673 let sa = if ((amDiff > 0))
676674 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
677675 else nil
678676 if ((sa == sa))
679677 then {
680678 let sp = if ((prDiff > 0))
681679 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
682680 else nil
683681 if ((sp == sp))
684682 then {
685683 let lpTrnsfr = if (autoStake)
686684 then {
687685 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
688686 if ((ss == ss))
689687 then nil
690688 else throw("Strict value is not equal to itself.")
691689 }
692690 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
693691 (state ++ lpTrnsfr)
694692 }
695693 else throw("Strict value is not equal to itself.")
696694 }
697695 else throw("Strict value is not equal to itself.")
698696 }
699697 else throw("Strict value is not equal to itself.")
700698 }
701699 else throw("Strict value is not equal to itself.")
702700 }
703701 }
704702
705703
706704
707705 @Callable(i)
708706 func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
709707 let cfg = gfc()
710708 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
711709 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
712710 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
713711 let poolCfg = gpc()
714712 let amId = poolCfg[idxAmAsId]
715713 let prId = poolCfg[idxPrAsId]
716714 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
717715 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
718716 let addon = valueOrElse(getString(this, ada()), "")
719717 let userAddress = if ((addon == toString(i.caller)))
720718 then i.originCaller
721719 else i.caller
722720 if (if (if (if ((0 >= slippage))
723721 then true
724722 else (0 >= amAssetPart))
725723 then true
726724 else (0 >= prAssetPart))
727725 then true
728726 else (0 >= outLp))
729727 then throw("Wrong params")
730728 else if ((size(i.payments) != 1))
731729 then throw("1 pmnt expd")
732730 else {
733731 let pmt = value(i.payments[0])
734732 let pmtAssetId = toBase58String(value(pmt.assetId))
735733 let paymentAmountRaw = pmt.amount
736- let $t02908529137 = takeFee(paymentAmountRaw)
737- let pmtAmt = $t02908529137._1
738- let feeAmount = $t02908529137._2
734+ let $t02905129103 = takeFee(paymentAmountRaw)
735+ let pmtAmt = $t02905129103._1
736+ let feeAmount = $t02905129103._2
739737 if ((10000000 > paymentAmountRaw))
740738 then throw("Wrong pmt amt")
741739 else {
742740 let amBalance = getAccBalance(amId)
743741 let prBalance = getAccBalance(prId)
744- let $t02929729913 = if ((pmtAssetId == amId))
742+ let $t02926329879 = if ((pmtAssetId == amId))
745743 then if (if ((paymentAmountRaw > amBalance))
746744 then true
747745 else (amAssetPart > pmtAmt))
748746 then throw("invalid payment amount")
749747 else $Tuple6((amBalance - paymentAmountRaw), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
750748 else if ((pmtAssetId == prId))
751749 then if (if ((paymentAmountRaw > prBalance))
752750 then true
753751 else (prAssetPart > pmtAmt))
754752 then throw("invalid payment amount")
755753 else $Tuple6(amBalance, (prBalance - paymentAmountRaw), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
756754 else throw("wrong pmtAssetId")
757- let amBalanceNow = $t02929729913._1
758- let prBalanceNow = $t02929729913._2
759- let virtSwapInAm = $t02929729913._3
760- let virtSwapOutPr = $t02929729913._4
761- let virtSwapInPr = $t02929729913._5
762- let virtSwapOutAm = $t02929729913._6
755+ let amBalanceNow = $t02926329879._1
756+ let prBalanceNow = $t02926329879._2
757+ let virtSwapInAm = $t02926329879._3
758+ let virtSwapOutPr = $t02926329879._4
759+ let virtSwapInPr = $t02926329879._5
760+ let virtSwapOutAm = $t02926329879._6
763761 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
764762 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
765763 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
766764 if ((D0vsD1 == D0vsD1))
767765 then {
768766 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, true, pmtAmt, pmtAssetId)
769767 let estimLP = estPut._2
770768 let lpAssetId = estPut._7
771769 let state = estPut._9
772770 let amDiff = estPut._10
773771 let prDiff = estPut._11
774772 let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
775773 let emitLpAmt = toInt(lpCalcRes._2)
776774 let e = invoke(fca, "emit", [emitLpAmt], nil)
777775 if ((e == e))
778776 then {
779777 let el = match e {
780778 case legacy: Address =>
781779 invoke(legacy, "emit", [emitLpAmt], nil)
782780 case _ =>
783781 unit
784782 }
785783 if ((el == el))
786784 then {
787785 let sa = if ((amDiff > 0))
788786 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
789787 else nil
790788 if ((sa == sa))
791789 then {
792790 let sp = if ((prDiff > 0))
793791 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
794792 else nil
795793 if ((sp == sp))
796794 then {
797795 let lpTrnsfr = if (autoStake)
798796 then {
799797 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
800798 if ((ss == ss))
801799 then nil
802800 else throw("Strict value is not equal to itself.")
803801 }
804802 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
805803 let sendFeeToMatcher = if ((feeAmount > 0))
806804 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
807805 else nil
808806 ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
809807 }
810808 else throw("Strict value is not equal to itself.")
811809 }
812810 else throw("Strict value is not equal to itself.")
813811 }
814812 else throw("Strict value is not equal to itself.")
815813 }
816814 else throw("Strict value is not equal to itself.")
817815 }
818816 else throw("Strict value is not equal to itself.")
819817 }
820818 }
821819 }
822820
823821
824822
825823 @Callable(i)
826824 func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
827825 then throw("1 pmnt expd")
828826 else {
829827 let poolConfig = gpc()
830828 let amId = poolConfig[idxAmAsId]
831829 let prId = poolConfig[idxPrAsId]
832830 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
833831 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
834832 let userAddress = if ((i.caller == this))
835833 then i.originCaller
836834 else i.caller
837835 let pmt = value(i.payments[0])
838836 let pmtAssetId = toBase58String(value(pmt.assetId))
839837 let pmtAmt = pmt.amount
840838 if ((10000000 > pmtAmt))
841839 then throw("Wrong pmt amt")
842840 else {
843841 let r = estimatePutOneTknV2(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
844842 let estimLP = r._2
845843 let lpAssetId = r._7
846844 let state = r._9
847845 let amDiff = r._10
848846 let prDiff = r._11
849847 let emitLpAmt = if (if ((minOutAmount > 0))
850848 then (minOutAmount > estimLP)
851849 else false)
852850 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
853851 else estimLP
854852 let e = invoke(fca, "emit", [emitLpAmt], nil)
855853 if ((e == e))
856854 then {
857855 let el = match e {
858856 case legacy: Address =>
859857 invoke(legacy, "emit", [emitLpAmt], nil)
860858 case _ =>
861859 unit
862860 }
863861 if ((el == el))
864862 then {
865863 let sa = if ((amDiff > 0))
866864 then invoke(slipageContract, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
867865 else nil
868866 if ((sa == sa))
869867 then {
870868 let sp = if ((prDiff > 0))
871869 then invoke(slipageContract, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
872870 else nil
873871 if ((sp == sp))
874872 then {
875873 let lpTrnsfr = if (autoStake)
876874 then {
877875 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
878876 if ((ss == ss))
879877 then nil
880878 else throw("Strict value is not equal to itself.")
881879 }
882880 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
883881 $Tuple2((state ++ lpTrnsfr), emitLpAmt)
884882 }
885883 else throw("Strict value is not equal to itself.")
886884 }
887885 else throw("Strict value is not equal to itself.")
888886 }
889887 else throw("Strict value is not equal to itself.")
890888 }
891889 else throw("Strict value is not equal to itself.")
892890 }
893891 }
894892
895893
896894
897895 @Callable(i)
898896 func putOneTknV2READONLY (paymentAmount,paymentAssetId) = {
899897 let r = estimatePutOneTknV2(paymentAmount, paymentAssetId, "", "")
900898 let estimLP = r._2
901899 let lpAssetId = r._7
902900 let state = r._9
903901 let amDiff = r._10
904902 let prDiff = r._11
905903 $Tuple2(nil, estimLP)
906904 }
907905
908906
909907
910908 @Callable(i)
911909 func putOneTknV2WithBonusREADONLY (paymentAmount,paymentAssetId) = {
912910 let poolConfig = gpc()
913911 let amId = poolConfig[idxAmAsId]
914912 let prId = poolConfig[idxPrAsId]
915913 let amBalance = getAccBalance(amId)
916914 let prBalance = getAccBalance(prId)
917915 let r = estimatePutOneTknV2(paymentAmount, paymentAssetId, "", "")
918916 let estimLP = r._2
919917 let curPrice = r._3
920918 let lpAssetEmission = r._6
921919 let lpAssetId = r._7
922- let $t03474035049 = if ((paymentAssetId == amId))
920+ let $t03470635015 = if ((paymentAssetId == amId))
923921 then {
924922 let priceAssetAmount = fraction(paymentAmount, curPrice, scale8)
925923 $Tuple2(paymentAmount, priceAssetAmount)
926924 }
927925 else {
928926 let amountAssetAmount = fraction(paymentAmount, scale8, curPrice)
929927 $Tuple2(amountAssetAmount, paymentAmount)
930928 }
931- let amountAssetAmount = $t03474035049._1
932- let priceAssetAmount = $t03474035049._2
929+ let amountAssetAmount = $t03470635015._1
930+ let priceAssetAmount = $t03470635015._2
933931 let lpAmtBoth = fraction(lpAssetEmission, priceAssetAmount, prBalance)
934932 let lpAssetPriceOne = if ((paymentAssetId == amId))
935933 then fraction(amountAssetAmount, scale8, estimLP)
936934 else fraction(priceAssetAmount, scale8, estimLP)
937935 let lpAssetPriceBoth = fraction((priceAssetAmount + amountAssetAmount), scale8, lpAmtBoth)
938936 let bonus = fraction((lpAssetPriceBoth - lpAssetPriceOne), scale8, lpAssetPriceOne)
939937 let feeAmount = takeFee(paymentAmount)._2
940938 $Tuple2(nil, $Tuple3(estimLP, feeAmount, bonus))
941939 }
942940
943941
944942
945943 @Callable(i)
946944 func putForFree (maxSlpg) = if ((0 > maxSlpg))
947945 then throw("Wrong slpg")
948946 else if ((size(i.payments) != 2))
949947 then throw("2 pmnts expd")
950948 else {
951949 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
952950 estPut._9
953951 }
954952
955953
956954
957955 @Callable(i)
958956 func get () = {
959957 let r = cg(i)
960958 let outAmtAmt = r._1
961959 let outPrAmt = r._2
962960 let pmtAmt = r._3
963961 let pmtAssetId = r._4
964962 let state = r._5
965963 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
966964 if ((b == b))
967965 then state
968966 else throw("Strict value is not equal to itself.")
969967 }
970968
971969
972970
973971 @Callable(i)
974972 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
975973 then throw("1 pmnt expd")
976974 else {
977975 let cfg = gpc()
978976 let lpId = cfg[idxLPAsId]
979977 let amId = cfg[idxAmAsId]
980978 let prId = cfg[idxPrAsId]
981979 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
982980 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
983981 let sts = cfg[idxPoolSt]
984982 let factCfg = gfc()
985983 let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
986984 let pmt = value(i.payments[0])
987985 let addon = valueOrElse(getString(this, ada()), "")
988986 let userAddress = if ((addon == toString(i.caller)))
989987 then i.originCaller
990988 else i.caller
991989 let txId58 = toBase58String(i.transactionId)
992990 let pmtAssetId = value(pmt.assetId)
993991 let pmtAmt = pmt.amount
994992 if ((1000000000 > pmtAmt))
995993 then throw("Min pmt 10 LP")
996994 else if (if (if ((0 > slippage))
997995 then true
998996 else (0 > exchResult))
999997 then true
1000998 else (0 > outAmount))
1001999 then throw("Wrong params")
10021000 else if ((lpId != toBase58String(pmtAssetId)))
10031001 then throw("Wrong LP")
10041002 else {
10051003 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
10061004 let estimAmAmt = r._1
10071005 let estimPrAmt = r._2
10081006 let amBalance = getAccBalance(amId)
10091007 let prBalance = getAccBalance(prId)
1010- let $t03833038790 = if ((outAssetId == amId))
1008+ let $t03829638756 = if ((outAssetId == amId))
10111009 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
10121010 else if ((outAssetId == prId))
10131011 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
10141012 else throw("wrong outAssetId")
1015- let amBalanceNow = $t03833038790._1
1016- let prBalanceNow = $t03833038790._2
1017- let virtSwapInAm = $t03833038790._3
1018- let virtSwapOutPr = $t03833038790._4
1019- let virtSwapInPr = $t03833038790._5
1020- let virtSwapOutAm = $t03833038790._6
1021- let totalGetRaw = $t03833038790._7
1013+ let amBalanceNow = $t03829638756._1
1014+ let prBalanceNow = $t03829638756._2
1015+ let virtSwapInAm = $t03829638756._3
1016+ let virtSwapOutPr = $t03829638756._4
1017+ let virtSwapInPr = $t03829638756._5
1018+ let virtSwapOutAm = $t03829638756._6
1019+ let totalGetRaw = $t03829638756._7
10221020 if (if ((0 > virtSwapInAm))
10231021 then true
10241022 else (0 > virtSwapInPr))
10251023 then throw("Wrong calc")
10261024 else {
10271025 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
10281026 let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
10291027 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
10301028 if ((D0vsD1 == D0vsD1))
10311029 then {
10321030 let totalGet = takeFee(totalGetRaw)._1
10331031 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
10341032 if ((finalRes == finalRes))
10351033 then {
1036- let $t03953739641 = if ((outAssetId == amId))
1034+ let $t03950339607 = if ((outAssetId == amId))
10371035 then $Tuple2(toInt(finalRes._2), 0)
10381036 else $Tuple2(0, toInt(finalRes._2))
1039- let outAm = $t03953739641._1
1040- let outPr = $t03953739641._2
1037+ let outAm = $t03950339607._1
1038+ let outPr = $t03950339607._2
10411039 let totalAmount = (outAm + outPr)
10421040 let feeAmount = (totalGetRaw - totalGet)
10431041 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
10441042 then unit
10451043 else fromBase58String(outAssetId)
10461044 let sendFeeToMatcher = if ((feeAmount > 0))
10471045 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
10481046 else nil
10491047 let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
10501048 let curPr = f1(curPrX18, scale8)
10511049 let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
10521050 if ((state == state))
10531051 then {
10541052 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10551053 if ((burn == burn))
10561054 then (state ++ sendFeeToMatcher)
10571055 else throw("Strict value is not equal to itself.")
10581056 }
10591057 else throw("Strict value is not equal to itself.")
10601058 }
10611059 else throw("Strict value is not equal to itself.")
10621060 }
10631061 else throw("Strict value is not equal to itself.")
10641062 }
10651063 }
10661064 }
10671065
10681066
10691067
10701068 @Callable(i)
10711069 func getOneTknV2 (outAssetId,minOutAmount) = {
1072- let $t04066640821 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1073- let state = $t04066640821._1
1074- let totalAmount = $t04066640821._2
1070+ let $t04063240787 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1071+ let state = $t04063240787._1
1072+ let totalAmount = $t04063240787._2
10751073 $Tuple2(state, totalAmount)
10761074 }
10771075
10781076
10791077
10801078 @Callable(i)
10811079 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
10821080 let poolConfig = gpc()
10831081 let lpId = poolConfig[idxLPAsId]
10841082 let amId = poolConfig[idxAmAsId]
10851083 let prId = poolConfig[idxPrAsId]
10861084 let r = ego("", lpId, lpAssetAmount, this)
10871085 let estimAmAmt = r._1
10881086 let estimPrAmt = r._2
10891087 let amBalance = getAccBalance(amId)
10901088 let prBalance = getAccBalance(prId)
10911089 let amBalanceNow = (amBalance - estimAmAmt)
10921090 let prBalanceNow = (prBalance - estimPrAmt)
1093- let $t04133141602 = if ((outAssetId == amId))
1091+ let $t04129741568 = if ((outAssetId == amId))
10941092 then $Tuple3(prBalanceNow, amBalanceNow, estimPrAmt)
10951093 else if ((outAssetId == prId))
10961094 then $Tuple3(amBalanceNow, prBalanceNow, estimAmAmt)
10971095 else throw("wrong outAssetId")
1098- let amountBalanceForSwap = $t04133141602._1
1099- let priceBalanceForSwap = $t04133141602._2
1100- let amountToSwap = $t04133141602._3
1096+ let amountBalanceForSwap = $t04129741568._1
1097+ let priceBalanceForSwap = $t04129741568._2
1098+ let amountToSwap = $t04129741568._3
11011099 let yPrecision = 1
11021100 let exchResult = {
11031101 let @ = invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)
11041102 if ($isInstanceOf(@, "Int"))
11051103 then @
11061104 else throw(($getType(invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)) + " couldn't be cast to Int"))
11071105 }
11081106 let totalGetRaw = (exchResult + (if ((outAssetId == amId))
11091107 then estimAmAmt
11101108 else estimPrAmt))
1111- let $t04217442223 = takeFee(totalGetRaw)
1112- let totalGet = $t04217442223._1
1113- let feeAmount = $t04217442223._2
1109+ let $t04214042189 = takeFee(totalGetRaw)
1110+ let totalGet = $t04214042189._1
1111+ let feeAmount = $t04214042189._2
11141112 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
11151113 }
11161114
11171115
11181116
11191117 @Callable(i)
11201118 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
11211119 let poolConfig = gpc()
11221120 let amId = poolConfig[idxAmAsId]
11231121 let prId = poolConfig[idxPrAsId]
11241122 let lpId = poolConfig[idxLPAsId]
11251123 let amBalance = getAccBalance(amId)
11261124 let prBalance = getAccBalance(prId)
1127- let $t04256742682 = {
1125+ let $t04253342648 = {
11281126 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11291127 if ($isInstanceOf(@, "(Int, Int)"))
11301128 then @
11311129 else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)) + " couldn't be cast to (Int, Int)"))
11321130 }
1133- let totalGet = $t04256742682._1
1134- let feeAmount = $t04256742682._2
1131+ let totalGet = $t04253342648._1
1132+ let feeAmount = $t04253342648._2
11351133 let r = ego("", lpId, lpAssetAmount, this)
11361134 let outAmAmt = r._1
11371135 let outPrAmt = r._2
11381136 let lpAssetPriceOne = fraction(totalGet, scale8, lpAssetAmount)
11391137 let lpAssetPriceBoth = fraction((outAmAmt + outPrAmt), scale8, lpAssetAmount)
11401138 let bonus = fraction((lpAssetPriceOne - lpAssetPriceBoth), scale8, lpAssetPriceBoth)
11411139 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
11421140 }
11431141
11441142
11451143
11461144 @Callable(i)
11471145 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
11481146 let r = cg(i)
11491147 let outAmAmt = r._1
11501148 let outPrAmt = r._2
11511149 let pmtAmt = r._3
11521150 let pmtAssetId = r._4
11531151 let state = r._5
11541152 if ((noLessThenAmtAsset > outAmAmt))
11551153 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
11561154 else if ((noLessThenPriceAsset > outPrAmt))
11571155 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
11581156 else {
11591157 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11601158 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
11611159 then state
11621160 else throw("Strict value is not equal to itself.")
11631161 }
11641162 }
11651163
11661164
11671165
11681166 @Callable(i)
11691167 func unstakeAndGet (amount) = {
11701168 let checkPayments = if ((size(i.payments) != 0))
11711169 then throw("No pmnts expd")
11721170 else true
11731171 if ((checkPayments == checkPayments))
11741172 then {
11751173 let cfg = gpc()
11761174 let factoryCfg = gfc()
11771175 let lpAssetId = fromBase58String(cfg[idxLPAsId])
11781176 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
11791177 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
11801178 if ((unstakeInv == unstakeInv))
11811179 then {
11821180 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
11831181 let sts = parseIntValue(r._9)
11841182 let state = r._10
11851183 let v = if (if (igs())
11861184 then true
11871185 else (sts == PoolShutdown))
11881186 then throw(("Blocked: " + toString(sts)))
11891187 else true
11901188 if ((v == v))
11911189 then {
11921190 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
11931191 if ((burnA == burnA))
11941192 then state
11951193 else throw("Strict value is not equal to itself.")
11961194 }
11971195 else throw("Strict value is not equal to itself.")
11981196 }
11991197 else throw("Strict value is not equal to itself.")
12001198 }
12011199 else throw("Strict value is not equal to itself.")
12021200 }
12031201
12041202
12051203
12061204 @Callable(i)
12071205 func unstakeAndGetOneTkn (unstakeAmount,outAssetId,minOutAmount) = {
12081206 let checkPayments = if ((size(i.payments) != 0))
12091207 then throw("No pmnts expd")
12101208 else true
12111209 if ((checkPayments == checkPayments))
12121210 then {
12131211 let cfg = gpc()
12141212 let factoryCfg = gfc()
12151213 let lpAssetId = fromBase58String(cfg[idxLPAsId])
12161214 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
12171215 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
12181216 if ((unstakeInv == unstakeInv))
12191217 then {
1220- let $t04510245290 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1221- let state = $t04510245290._1
1222- let totalAmount = $t04510245290._2
1218+ let $t04506845256 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1219+ let state = $t04506845256._1
1220+ let totalAmount = $t04506845256._2
12231221 $Tuple2(state, totalAmount)
12241222 }
12251223 else throw("Strict value is not equal to itself.")
12261224 }
12271225 else throw("Strict value is not equal to itself.")
12281226 }
12291227
12301228
12311229
12321230 @Callable(i)
12331231 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
12341232 then throw("denied")
12351233 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
12361234
12371235
12381236
12391237 @Callable(i)
12401238 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
12411239 then pd
12421240 else [StringEntry(k, v)]
12431241
12441242
12451243
12461244 @Callable(i)
12471245 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
12481246 then pd
12491247 else [IntegerEntry(k, v)]
12501248
12511249
12521250
12531251 @Callable(i)
12541252 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
12551253
12561254
12571255
12581256 @Callable(i)
12591257 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
12601258
12611259
12621260
12631261 @Callable(i)
12641262 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
12651263 let pr = calcPrices(amAmt, prAmt, lpAmt)
12661264 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
12671265 }
12681266
12691267
12701268
12711269 @Callable(i)
12721270 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
12731271
12741272
12751273
12761274 @Callable(i)
12771275 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
12781276
12791277
12801278
12811279 @Callable(i)
12821280 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
12831281
12841282
12851283
12861284 @Callable(i)
12871285 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
12881286
12891287
12901288
12911289 @Callable(i)
12921290 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
12931291 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
12941292 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
12951293 }
12961294
12971295
12981296 @Verifier(tx)
12991297 func verify () = {
13001298 let targetPublicKey = match m() {
13011299 case pk: ByteVector =>
13021300 pk
13031301 case _: Unit =>
13041302 tx.senderPublicKey
13051303 case _ =>
13061304 throw("Match error")
13071305 }
13081306 match tx {
13091307 case order: Order =>
13101308 let matcherPub = mp()
13111309 let orderValid = moa(order)
13121310 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
13131311 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
13141312 if (if (if (orderValid)
13151313 then senderValid
13161314 else false)
13171315 then matcherValid
13181316 else false)
13191317 then true
13201318 else toe(orderValid, senderValid, matcherValid)
13211319 case s: SetScriptTransaction =>
13221320 let newHash = blake2b256(value(s.script))
13231321 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
13241322 let currentHash = scriptHash(this)
13251323 if (if ((allowedHash == newHash))
13261324 then (currentHash != newHash)
13271325 else false)
13281326 then true
13291327 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
13301328 case _ =>
13311329 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
13321330 }
13331331 }
13341332

github/deemru/w8io/169f3d6 
147.08 ms