tx · 3DQHma3FtSeAyGZBRtGQdyq4gWhkMW8ymmdYgpL2SFxh

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.03400000 Waves

2023.01.26 14:16 [2421866] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "3DQHma3FtSeAyGZBRtGQdyq4gWhkMW8ymmdYgpL2SFxh", "fee": 3400000, "feeAssetId": null, "timestamp": 1674731776205, "version": 1, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "zprGETLKeJfF4CC8S3MiaPzt9EY7ouNmEbvuBVoBLd8jEvAU2mgHKFrpgorTTHFgMERs2BBnxVpTuLCQcDXmSPC" ], "script": "base64:BgLpIwgCEgQKAgEEEgYKBAEEAQgSAwoBCBIDCgEIEgASBAoCAQQSBAoCAQQSAwoBARIAEgQKAggBEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIIgZzY2FsZTgiDHNjYWxlOEJpZ0ludCIHc2NhbGUxOCIKemVyb0JpZ0ludCIEYmlnMCIEYmlnMSIEYmlnMiIKc2xpcHBhZ2U0RCILd2F2ZXNTdHJpbmciBUFtdWx0IgVEY29udiIDU0VQIgVFTVBUWSIKUG9vbEFjdGl2ZSIKUG9vbFB1dERpcyIOUG9vbE1hdGNoZXJEaXMiDFBvb2xTaHV0ZG93biIOaWR4UG9vbEFkZHJlc3MiCWlkeFBvb2xTdCIJaWR4TFBBc0lkIglpZHhBbUFzSWQiCWlkeFByQXNJZCILaWR4QW10QXNEY20iDWlkeFByaWNlQXNEY20iC2lkeElBbXRBc0lkIg1pZHhJUHJpY2VBc0lkIg9pZHhGYWN0U3Rha0NudHIiEmlkeEZhY3RvcnlSZXN0Q250ciIQaWR4RmFjdFNsaXBwQ250ciIRaWR4RmFjdEd3eFJld0NudHIiCmZlZURlZmF1bHQiAnQxIgdvcmlnVmFsIg1vcmlnU2NhbGVNdWx0IgJmMSIDdmFsIg9yZXN1bHRTY2FsZU11bHQiAnRzIgNhbXQiCHJlc1NjYWxlIghjdXJTY2FsZSIDYWJzIglhYnNCaWdJbnQiAmZjIgNtcGsiBHBtcGsiAnBsIgJwaCIBaCIBdCIDcGF1IgJ1YSIEdHhJZCIDZ2F1IgJhYSICcGEiA2FtcCIDYWRhIgxzd2FwQ29udHJhY3QiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIDZmNhIgVpbkZlZSIBQCIGb3V0RmVlIgFBIgNpZ3MiAm1wIhNmZWVDb2xsZWN0b3JBZGRyZXNzIgNncGMiBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIMcGFyc2VBc3NldElkIgVpbnB1dCIPYXNzZXRJZFRvU3RyaW5nIg9wYXJzZVBvb2xDb25maWciCnBvb2xDb25maWciEHBvb2xDb25maWdQYXJzZWQiCyR0MDY5NTI3MTM4Ig5jZmdQb29sQWRkcmVzcyINY2ZnUG9vbFN0YXR1cyIMY2ZnTHBBc3NldElkIhBjZmdBbW91bnRBc3NldElkIg9jZmdQcmljZUFzc2V0SWQiFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMiFWNmZ1ByaWNlQXNzZXREZWNpbWFscyIDZ2ZjIg1mYWN0b3J5Q29uZmlnIg9zdGFraW5nQ29udHJhY3QiD3NsaXBhZ2VDb250cmFjdCILZ3d4Q29udHJhY3QiDHJlc3RDb250cmFjdCIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIEY3BiaSIIcHJBbXRYMTgiCGFtQW10WDE4IgN2YWQiAkExIgJBMiIIc2xpcHBhZ2UiBGRpZmYiBHBhc3MiAnZkIgJEMSICRDAiBHNscGciBGZhaWwiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiA2ZlZSIJZmVlQW1vdW50IgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMTc2MDUxNzk1MCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiA21vYSIFb3JkZXIiB2FtdEFzSWQiBnByQXNJZCIPYWNjQW10QXNCYWxhbmNlIg5hY2NQckFzQmFsYW5jZSIKb3JBbXRBc3NldCIKb3JBbXRBc1N0ciIJb3JQckFzc2V0IglvclByQXNTdHIiCm9yZGVyUHJpY2UiDmNhc3RPcmRlclByaWNlIhFpc09yZGVyUHJpY2VWYWxpZCICY2ciAWkiA3BtdCICY3AiBmNhbGxlciIHYW1Bc1BtdCIHcHJBc1BtdCIEZ2V0RCICeHAiAW4iA3hwMCIDeHAxIgphUHJlY2lzaW9uIgFhIgFzIgNhbm4iC3hwMF94cDFfbl9uIhBhbm5fc19hUHJlY2lzaW9uIg5hbm5fYVByZWNpc2lvbiICbjEiBGNhbGMiA2FjYyIDY3VyIg0kdDAyMjUwMjIyNTIyIgFkIgVmb3VuZCICZHAiBWROZXh0IgVkRGlmZiIDYXJyIg0kdDAyMjk0MzIyOTkwIgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIFZ2V0WUQiAUQiAXgiAWMiAWIiDSR0MDIzNDkwMjM1MTAiAXkiBXlOZXh0IgV5RGlmZiINJHQwMjM4MTcyMzg2NCINY2FsY1B1dE9uZVRrbiIJcG10QW10UmF3Igt3aXRoVGFrZUZlZSIPbHBBc3NldEVtaXNzaW9uIg1jaGVjaEVtaXNzaW9uIg0kdDAyNDY0NzI1MTA5IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjUxMTUyNTI5MSILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3Ig0kdDAyNTI5NTI1NTQ5IghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAyNzU1MTI3NjYyIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDI3ODUyMjgxNTkiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiIBbSICcG0iAnBkIglpc01hbmFnZXIiAnBrIgJtbSIEZ2V0WSIJaXNSZXZlcnNlIhNwb29sQW1vdW50SW5CYWxhbmNlIg0kdDAzMDI5MTMwMzExIg0kdDAzMDY0MjMwNjg5Ig1jbGVhbkFtb3VudEluIg0kdDAzMDkxMDMxNTA2Ighhc3NldE91dCICZHkiC3RvdGFsR2V0UmF3IgxhbW91bnRPdXRNaW4iCWFkZHJlc3NUbyIGY2hlY2tzIgdhc3NldEluIg0kdDAzMjU2NDMyOTU4IghjaGVja01pbiIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiAmNtIgNocG0iA2NwbSIEc2xpcCIJYXV0b1N0YWtlIgdmYWN0Q2ZnIgtzdGFraW5nQ250ciIIc2xpcENudHIiAWUiCWxwQXNzZXRJZCICZWwiBmxlZ2FjeSICc2EiAnNwIghscFRybnNmciICc3MiIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIg1pc1B1dERpc2FibGVkIg0kdDAzNzc3NzM3OTM1Igdlc3RpbUxQIgdtYXhTbHBnIgZlc3RQdXQiCW91dEFtdEFtdCINaXNHZXREaXNhYmxlZCINJHQwNDA1NTc0MDcxMiINbHBBc3NldEFtb3VudCIKbHBFbWlzc2lvbiIFaW5kZXgiBG5ld1kiDSR0MDQxNTAyNDE1NTciDSR0MDQxOTAyNDIwMTciDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDQ1ODU1NDYwNDMiEHBheW1lbnRBbW91bnRSYXciDnBheW1lbnRBc3NldElkIg0kdDA0NjMwMjQ2NDA1Ig0kdDA0NjY4NDQ2Nzg4IghhbXRBc1N0ciIHcHJBc1N0ciIBayICcHIiDHJlc1NjYWxlTXVsdCIHdXNyQWRkciIHcG10QXNJZCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIgpvcmRlclZhbGlkIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2hvAAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBCQBlAgUBYQkAaQIJAGgCBQFhAAEFAWEAAWkCBVdBVkVTAAFqAgMxMDAAAWsCATEAAWwCAl9fAAFtAgAAAW4AAQABbwACAAFwAAMAAXEABAABcgABAAFzAAIAAXQAAwABdQAEAAF2AAUAAXcABgABeAAHAAF5AAgAAXoACQABQQABAAFCAAYAAUMABwABRAAKAAFFCQBrAwAKBQFhAJBOAQFGAgFHAUgJALwCAwkAtgIBBQFHBQFjCQC2AgEFAUgBAUkCAUoBSwkAoAMBCQC8AgMFAUoJALYCAQUBSwUBYwEBTAMBTQFOAU8JAGsDBQFNBQFOBQFPAQFQAQFKAwkAvwICBQFkBQFKCQC+AgEFAUoFAUoBAVEBAUoDCQC/AgIFAWQFAUoJAL4CAQUBSgUBSgEBUgACEyVzX19mYWN0b3J5Q29udHJhY3QBAVMAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBVQACESVzJXNfX3ByaWNlX19sYXN0AQFWAgFXAVgJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFXCQDMCAIJAKQDAQUBWAUDbmlsBQFsAQFZAgFaAmFhCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBWgICX18FAmFhAQJhYgIBWgJhYQkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAVoCAl9fBQJhYQECYWMAAg8lc19fYW1vdW50QXNzZXQBAmFkAAIOJXNfX3ByaWNlQXNzZXQBAmFlAAIHJXNfX2FtcAECYWYAAg0lc19fYWRkb25BZGRyAQJhZwACECVzX19zd2FwQ29udHJhY3QBAmFoAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFpAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhagICYWsCYWwJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFrAgJfXwUCYWwCCF9fY29uZmlnAQJhbQECYW4JAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYW4BAmFvAAIMJXNfX3NodXRkb3duAQJhcAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhcQACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhcgMCYXMCYXQCYXUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUCYXMCCyBzbmRyVmFsaWQ9CQClAwEFAmF0AgwgbXRjaHJWYWxpZD0JAKUDAQUCYXUBAmF2AQFKBAJhdwUBSgMJAAECBQJhdwIGU3RyaW5nBAJheAUCYXcFAmF4CQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXkCAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUICAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUMBAmFECQACAQkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhRAUDbmlsAgEgAAJhRQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmF5AgUEdGhpcwkBAVIAAAJhRgoAAmFHCQD8BwQFAmFFAhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYUcCA0ludAUCYUcJAAIBCQCsAgIJAAMBBQJhRwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAJhSAoAAmFHCQD8BwQFAmFFAhFnZXRPdXRGZWVSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFHAgNJbnQFAmFHCQACAQkArAICCQADAQUCYUcCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAACYUkJAQJheQIFBHRoaXMJAQJhZQABAmFKAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhRQkBAmFvAAcBAmFLAAkA2QQBCQECYXkCBQJhRQkBAmFpAAACYUwJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFAmFFCQECYXEAAQJhTQAEAmFOCQECYXkCBQR0aGlzCQECYWMABAJhTwkBAmF5AgUEdGhpcwkBAmFkAAQCYVAJAQJhQgIFAmFFCQECYW0BBQJhTwQCYWsJAQJhQgIFAmFFCQECYW0BBQJhTgkAtQkCCQECYXkCBQJhRQkBAmFqAgkApAMBBQJhawkApAMBBQJhUAUBbAECYVEBAmFSAwkAAAIFAmFSBQFpBQR1bml0CQDZBAEFAmFSAQJhUwECYVIDCQAAAgUCYVIFBHVuaXQFAWkJANgEAQkBBXZhbHVlAQUCYVIBAmFUAQJhVQkAmQoHCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFVBQFyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVUFAXMJANkEAQkAkQMCBQJhVQUBdAkBAmFRAQkAkQMCBQJhVQUBdQkBAmFRAQkAkQMCBQJhVQUBdgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFVBQF3CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVUFAXgAAmFWCQECYVQBCQECYU0AAAJhVwUCYVYAAmFYCAUCYVcCXzEAAmFZCAUCYVcCXzIAAmFaCAUCYVcCXzMAAmJhCAUCYVcCXzQAAmJiCAUCYVcCXzUAAmJjCAUCYVcCXzYAAmJkCAUCYVcCXzcBAmJlAAkAtQkCCQECYXkCBQJhRQkBAmFoAAUBbAACYmYJAQJiZQAAAmJnCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiZgUBQQIgSW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MAAmJoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiZgUBQwIgSW52YWxpZCBzbGlwYWdlIGNvbnRyYWN0IGFkZHJlc3MAAmJpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiZgUBRAIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwACYmoJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJmBQFCAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAQJiawoCYmwCYm0CYm4CYm8CYnACYnECYnICYnMCYnQCYnUJALkJAgkAzAgCAhQlZCVkJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmJsCQDMCAIJAKQDAQUCYm0JAMwIAgkApAMBBQJibgkAzAgCCQCkAwEFAmJvCQDMCAIJAKQDAQUCYnAJAMwIAgkApAMBBQJicQkAzAgCCQCkAwEFAmJyCQDMCAIJAKQDAQUCYnMJAMwIAgkApAMBBQJidAkAzAgCCQCkAwEFAmJ1BQNuaWwFAWwBAmJ2BgJidwJieAJieQJibwJicgJicwkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmJ3CQDMCAIJAKQDAQUCYngJAMwIAgkApAMBBQJieQkAzAgCCQCkAwEFAmJvCQDMCAIJAKQDAQUCYnIJAMwIAgkApAMBBQJicwUDbmlsBQFsAQJiegECYkEDCQAAAgUCYkECBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFAmJBAQJiQgICYkMCYkQJALwCAwUCYkMFAWMFAmJEAQJiRQMCYkYCYkcCYkgEAmJJCQC8AgMJALgCAgUCYkYFAmJHBQFiBQJiRwQCYkoJAL8CAgkAuAICBQJiSAkBAVABBQJiSQUBZAMJAQEhAQUCYkoJAAIBCQCsAgICCkJpZyBzbHBnOiAJAKYDAQUCYkkJAJQKAgUCYkoJAJkDAQkAzAgCBQJiRgkAzAgCBQJiRwUDbmlsAQJiSwMCYkwCYk0CYk4EAmJJCQC8AgMFAmJNBQFiBQJiTAQCYk8JAL8CAgUCYk4FAmJJAwMFAmJPBgkAvwICBQJiTQUCYkwJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCmAwEFAmJNAgEgCQCmAwEFAmJMAgEgCQCmAwEFAmJJAgEgCQCmAwEFAmJOBQJiTwECYlAEAmJRAmJSAmJTAmJUBAJiVQkBAUYCBQJiUwUCYlEEAmJWCQEBRgIFAmJUBQJiUgkBAmJCAgUCYlYFAmJVAQJiVwMCYlMCYlQCYlgEAmJZCQECYU0ABAJiWgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJZBQF3BAJjYQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJZBQF4BAJjYgkBAmJQBAUCYloFAmNhBQJiUwUCYlQEAmJECQEBRgIFAmJTBQJiWgQCYkMJAQFGAgUCYlQFAmNhBAJjYwkBAUYCBQJiWAUBYQQCY2QJAQJiQgIFAmJEBQJjYwQCY2UJAQJiQgIFAmJDBQJjYwkAzAgCBQJjYgkAzAgCBQJjZAkAzAgCBQJjZQUDbmlsAQJjZgMCYlMCYlQCYlgEAmNnCQECYlcDBQJiUwUCYlQFAmJYCQDMCAIJAQFJAgkAkQMCBQJjZwAABQFhCQDMCAIJAQFJAgkAkQMCBQJjZwABBQFhCQDMCAIJAQFJAgkAkQMCBQJjZwACBQFhBQNuaWwBAmNoAgJjaQJjagQCY2sDCQAAAgUCY2oAAAAACQBrAwUCY2kFAmNqBQFhCQCUCgIJAGUCBQJjaQUCY2sFAmNrAQJjbAQCY20CY24CY28CY3AEAmJZCQECYU0ABAJjcQkAkQMCBQJiWQUBdAQCY3IJAJEDAgUCYlkFAXUEAmNzCQCRAwIFAmJZBQF2BAJjdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJZBQF3BAJjdQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJZBQF4BAJjdgkAkQMCBQJiWQUBcwQCY3cICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJjcQILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQJjcQUCY24JAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmN4CQECYnoBBQJjcgQCY3kJAQFGAgUCY3gFAmN0BAJjegkBAmJ6AQUCY3MEAmNBCQEBRgIFAmN6BQJjdQQCY0IJAQJiQgIFAmNBBQJjeQQCY0MJAQFJAgUCY0IFAWEEAmNECQEBRgIFAmNvBQFhBAJjRQkBAUYCBQJjdwUBYQQCY0YJALwCAwUCY3kFAmNEBQJjRQQCY0cJALwCAwUCY0EFAmNEBQJjRQQCY0gJAQFJAgUCY0YFAmN0BAJjSQkBAUkCBQJjRwUCY3UEAmNKAwkAAAIFAmNtAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjcAUCY0gDCQAAAgUCY3ICBVdBVkVTBQR1bml0CQDZBAEFAmNyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNwBQJjSQMJAAACBQJjcwIFV0FWRVMFBHVuaXQJANkEAQUCY3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAgkApQgBBQJjcAUCY20JAQJidgYFAmNIBQJjSQUCY28FAmNDBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQAFAmNDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNDBQNuaWwJAJwKCgUCY0gFAmNJBQJjcgUCY3MFAmN4BQJjegUCY3cFAmNCBQJjdgUCY0oBAmNLDQJjbQJiSAJjTAJjTQJjTgJjTwJjcAJjUAJjUQJjUgJjUwJjVAJjVQQCYlkJAQJhTQAEAmNxCQDZBAEJAJEDAgUCYlkFAXQEAmNWCQCRAwIFAmJZBQF1BAJjVwkAkQMCBQJiWQUBdgQCY1gJAJEDAgUCYlkFAXkEAmNZCQCRAwIFAmJZBQF6BAJjWgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJZBQF3BAJkYQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJZBQF4BAJjdgkAkQMCBQJiWQUBcwQCZGIICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3ECCFdyIGxwIGFzCHF1YW50aXR5BAJjeAMFAmNQCQECYnoBBQJjVgMDBQJjUgkAAAIFAmNVBQJjVgcJAGUCCQECYnoBBQJjVgUCY1QDBQJjUgkBAmJ6AQUCY1YJAGUCCQECYnoBBQJjVgUCY0wEAmN6AwUCY1AJAQJiegEFAmNXAwMFAmNSCQAAAgUCY1UFAmNXBwkAZQIJAQJiegEFAmNXBQJjVAMFAmNSCQECYnoBBQJjVwkAZQIJAQJiegEFAmNXBQJjTgQCZGMJAQFGAgUCY0wFAmNaBAJkZAkBAUYCBQJjTgUCZGEEAmRlCQECYkICBQJkZAUCZGMEAmN5CQEBRgIFAmN4BQJjWgQCY0EJAQFGAgUCY3oFAmRhBAJkZgMJAAACBQJkYgAABAJjQgUBZAQCZGcFAWQEAmNjCQB2BgkAuQICBQJkYwUCZGQAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQFJAgUCY2MFAWEJAQFJAgUCZGMFAmNaCQEBSQIFAmRkBQJkYQkBAmJCAgkAtwICBQJjQQUCZGQJALcCAgUCY3kFAmRjBQJkZwQCY0IJAQJiQgIFAmNBBQJjeQQCZGgJALwCAwkBAVABCQC4AgIFAmNCBQJkZQUBYwUCY0IEAmRnCQEBRgIFAmJIBQFhAwMDBQJjUwkBAiE9AgUCY0IFAWQHCQC/AgIFAmRoBQJkZwcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCZGgCAyA+IAkApgMBBQJkZwQCZGkJAQFGAgUCZGIFAWEEAmRqCQC8AgMFAmRjBQJjQgUBYwQCZGsJALwCAwUCZGQFAWMFAmNCBAJkbAMJAL8CAgUCZGoFAmRkCQCUCgIFAmRrBQJkZAkAlAoCBQJkYwUCZGoEAmRtCAUCZGwCXzEEAmRuCAUCZGwCXzIEAmNjCQC8AgMFAmRpBQJkbgUCY0EJAJcKBQkBAUkCBQJjYwUBYQkBAUkCBQJkbQUCY1oJAQFJAgUCZG4FAmRhBQJjQgUCZGcEAmRvCAUCZGYCXzEEAmRwCAUCZGYCXzIEAmRxCAUCZGYCXzMEAmNDCQEBSQIIBQJkZgJfNAUBYQQCZHIJAQFJAggFAmRmAl81BQFhAwkAZwIAAAUCZG8JAAIBAgdMUCA8PSAwBAJkcwMJAQEhAQUCY1EAAAUCZG8EAmR0CQBlAgUCY0wFAmRwBAJkdQkAZQIFAmNOBQJkcQQCZHYDAwUCY1IJAAACBQJjVQUCY1YHCQCUCgIFAmNUAAADAwUCY1IJAAACBQJjVQUCY1cHCQCUCgIAAAUCY1QJAJQKAgUCZHAFAmRxBAJkdwgFAmR2Al8xBAJkeAgFAmR2Al8yBAJkeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjQwkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQIFAmNwBQJjbQkBAmJrCgUCZHcFAmR4BQJkcwUCY0MFAmJIBQJkcgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZHQFAmR1BQNuaWwJAJ8KDQUCZG8FAmRzBQJjQwUCY3gFAmN6BQJkYgUCY3EFAmN2BQJkeQUCZHQFAmR1BQJjTQUCY08BAmR6AQJkQQQCYlkJAQJhTQAEAmRCCQCRAwIFAmJZBQF1BAJkQwkAkQMCBQJiWQUBdgQCY3YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiWQUBcwQCYloJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiWQUBdwQCY2EJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiWQUBeAQCZEQJAQJiegEFAmRCBAJkRQkBAmJ6AQUCZEMEAmNCAwkAAAIIBQJkQQlvcmRlclR5cGUFA0J1eQkBAmJQBAUCYloFAmNhCQBkAgUCZEQIBQJkQQZhbW91bnQFAmRFCQECYlAEBQJiWgUCY2EJAGUCBQJkRAgFAmRBBmFtb3VudAUCZEUEAmNDCQEBSQIFAmNCBQFhAwMDCQECYUoABgkAAAIFAmN2BQFwBgkAAAIFAmN2BQFxCQACAQINQWRtaW4gYmxvY2tlZAQCZEYICAUCZEEJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BAJkRwMJAAACBQJkRgUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQUCZEYEAmRICAgFAmRBCWFzc2V0UGFpcgpwcmljZUFzc2V0BAJkSQMJAAACBQJkSAUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQUCZEgDAwkBAiE9AgUCZEcFAmRCBgkBAiE9AgUCZEkFAmRDCQACAQIJV3IgYXNzZXRzBAJkSggFAmRBBXByaWNlBAJkYQkAawMFAWEFAmNhBQJiWgQCZEsJAQFMAwUCZEoFAWEFAmRhBAJkTAMJAAACCAUCZEEJb3JkZXJUeXBlBQNCdXkJAGcCBQJjQwUCZEsJAGcCBQJkSwUCY0MGAQJkTQECZE4DCQECIT0CCQCQAwEIBQJkTghwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQCZE8JAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAEAmNuCQEFdmFsdWUBCAUCZE8HYXNzZXRJZAQCY1QIBQJkTwZhbW91bnQEAmRmCQECY2wECQDYBAEIBQJkTg10cmFuc2FjdGlvbklkCQDYBAEFAmNuBQJjVAgFAmROBmNhbGxlcgQCY0gIBQJkZgJfMQQCY0kIBQJkZgJfMgQCY3YJAQ1wYXJzZUludFZhbHVlAQgFAmRmAl85BAJjSggFAmRmA18xMAMDCQECYUoABgkAAAIFAmN2BQFxCQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUCY3YJAJcKBQUCY0gFAmNJBQJjVAUCY24FAmNKAQJkUAoCZFECYWECZFICZFMCYkgCY1ECY1ICY1MCY1QCY1UEAmRmCQECY0sNBQJhYQUCYkgICQEFdmFsdWUBBQJkUgZhbW91bnQICQEFdmFsdWUBBQJkUgdhc3NldElkCAkBBXZhbHVlAQUCZFMGYW1vdW50CAkBBXZhbHVlAQUCZFMHYXNzZXRJZAUCZFEJAAACBQJhYQIABQJjUQUCY1IFAmNTBQJjVAUCY1UEAmN2CQENcGFyc2VJbnRWYWx1ZQEIBQJkZgJfOAMDAwkBAmFKAAYJAAACBQJjdgUBbwYJAAACBQJjdgUBcQkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCY3YFAmRmAQJkVAECZFUEAmRWBQFnBAJkVwkAkQMCBQJkVQAABAJkWAkAkQMCBQJkVQABBAJkWQkApwMBBQFqBAJkWgkAuQICCQCnAwEFAmFJBQJkWQQCZWEJALcCAgUCZFcFAmRYAwkAAAIFAmVhBQFlBQFlBAJlYgkAuQICBQJkWgUCZFYEAmVjCQC5AgIJALkCAgkAuQICBQJkVwUCZFgFAmRWBQJkVgQCZWQJALoCAgkAuQICBQJlYgUCZWEFAmRZBAJlZQkAuAICBQJlYgUCZFkEAmVmCQC3AgIFAmRWBQFmCgECZWcCAmVoAmVpBAJlagUCZWgEAmVrCAUCZWoCXzEEAmVsCAUCZWoCXzIDCQECIT0CBQJlbAUEdW5pdAUCZWgEAmVtCQC6AgIJALkCAgkAuQICBQJlawUCZWsFAmVrBQJlYwQCZW4JALoCAgkAuQICCQC3AgIFAmVkCQC5AgIFAmVtBQJkVgUCZWsJALcCAgkAugICCQC5AgIFAmVlBQJlawUCZFkJALkCAgUCZWYFAmVtBAJlbwkBAVEBCQC4AgIFAmVuCQEFdmFsdWUBBQJlawMJAMACAgUBZgUCZW8JAJQKAgUCZW4FAmVpCQCUCgIFAmVuBQR1bml0BAJlcAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlcQoAAmVyBQJlcAoAAmVzCQCQAwEFAmVyCgACZXQJAJQKAgUCZWEFBHVuaXQKAQJldQICZXYCZXcDCQBnAgUCZXcFAmVzBQJldgkBAmVnAgUCZXYJAJEDAgUCZXIFAmV3CgECZXgCAmV2AmV3AwkAZwIFAmV3BQJlcwUCZXYJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmV4AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgUCZXQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZWsIBQJlcQJfMQQCZWwIBQJlcQJfMgMJAQIhPQIFAmVsBQR1bml0BQJlawkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJlawECZXkDAmRVAmROAmV6BAJkVgUBZwQCZUEJAJEDAgUCZFUDCQAAAgUCZE4AAAABAAAEAmRZCQCnAwEFAWoEAmRaCQC5AgIJAKcDAQUCYUkFAmRZBAJlYQUCZUEEAmViCQC5AgIFAmRaBQJkVgQCZUIJALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQJlegUCZXoJALkCAgUCZUEFAmRWBQJlegUCZFkJALkCAgUCZWIFAmRWBAJlQwkAuAICCQC3AgIFAmVhCQC6AgIJALkCAgUCZXoFAmRZBQJlYgUCZXoKAQJlZwICZWgCZWkEAmVEBQJlaAQCZUUIBQJlRAJfMQQCZWwIBQJlRAJfMgMJAQIhPQIFAmVsBQR1bml0BQJlaAQCZUYJALoCAgkAtwICCQC5AgIFAmVFBQJlRQUCZUIJALcCAgkAuQICBQFnBQJlRQUCZUMEAmVHCQEBUQEJALgCAgUCZUYJAQV2YWx1ZQEFAmVFAwkAwAICBQFmBQJlRwkAlAoCBQJlRgUCZWkJAJQKAgUCZUYFBHVuaXQEAmVwCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmVICgACZXIFAmVwCgACZXMJAJADAQUCZXIKAAJldAkAlAoCBQJlegUEdW5pdAoBAmV1AgJldgJldwMJAGcCBQJldwUCZXMFAmV2CQECZWcCBQJldgkAkQMCBQJlcgUCZXcKAQJleAICZXYCZXcDCQBnAgUCZXcFAmVzBQJldgkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZXgCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCCQECZXUCBQJldAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJlRQgFAmVIAl8xBAJlbAgFAmVIAl8yAwkBAiE9AgUCZWwFBHVuaXQFAmVFCQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAmVFAQJlSQUCZUoCY24CY3ACYWECZUsEAmFVCQECYU0ABAJjcgkAkQMCBQJhVQUBdQQCY3MJAJEDAgUCYVUFAXYEAmNxCQCRAwIFAmFVBQF0BAJjWgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFVBQF3BAJkYQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFVBQF4BAJlTAkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3ECEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmVNAwkAvwICBQJlTAUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmVNBQJlTQQCY3gJAQJiegEFAmNyBAJjegkBAmJ6AQUCY3MEAmVOAwkAAAIFAmFhAgAJAJQKAgUCY3gFAmN6AwkAAAIFAmNuBQJjcgMJAGYCBQJlSgUCY3gJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJjeAUCZUoFAmN6AwkAAAIFAmNuBQJjcwMJAGYCBQJlSgUCY3oJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmN4CQBlAgUCY3oFAmVKCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZU8IBQJlTgJfMQQCZVAIBQJlTgJfMgQCZVEDCQAAAgUCY24FAmNyCQCUCgIFAmVKAAADCQAAAgUCY24FAmNzCQCUCgIAAAUCZUoJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmVSCAUCZVECXzEEAmVTCAUCZVECXzIEAmVUAwUCZUsJAJUKAwgJAQJjaAIFAmVSBQJhRgJfMQgJAQJjaAIFAmVTBQJhRgJfMQgJAQJjaAIFAmVKBQJhRgJfMgkAlQoDBQJlUgUCZVMAAAQCZVUIBQJlVAJfMQQCZVYIBQJlVAJfMgQCY2sIBQJlVAJfMwQCZVcJAGQCBQJlTwUCZVUEAmVYCQBkAgUCZVAFAmVWBAJiTQkBAmRUAQkAzAgCCQC2AgEFAmVPCQDMCAIJALYCAQUCZVAFA25pbAQCYkwJAQJkVAEJAMwIAgkAtgIBBQJlVwkAzAgCCQC2AgEFAmVYBQNuaWwEAmVZAwkAvwICBQJiTAUCYk0GCQEFdGhyb3cAAwkAAAIFAmVZBQJlWQQCZVoJALwCAwUCZUwJALgCAgUCYkwFAmJNBQJiTQQCY0MJAQFJAgkBAmJCAgkBAUYCBQJlWAUCZGEJAQFGAgUCZVcFAmNaBQFhBAJkeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjQwkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQIFAmNwBQJhYQkBAmJrCgUCZVIFAmVTCQCgAwEFAmVaBQJjQwAAAAAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAAAAAABQNuaWwEAmZhCQBrAwUCZVAFAWEFAmVPBAJmYgkAawMFAmVKBQFhCQBkAgUCZmEFAWEEAmZjCQBlAgUCZUoFAmZiBAJmZAkAvAIDBQJlTAkAtgIBBQJmYwkAtgIBBQJlUAQCZmUJAKADAQkAvAIDCQC4AgIFAmVaBQJmZAUBYgUCZmQJAJYKBAkAoAMBBQJlWgUCZHkFAmNrBQJmZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZmYGAmZnAmZoAmZpAmRRAmZqAmZrBAJhVQkBAmFNAAQCY3EJAJEDAgUCYVUFAXQEAmNyCQCRAwIFAmFVBQF1BAJjcwkAkQMCBQJhVQUBdgQCZmwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhVQUBdwQCZm0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhVQUBeAQCZm4JAJEDAgUCYVUFAXMEAmNwAwkAAAIFAmRRBQJiagUCZmoFAmRRBAJkTwkBBXZhbHVlAQkAkQMCBQJmaQAABAJjbgkBBXZhbHVlAQgFAmRPB2Fzc2V0SWQEAmNUCAUCZE8GYW1vdW50BAJjbQkA2AQBBQJmawMJAQIhPQIFAmNxCQDYBAEFAmNuCQACAQIIV3JvbmcgTFAEAmN4CQECYnoBBQJjcgQCY3oJAQJiegEFAmNzBAJmbwoAAmFHCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZmcJAMwIAgUCY1QFA25pbAUDbmlsAwkAAQIFAmFHAgooSW50LCBJbnQpBQJhRwkAAgEJAKwCAgkAAwEFAmFHAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpAwkAAAIFAmZvBQJmbwQCY2sIBQJmbwJfMgQCZnAIBQJmbwJfMQQCZnEDAwkAZgIFAmZoAAAJAGYCBQJmaAUCZnAHCQECYUMBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmZoBQNuaWwCAAUCZnAEAmZyAwkAAAIFAmZnBQJjcgkAlgoEBQJmcQAACQBlAgkAZQIFAmN4BQJmcQUCY2sFAmN6AwkAAAIFAmZnBQJjcwkAlgoEAAAFAmZxBQJjeAkAZQIJAGUCBQJjegUCZnEFAmNrCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmZzCAUCZnICXzEEAmZ0CAUCZnICXzIEAmVXCAUCZnICXzMEAmVYCAUCZnICXzQEAmZ1CQECYkICCQEBRgIFAmVYBQJmbQkBAUYCBQJlVwUCZmwEAmZ2CQEBSQIFAmZ1BQFhBAJmdwMJAAACBQJmZwIFV0FWRVMFBHVuaXQJANkEAQUCZmcEAmZ4AwkAZgIFAmNrAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUwFAmNrBQJmdwUDbmlsBQNuaWwEAmNKCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY3AFAmZxBQJmdwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWICCQClCAEFAmNwBQJjbQkBAmJ2BgUCZnMFAmZ0BQJjVAUCZnYFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAAUCZnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZnYFA25pbAUCZngDCQAAAgUCY0oFAmNKBAJmeQkA/AcEBQJhRQIEYnVybgkAzAgCBQJjVAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjbgUCY1QFA25pbAMJAAACBQJmeQUCZnkJAJQKAgUCY0oFAmZxCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmegAEAmF3CQCiCAEJAQFTAAMJAAECBQJhdwIGU3RyaW5nBAJlYQUCYXcJANkEAQUCZWEDCQABAgUCYXcCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECZkEABAJhdwkAoggBCQEBVAADCQABAgUCYXcCBlN0cmluZwQCZWEFAmF3CQDZBAEFAmVhAwkAAQIFAmF3AgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmZCCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAmZDAQJkTgQCYXcJAQJmegADCQABAgUCYXcCCkJ5dGVWZWN0b3IEAmZEBQJhdwkAAAIIBQJkTg9jYWxsZXJQdWJsaWNLZXkFAmZEAwkAAQIFAmF3AgRVbml0CQAAAggFAmROBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQJmRQECZE4EAmF3CQECZnoAAwkAAQIFAmF3AgpCeXRlVmVjdG9yBAJmRAUCYXcDCQAAAggFAmROD2NhbGxlclB1YmxpY0tleQUCZkQGBQJmQgMJAAECBQJhdwIEVW5pdAMJAAACCAUCZE4GY2FsbGVyBQR0aGlzBgUCZkIJAAIBAgtNYXRjaCBlcnJvcgECZkYDAmZHAmV6AmZIBAJhVQkBAmFNAAQCY3IJAJEDAgUCYVUFAXUEAmNzCQCRAwIFAmFVBQF2BAJkVgUBZwQCZFkJAKcDAQUBagQCZFoJALkCAgkApwMBBQJhSQUCZFkEAmRVAwkAAAIFAmZHBwkAzAgCCQC4AgIJALYCAQkBAmJ6AQUCY3IFAmZICQDMCAIJALYCAQkBAmJ6AQUCY3MFA25pbAkAzAgCCQC4AgIJALYCAQkBAmJ6AQUCY3MFAmZICQDMCAIJALYCAQkBAmJ6AQUCY3IFA25pbAQCZUEJAJEDAgUCZFUAAAQCZWEFAmVBBAJlYgkAuQICBQJkWgUCZFYEAmVCCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZXoFAmV6CQC5AgIFAmVBBQJkVgUCZXoFAmRZCQC5AgIFAmViBQJkVgQCZUMJALgCAgkAtwICBQJlYQkAugICCQC5AgIFAmV6BQJkWQUCZWIFAmV6CgECZWcCAmVoAmVpBAJmSQUCZWgEAmVFCAUCZkkCXzEEAmVsCAUCZkkCXzIDCQECIT0CBQJlbAUEdW5pdAUCZWgEAmVGCQC6AgIJALcCAgkAuQICBQJlRQUCZUUFAmVCCQC3AgIJALkCAgUBZwUCZUUFAmVDBAJlRwkBAVEBCQC4AgIFAmVGCQEFdmFsdWUBBQJlRQMJAMACAgUBZgUCZUcJAJQKAgUCZUYFAmVpCQCUCgIFAmVGBQR1bml0BAJlcAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJmSgoAAmVyBQJlcAoAAmVzCQCQAwEFAmVyCgACZXQJAJQKAgUCZXoFBHVuaXQKAQJldQICZXYCZXcDCQBnAgUCZXcFAmVzBQJldgkBAmVnAgUCZXYJAJEDAgUCZXIFAmV3CgECZXgCAmV2AmV3AwkAZwIFAmV3BQJlcwUCZXYJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmV4AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgkBAmV1AgUCZXQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZUUIBQJmSgJfMQQCZWwIBQJmSgJfMgMJAQIhPQIFAmVsBQR1bml0BQJlRQkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlRR0CZE4BIWNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBSRUFET05MWQICZksCZkcEAmZMAwkAAAIFAmZHBwQCZk0JAQJheQIFBHRoaXMJAQJhZAAEAmZICQC3AgIJALYCAQkBAmJ6AQkBAmF5AgUEdGhpcwkBAmFjAAkAtgIBBQJmSwkAlAoCBQJmTQUCZkgEAmZNCQECYXkCBQR0aGlzCQECYWMABAJmSAkAtwICCQC2AgEJAQJiegEJAQJheQIFBHRoaXMJAQJhZAAJALYCAQUCZksJAJQKAgUCZk0FAmZIBAJmTQgFAmZMAl8xBAJmSAgFAmZMAl8yBAJhVQkBAmFNAAQCY3IJAJEDAgUCYVUFAXUEAmNzCQCRAwIFAmFVBQF2BAJkVQkAzAgCCQC2AgEJAQJiegEFAmNyCQDMCAIJALYCAQkBAmJ6AQUCY3MFA25pbAQCZXoJAQJkVAEFAmRVBAJlRQkBAmZGAwUCZkcFAmV6BQJmSAQCZk4JALgCAgkAuAICCQC2AgEJAQJiegEFAmZNBQJlRQkAtgIBAAEEAmZPCQCWAwEJAMwIAgAACQDMCAIJAKADAQUCZk4FA25pbAkAlAoCBQNuaWwFAmZPAmROASZjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwQW5kU2VuZFRva2VucwQCZksCZkcCZlACZlEEAmZSCQDMCAIDCQBnAggJAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAGYW1vdW50BQJmSwYJAQJhQwECDFdyb25nIGFtb3VudAkAzAgCAwkAAAIIBQJkTgZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFBHRoaXMJAQJhZwAGCQECYUMBAhFQZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFAmZSBQJmUgQCZE8JAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAEAmZTAwkAAAIIBQJkTwdhc3NldElkBQR1bml0CQDYBAEJAJsDAQIFV0FWRVMJANgEAQkBBXZhbHVlAQgFAmRPB2Fzc2V0SWQEAmZUAwkAAAIFAmZHBwQCZk0JAQJheQIFBHRoaXMJAQJhZAAEAmZICQBlAgkBAmJ6AQUCZlMICQEFdmFsdWUBCQCRAwIIBQJkTghwYXltZW50cwAABmFtb3VudAkAlAoCBQJmTQUCZkgEAmZNCQECYXkCBQR0aGlzCQECYWMABAJmSAkAZQIJAQJiegEFAmZTCAkBBXZhbHVlAQkAkQMCCAUCZE4IcGF5bWVudHMAAAZhbW91bnQJAJQKAgUCZk0FAmZIBAJmTQgFAmZUAl8xBAJmSAgFAmZUAl8yBAJhVQkBAmFNAAQCY3IJAJEDAgUCYVUFAXUEAmNzCQCRAwIFAmFVBQF2BAJkVQkAzAgCCQC4AgIJALYCAQkBAmJ6AQUCY3IJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJALYCAQkBAmJ6AQUCY3MFA25pbAQCZXoJAQJkVAEFAmRVBAJlRQkBAmZGAwUCZkcFAmV6CQC2AgEFAmZIBAJmTgkAuAICCQC4AgIJALYCAQkBAmJ6AQUCZk0FAmVFCQC2AgEAAQQCZk8JAJYDAQkAzAgCAAAJAMwIAgkAoAMBBQJmTgUDbmlsBAJmVQMJAGcCBQJmTwUCZlAGCQACAQIsRXhjaGFuZ2UgcmVzdWx0IGlzIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQDCQAAAgUCZlUFAmZVCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmZRBQJmTwMJAAACBQJmUwIFV0FWRVMFBHVuaXQJANkEAQUCZk0FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkTgELY29uc3RydWN0b3IBAVIEAmVCCQECZkUBBQJkTgMJAAACBQJlQgUCZUIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVIABQFSBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZE4BCnNldE1hbmFnZXIBAmZWBAJlQgkBAmZFAQUCZE4DCQAAAgUCZUIFAmVCBAJmVwkA2QQBBQJmVgMJAAACBQJmVwUCZlcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQABQJmVgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmROAQ5jb25maXJtTWFuYWdlcgAEAmNnCQECZkEABAJmWAMJAQlpc0RlZmluZWQBBQJjZwYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZlgFAmZYBAJmWQMJAAACCAUCZE4PY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJjZwYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZlkFAmZZCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAAkA2AQBCQEFdmFsdWUBBQJjZwkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkTgEDcHV0AgJmWgJnYQQCZ2IJAQJiZQAEAmdjCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnYgUBQQIKV3Igc3QgYWRkcgQCZ2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdiBQFDAgpXciBzbCBhZGRyAwkAZgIAAAUCZloJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmROCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdlCQECZFAKCQClCAEIBQJkTgZjYWxsZXIJANgEAQgFAmRODXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZE4IcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZE4IcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmROCHBheW1lbnRzAAEFAmZaBgcGAAACAAQCZHMIBQJnZQJfMgQCZ2YIBQJnZQJfNwQCY0oIBQJnZQJfOQQCZHQIBQJnZQNfMTAEAmR1CAUCZ2UDXzExBAJjcggFAmdlA18xMgQCY3MIBQJnZQNfMTMEAmRmCQD8BwQFAmFFAgRlbWl0CQDMCAIFAmRzBQNuaWwFA25pbAMJAAACBQJkZgUCZGYEAmdnBAJhdwUCZGYDCQABAgUCYXcCB0FkZHJlc3MEAmdoBQJhdwkA/AcEBQJnaAIEZW1pdAkAzAgCBQJkcwUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZ2cFAmdnBAJnaQMJAGYCBQJkdAAACQD8BwQFAmdkAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY3IFAmR0BQNuaWwFA25pbAMJAAACBQJnaQUCZ2kEAmdqAwkAZgIFAmR1AAAJAPwHBAUCZ2QCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjcwUCZHUFA25pbAUDbmlsAwkAAAIFAmdqBQJnagQCZ2sDBQJnYQQCZ2wJAPwHBAUCZ2MCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdmBQJkcwUDbmlsAwkAAAIFAmdsBQJnbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkTgZjYWxsZXIFAmRzBQJnZgUDbmlsCQDOCAIFAmNKBQJnawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkTgELcHV0T25lVGtuVjICAmZoAmdhBAJnbQoAAmFHCQD8BwQFAmFFAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYUcCB0Jvb2xlYW4FAmFHCQACAQkArAICCQADAQUCYUcCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmduAwMDCQECYUoABgkAAAIFAmFZBQFvBgkAAAIFAmFZBQFxBgUCZ20EAmZSCQDMCAIDAwkBASEBBQJnbgYJAQJmQwEFAmROBgkBAmFDAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZE4IcGF5bWVudHMAAQYJAQJhQwECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZSBQJmUgQCYVUJAQJhTQAEAmNyCQCRAwIFAmFVBQF1BAJjcwkAkQMCBQJhVQUBdgQCY3EJANkEAQkAkQMCBQJhVQUBdAQCZmwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhVQUBdwQCZm0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhVQUBeAQCY3ADCQAAAggFAmROBmNhbGxlcgUEdGhpcwgFAmRODG9yaWdpbkNhbGxlcggFAmROBmNhbGxlcgQCZE8JAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAEAmNuCQDYBAEJAQV2YWx1ZQEIBQJkTwdhc3NldElkBAJjVAgFAmRPBmFtb3VudAQCZ28JAQJlSQUFAmNUBQJjbgkApQgBBQJjcAkA2AQBCAUCZE4NdHJhbnNhY3Rpb25JZAYDCQAAAgUCZ28FAmdvBAJjawgFAmdvAl8zBAJjSggFAmdvAl8yBAJncAgFAmdvAl8xBAJkcwMDCQBmAgUCZmgAAAkAZgIFAmZoBQJncAcJAQJhQwEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZmgFA25pbAIABQJncAQCZ2UJAPwHBAUCYUUCBGVtaXQJAMwIAgUCZHMFA25pbAUDbmlsAwkAAAIFAmdlBQJnZQQCZ2cEAmF3BQJnZQMJAAECBQJhdwIHQWRkcmVzcwQCZ2gFAmF3CQD8BwQFAmdoAgRlbWl0CQDMCAIFAmRzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJnZwUCZ2cEAmdrAwUCZ2EEAmdsCQD8BwQFAmJnAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjcQUCZHMFA25pbAMJAAACBQJnbAUCZ2wFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZE4GY2FsbGVyBQJkcwUCY3EFA25pbAQCZngDCQBmAgUCY2sAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhTAUCY2sJANkEAQUCY24FA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCBQJjSgUCZ2sFAmZ4BQJkcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkTgEKcHV0Rm9yRnJlZQECZ3EDCQBmAgAABQJncQkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJkTghwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJncgkBAmRQCgkApQgBCAUCZE4GY2FsbGVyCQDYBAEIBQJkTg10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmROCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkTghwYXltZW50cwABBQJncQcHBgAAAgAIBQJncgJfOQJkTgEDZ2V0AAQCZGYJAQJkTQEFAmROBAJncwgFAmRmAl8xBAJjSQgFAmRmAl8yBAJjVAgFAmRmAl8zBAJjbggFAmRmAl80BAJjSggFAmRmAl81BAJlQwkA/AcEBQJhRQIEYnVybgkAzAgCBQJjVAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjbgUCY1QFA25pbAMJAAACBQJlQwUCZUMFAmNKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmROAQtnZXRPbmVUa25WMgICZmcCZmgEAmdtCgACYUcJAPwHBAUCYUUCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhRwIHQm9vbGVhbgUCYUcJAAIBCQCsAgIJAAMBBQJhRwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ3QDAwkBAmFKAAYJAAACBQJhWQUBcQYFAmdtBAJmUgkAzAgCAwMJAQEhAQUCZ3QGCQECZkMBBQJkTgYJAQJhQwECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmROCHBheW1lbnRzAAEGCQECYUMBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJmUgUCZlIEAmd1CQECZmYGBQJmZwUCZmgIBQJkTghwYXltZW50cwgFAmROBmNhbGxlcggFAmRODG9yaWdpbkNhbGxlcggFAmRODXRyYW5zYWN0aW9uSWQEAmNKCAUCZ3UCXzEEAmZxCAUCZ3UCXzIJAJQKAgUCY0oFAmZxCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmROARNnZXRPbmVUa25WMlJFQURPTkxZAgJmZwJndgQCYVUJAQJhTQAEAmNyCQCRAwIFAmFVBQF1BAJjcwkAkQMCBQJhVQUBdgQCY3EJAJEDAgUCYVUFAXQEAmRVCQDMCAIJALYCAQkBAmJ6AQUCY3IJAMwIAgkAtgIBCQECYnoBBQJjcwUDbmlsBAJndwkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3ECEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmJNCQECZFQBBQJkVQQCYkwJALgCAgUCYk0JALwCAwkAtgIBBQJndgUCYk0FAmd3BAJneAMJAAACBQJmZwUCY3IAAAMJAAACBQJmZwUCY3MAAQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJneQkBAmV5AwUCZFUFAmd4BQJiTAQCZk4JALgCAgkAkQMCBQJkVQUCZ3gFAmd5BAJmTwkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALgCAgUCZk4FAWYFA25pbAQCZ3oJAQJjaAIFAmZPBQJhSAQCZnAIBQJnegJfMQQCY2sIBQJnegJfMgkAlAoCBQNuaWwJAJQKAgUCZnAFAmNrAmROARxnZXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJmZwJndgQCYVUJAQJhTQAEAmNyCQCRAwIFAmFVBQF1BAJjcwkAkQMCBQJhVQUBdgQCY3EJAJEDAgUCYVUFAXQEAmN4CQECYnoBBQJjcgQCY3oJAQJiegEFAmNzBAJnQQoAAmFHCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZmcJAMwIAgUCZ3YFA25pbAUDbmlsAwkAAQIFAmFHAgooSW50LCBJbnQpBQJhRwkAAgEJAKwCAgkAAwEFAmFHAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJmcAgFAmdBAl8xBAJjawgFAmdBAl8yBAJkZgkBAmNsBAIABQJjcQUCZ3YFBHRoaXMEAmNICAUCZGYCXzEEAmNJCAUCZGYCXzIEAmdCCQBkAgUCY0gFAmNJBAJmZQMJAAACBQJnQgAAAwkAAAIFAmZwAAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmZwBQJnQgUBYQUCZ0IJAJQKAgUDbmlsCQCVCgMFAmZwBQJjawUCZmUCZE4BCWdldE5vTGVzcwICZ0MCZ0QEAmRmCQECZE0BBQJkTgQCY0gIBQJkZgJfMQQCY0kIBQJkZgJfMgQCY1QIBQJkZgJfMwQCY24IBQJkZgJfNAQCY0oIBQJkZgJfNQMJAGYCBQJnQwUCY0gJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY0gCAyA8IAkApAMBBQJnQwMJAGYCBQJnRAUCY0kJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjSQIDIDwgCQCkAwEFAmdEBAJnRQkA/AcEBQJhRQIEYnVybgkAzAgCBQJjVAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjbgUCY1QFA25pbAMJAAACBQJnRQUCZ0UFAmNKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmROAQ11bnN0YWtlQW5kR2V0AQJjaQQCZ0YDCQECIT0CCQCQAwEIBQJkTghwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZ0YFAmdGBAJiWQkBAmFNAAQCZ0cJAQJiZQAEAmdmCQDZBAEJAJEDAgUCYlkFAXQEAmdICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnRwUBQQIKV3Igc3QgYWRkcgQCZ0kJAPwHBAUCZ0gCB3Vuc3Rha2UJAMwIAgkA2AQBBQJnZgkAzAgCBQJjaQUDbmlsBQNuaWwDCQAAAgUCZ0kFAmdJBAJkZgkBAmNsBAkA2AQBCAUCZE4NdHJhbnNhY3Rpb25JZAkA2AQBBQJnZgUCY2kIBQJkTgZjYWxsZXIEAmN2CQENcGFyc2VJbnRWYWx1ZQEIBQJkZgJfOQQCY0oIBQJkZgNfMTAEAmdKAwMJAQJhSgAGCQAAAgUCY3YFAXEJAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJjdgYDCQAAAgUCZ0oFAmdKBAJnSwkA/AcEBQJhRQIEYnVybgkAzAgCBQJjaQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnZgUCY2kFA25pbAMJAAACBQJnSwUCZ0sFAmNKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmROARN1bnN0YWtlQW5kR2V0Tm9MZXNzAwJnTAJnTQJnRAQCZ3QDCQECYUoABgkAAAIFAmFZBQFxBAJmUgkAzAgCAwkBASEBBQJndAYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkTghwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZSBQJmUgQCZ0kJAPwHBAUCYmcCB3Vuc3Rha2UJAMwIAgkA2AQBBQJhWgkAzAgCBQJnTAUDbmlsBQNuaWwDCQAAAgUCZ0kFAmdJBAJnTgkBAmNsBAkA2AQBCAUCZE4NdHJhbnNhY3Rpb25JZAkA2AQBBQJhWgUCZ0wIBQJkTgZjYWxsZXIEAmNICAUCZ04CXzEEAmNJCAUCZ04CXzIEAmNKCAUCZ04DXzEwBAJnTwkAzAgCAwkAZwIFAmNIBQJnTQYJAAIBCQC5CQIJAMwIAgIsYW1vdW50IGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJnTQUDbmlsAgAJAMwIAgMJAGcCBQJjSQUCZ0QGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJnRAUDbmlsAgAFA25pbAMJAAACBQJnTwUCZ08EAmdFCQD8BwQFAmFFAgRidXJuCQDMCAIFAmdMBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmFaBQJnTAUDbmlsAwkAAAIFAmdFBQJnRQUCY0oJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZE4BFXVuc3Rha2VBbmRHZXRPbmVUa25WMgMCZ0wCZmcCZmgEAmdtCgACYUcJAPwHBAUCYUUCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhRwIHQm9vbGVhbgUCYUcJAAIBCQCsAgIJAAMBBQJhRwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ3QDAwkBAmFKAAYJAAACBQJhWQUBcQYFAmdtBAJmUgkAzAgCAwMJAQEhAQUCZ3QGCQECZkMBBQJkTgYJAQJhQwECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmROCHBheW1lbnRzAAAGCQECYUMBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJmUgUCZlIEAmJZCQECYU0ABAJnRwkBAmJlAAQCZ2YJANkEAQkAkQMCBQJiWQUBdAQCZ0gJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdHBQFBAgpXciBzdCBhZGRyBAJnSQkA/AcEBQJnSAIHdW5zdGFrZQkAzAgCCQDYBAEFAmdmCQDMCAIFAmdMBQNuaWwFA25pbAMJAAACBQJnSQUCZ0kEAmdQCQECZmYGBQJmZwUCZmgJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdmBQJnTAUDbmlsCAUCZE4GY2FsbGVyCAUCZE4Mb3JpZ2luQ2FsbGVyCAUCZE4NdHJhbnNhY3Rpb25JZAQCY0oIBQJnUAJfMQQCZnEIBQJnUAJfMgkAlAoCBQJjSgUCZnEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZE4BHHB1dE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmdRAmdSBAJhVQkBAmFNAAQCY3IJAJEDAgUCYVUFAXUEAmNzCQCRAwIFAmFVBQF2BAJjcQkAkQMCBQJhVQUBdAQCZ1MJAQJlSQUFAmdRBQJnUgIAAgAGBAJlWggFAmdTAl8xBAJjSggFAmdTAl8yBAJjawgFAmdTAl8zBAJmZQgFAmdTAl80CQCUCgIFA25pbAkAlQoDBQJlWgUCY2sFAmZlAmROASFwdXRPbmVUa25WMldpdGhvdXRUYWtlRmVlUkVBRE9OTFkCAmdRAmdSBAJhVQkBAmFNAAQCY3IJAJEDAgUCYVUFAXUEAmNzCQCRAwIFAmFVBQF2BAJjcQkAkQMCBQJhVQUBdAQCZ1QJAQJlSQUFAmdRBQJnUgIAAgAHBAJlWggFAmdUAl8xBAJjSggFAmdUAl8yBAJjawgFAmdUAl8zBAJmZQgFAmdUAl80CQCUCgIFA25pbAkAlQoDBQJlWgUCY2sFAmZlAmROAQhhY3RpdmF0ZQICZ1UCZ1YDCQECIT0CCQClCAEIBQJkTgZjYWxsZXIJAKUIAQUCYUUJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMABQJnVQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQABQJnVgUDbmlsAgdzdWNjZXNzAmROAQRzZXRTAgJnVwJnSgMJAQIhPQIJAKUIAQgFAmROBmNhbGxlcgkBAmF5AgUEdGhpcwkBAmFmAAUCZkIJAMwIAgkBC1N0cmluZ0VudHJ5AgUCZ1cFAmdKBQNuaWwCZE4BBHNldEkCAmdXAmdKAwkBAiE9AgkApQgBCAUCZE4GY2FsbGVyCQECYXkCBQR0aGlzCQECYWYABQJmQgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZ1cFAmdKBQNuaWwCZE4BHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBAmFNAAJkTgEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQECYkEJAJQKAgUDbmlsCQECYnoBBQJiQQJkTgEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMCYlMCYlQCYlgEAmdYCQECYlcDBQJiUwUCYlQFAmJYCQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUCZ1gAAAkAzAgCCQCmAwEJAJEDAgUCZ1gAAQkAzAgCCQCmAwEJAJEDAgUCZ1gAAgUDbmlsAmROARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgFKAmdZCQCUCgIFA25pbAkBAUkCCQCnAwEFAUoFAmdZAmROARR0b1gxOFdyYXBwZXJSRUFET05MWQIBRwFICQCUCgIFA25pbAkApgMBCQEBRgIFAUcFAUgCZE4BHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYkMCYkQJAJQKAgUDbmlsCQCmAwEJAQJiQgIJAKcDAQUCYkMJAKcDAQUCYkQCZE4BI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJjbQJiSAJjTAJjTQJjTgJjTwJnWgJjUAJjUQkAlAoCBQNuaWwJAQJjSw0FAmNtBQJiSAUCY0wFAmNNBQJjTgUCY08FAmdaBQJjUAUCY1EGBwAAAgACZE4BI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJjbQJoYQJjbwJnWgQCZGYJAQJjbAQFAmNtBQJoYQUCY28JARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmdaCQCUCgIFA25pbAkAnAoKCAUCZGYCXzEIBQJkZgJfMggFAmRmAl8zCAUCZGYCXzQIBQJkZgJfNQgFAmRmAl82CAUCZGYCXzcJAKYDAQgFAmRmAl84CAUCZGYCXzkIBQJkZgNfMTABAmhiAQJoYwAEAmhkBAJhdwkBAmZ6AAMJAAECBQJhdwIKQnl0ZVZlY3RvcgQCZkQFAmF3BQJmRAMJAAECBQJhdwIEVW5pdAgFAmhiD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAJhdwUCaGIDCQABAgUCYXcCBU9yZGVyBAJkQQUCYXcEAmhlCQECYUsABAJoZgkBAmR6AQUCZEEEAmhnCQD0AwMIBQJkQQlib2R5Qnl0ZXMJAJEDAggFAmRBBnByb29mcwAACAUCZEEPc2VuZGVyUHVibGljS2V5BAJoaAkA9AMDCAUCZEEJYm9keUJ5dGVzCQCRAwIIBQJkQQZwcm9vZnMAAQUCaGUDAwMFAmhmBQJoZwcFAmhoBwYJAQJhcgMFAmhmBQJoZwUCaGgDCQABAgUCYXcCFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJlYQUCYXcEAmhpCQD2AwEJAQV2YWx1ZQEIBQJlYQZzY3JpcHQEAmhqCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYUUJAQJhcAAEAmhrCQDxBwEFBHRoaXMDAwkAAAIFAmhqBQJoaQkBAiE9AgUCaGsFAmhpBwYJAPQDAwgFAmhiCWJvZHlCeXRlcwkAkQMCCAUCaGIGcHJvb2ZzAAAFAmhkCQD0AwMIBQJoYglib2R5Qnl0ZXMJAJEDAggFAmhiBnByb29mcwAABQJoZEv/uPg=", "chainId": 84, "height": 2421866, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AkwLW3WJJVqqjnM8kLJQE6CFWUKapBJs866ZzgkgvNi Next: J5tdejS7KrWWrnNUN8iF3obyFZcyxGn1G4qo7VwhWaTf Diff:
OldNewDifferences
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
17-
18-let big3 = toBigInt(3)
19-
20-let big4 = toBigInt(4)
2117
2218 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2319
7066 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7167
7268
73-func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
74-
75-
7669 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
77-
78-
79-func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
80-
81-
82-func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
83-
84-
85-func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
8670
8771
8872 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
131115 func ada () = "%s__addonAddr"
132116
133117
134-let keyFee = "%s__fee"
118+func swapContract () = "%s__swapContract"
135119
136-let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
137-
138-let keyDLp = makeString(["%s", "dLp"], SEP)
139-
140-let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
141-
142-let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
143-
144-let dLpRefreshDelayDefault = 30
145-
146-let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
147120
148121 func fcfg () = "%s__factoryConfig"
149122
166139 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
167140
168141
169-func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
142+func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
143+
144+
145+func str (val) = match val {
146+ case valStr: String =>
147+ valStr
148+ case _ =>
149+ throw("fail cast to String")
150+}
170151
171152
172153 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
176157
177158
178159 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
179-
180-
181-func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
182160
183161
184162 let fca = addressFromStringValue(strf(this, fc()))
226204 else toBase58String(value(input))
227205
228206
229-func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
207+func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
230208
231209
232210 let poolConfigParsed = parsePoolConfig(gpc())
233211
234-let $t079658194 = poolConfigParsed
212+let $t069527138 = poolConfigParsed
235213
236-let cfgPoolAddress = $t079658194._1
214+let cfgPoolAddress = $t069527138._1
237215
238-let cfgPoolStatus = $t079658194._2
216+let cfgPoolStatus = $t069527138._2
239217
240-let cfgLpAssetId = $t079658194._3
218+let cfgLpAssetId = $t069527138._3
241219
242-let cfgAmountAssetId = $t079658194._4
220+let cfgAmountAssetId = $t069527138._4
243221
244-let cfgPriceAssetId = $t079658194._5
222+let cfgPriceAssetId = $t069527138._5
245223
246-let cfgAmountAssetDecimals = $t079658194._6
224+let cfgAmountAssetDecimals = $t069527138._6
247225
248-let cfgPriceAssetDecimals = $t079658194._7
249-
250-let cfgInAmountAssedId = $t079658194._8
251-
252-let cfgInPriceAssetId = $t079658194._9
226+let cfgPriceAssetDecimals = $t069527138._7
253227
254228 func gfc () = split(strf(fca, fcfg()), SEP)
255229
276250
277251
278252 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
279-
280-
281-func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
282253
283254
284255 func vad (A1,A2,slippage) = {
309280
310281
311282 func calcPrices (amAmt,prAmt,lpAmt) = {
312- let amtAsDcm = cfgAmountAssetDecimals
313- let prAsDcm = cfgPriceAssetDecimals
283+ let cfg = gpc()
284+ let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
285+ let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
314286 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
315287 let amAmtX18 = t1(amAmt, amtAsDcm)
316288 let prAmtX18 = t1(prAmt, prAsDcm)
335307 }
336308
337309
338-func getD (xp) = {
339- let xp0 = xp[0]
340- let xp1 = xp[1]
341- let s = (xp0 + xp1)
342- if ((s == big0))
343- then big0
344- else {
345- let a = parseIntValue(A)
346- let ann = (a * 2)
347- let p = fraction(xp0, xp1, big1)
348- let xp0_xp1_n_n = fraction(p, big4, big1)
349- let ann_s = fraction(toBigInt(ann), s, big1)
350- let ann_1 = toBigInt((ann - 1))
351- func calcDNext (d) = {
352- let dd = fraction(d, d, big1)
353- let ddd = fraction(dd, d, big1)
354- let dp = fraction(ddd, big1, xp0_xp1_n_n)
355- fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
356- }
357-
358- func calc (acc,i) = if (acc._2)
359- then acc
360- else {
361- let d = acc._1
362- let dNext = calcDNext(d)
363- let dDiffRaw = (dNext - value(d))
364- let dDiff = if ((big0 > dDiffRaw))
365- then -(dDiffRaw)
366- else dDiffRaw
367- if ((big1 >= dDiff))
368- then $Tuple2(dNext, true)
369- else $Tuple2(dNext, false)
370- }
371-
372- let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
373- let $t01269112739 = {
374- let $l = arr
375- let $s = size($l)
376- let $acc0 = $Tuple2(s, false)
377- func $f0_1 ($a,$i) = if (($i >= $s))
378- then $a
379- else calc($a, $l[$i])
380-
381- func $f0_2 ($a,$i) = if (($i >= $s))
382- then $a
383- else throw("List size exceeds 15")
384-
385- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
386- }
387- let d = $t01269112739._1
388- let found = $t01269112739._2
389- if (found)
390- then d
391- else throw(("D calculation error, D = " + toString(d)))
392- }
393- }
394-
395-
396310 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
397- let lpId = cfgLpAssetId
398- let amId = toBase58String(value(cfgAmountAssetId))
399- let prId = toBase58String(value(cfgPriceAssetId))
400- let amDcm = cfgAmountAssetDecimals
401- let prDcm = cfgPriceAssetDecimals
402- let sts = toString(cfgPoolStatus)
403- let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
404- if ((toBase58String(lpId) != pmtAssetId))
311+ let cfg = gpc()
312+ let lpId = cfg[idxLPAsId]
313+ let amId = cfg[idxAmAsId]
314+ let prId = cfg[idxPrAsId]
315+ let amDcm = parseIntValue(cfg[idxAmtAsDcm])
316+ let prDcm = parseIntValue(cfg[idxPriceAsDcm])
317+ let sts = cfg[idxPoolSt]
318+ let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
319+ if ((lpId != pmtAssetId))
405320 then throw("Wrong pmt asset")
406321 else {
407322 let amBalance = getAccBalance(amId)
414329 let lpEmissX18 = t1(lpEmiss, scale8)
415330 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
416331 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
417- let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
418- let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
332+ let outAmAmt = f1(outAmAmtX18, amDcm)
333+ let outPrAmt = f1(outPrAmtX18, prDcm)
419334 let state = if ((txId58 == ""))
420335 then nil
421336 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
429344
430345
431346 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
432- let lpId = cfgLpAssetId
433- let amIdStr = toBase58String(value(cfgAmountAssetId))
434- let prIdStr = toBase58String(value(cfgPriceAssetId))
435- let inAmIdStr = cfgInAmountAssedId
436- let inPrIdStr = cfgInPriceAssetId
437- let amtDcm = cfgAmountAssetDecimals
438- let priceDcm = cfgPriceAssetDecimals
439- let sts = toString(cfgPoolStatus)
347+ let cfg = gpc()
348+ let lpId = fromBase58String(cfg[idxLPAsId])
349+ let amIdStr = cfg[idxAmAsId]
350+ let prIdStr = cfg[idxPrAsId]
351+ let inAmIdStr = cfg[idxIAmtAsId]
352+ let inPrIdStr = cfg[idxIPriceAsId]
353+ let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
354+ let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
355+ let sts = cfg[idxPoolSt]
440356 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
441357 let amBalance = if (isEval)
442358 then getAccBalance(amIdStr)
461377 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
462378 let amBalanceX18 = t1(amBalance, amtDcm)
463379 let prBalanceX18 = t1(prBalance, priceDcm)
464- let D0 = getD([amBalanceX18, prBalanceX18])
465380 let r = if ((lpEm == 0))
466381 then {
467- let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
468- let checkD = if ((D1 > D0))
469- then true
470- else throw("D1 should be greater than D0")
471- if ((checkD == checkD))
472- then {
473- let curPriceX18 = zeroBigInt
474- let slippageX18 = zeroBigInt
475- let lpAmtX18 = D1
476- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
477- }
478- else throw("Strict value is not equal to itself.")
382+ let curPriceX18 = zeroBigInt
383+ let slippageX18 = zeroBigInt
384+ let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
385+ $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
479386 }
480387 else {
481388 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
489396 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
490397 else {
491398 let lpEmissionX18 = t1(lpEm, scale8)
492- let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
493- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
399+ let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
400+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
494401 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
495402 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
496403 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
497404 let expAmtAssetAmtX18 = expectedAmts._1
498405 let expPriceAssetAmtX18 = expectedAmts._2
499- let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
500- let checkD = if ((D1 > D0))
501- then true
502- else throw("D1 should be greater than D0")
503- if ((checkD == checkD))
504- then {
505- let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
506- $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
507- }
508- else throw("Strict value is not equal to itself.")
406+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
407+ $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
509408 }
510409 }
511410 let calcLpAmt = r._1
521420 else calcLpAmt
522421 let amDiff = (inAmAmt - calcAmAssetPmt)
523422 let prDiff = (inPrAmt - calcPrAssetPmt)
524- let $t02057820923 = if (if (isOneAsset)
423+ let $t01760517950 = if (if (isOneAsset)
525424 then (pmtId == amIdStr)
526425 else false)
527426 then $Tuple2(pmtAmt, 0)
530429 else false)
531430 then $Tuple2(0, pmtAmt)
532431 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
533- let writeAmAmt = $t02057820923._1
534- let writePrAmt = $t02057820923._2
432+ let writeAmAmt = $t01760517950._1
433+ let writePrAmt = $t01760517950._2
535434 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))]
536435 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
537436 }
538437 }
539438
540439
541-func getYD (xp,i,D) = {
542- let n = big2
543- let x = xp[if ((i == 0))
544- then 1
545- else 0]
546- let aPrecision = parseBigIntValue(Amult)
547- let a = (parseBigIntValue(A) * aPrecision)
548- let s = x
549- let ann = (a * n)
550- let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
551- let b = ((s + ((D * aPrecision) / ann)) - D)
552- func calc (acc,cur) = {
553- let $t02211822138 = acc
554- let y = $t02211822138._1
555- let found = $t02211822138._2
556- if ((found != unit))
557- then acc
558- else {
559- let yNext = (((y * y) + c) / ((big2 * y) + b))
560- let yDiff = absBigInt((yNext - value(y)))
561- if ((big1 >= yDiff))
562- then $Tuple2(yNext, cur)
563- else $Tuple2(yNext, unit)
564- }
565- }
566-
567- let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
568- let $t02244522492 = {
569- let $l = arr
570- let $s = size($l)
571- let $acc0 = $Tuple2(D, unit)
572- func $f0_1 ($a,$i) = if (($i >= $s))
573- then $a
574- else calc($a, $l[$i])
575-
576- func $f0_2 ($a,$i) = if (($i >= $s))
577- then $a
578- else throw("List size exceeds 15")
579-
580- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
581- }
582- let y = $t02244522492._1
583- let found = $t02244522492._2
584- if ((found != unit))
585- then y
586- else throw(("Y calculation error, Y = " + toString(y)))
587- }
588-
589-
590-func calcDLp (amountBalance,priceBalance,lpEmission) = {
591- let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
592- if ((lpEmission == big0))
593- then big0
594- else updatedDLp
595- }
596-
597-
598-func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
599- let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
600- let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
601- let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
602- let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
603- currentDLp
604- }
605-
606-
607-func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
608- let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
609- let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
610- let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
611- let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
612- let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
613- $Tuple2(actions, updatedDLp)
614- }
615-
616-
617-func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
618- then true
619- else throwErr("updated DLp lower than current DLp")
620-
621-
622-func validateMatcherOrderAllowed (order) = {
623- let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
624- let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
625- let amountAssetAmount = order.amount
626- let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
627- let $t02469024902 = if ((order.orderType == Buy))
628- then $Tuple2(amountAssetAmount, -(priceAssetAmount))
629- else $Tuple2(-(amountAssetAmount), priceAssetAmount)
630- let amountAssetBalanceDelta = $t02469024902._1
631- let priceAssetBalanceDelta = $t02469024902._2
440+func moa (order) = {
441+ let cfg = gpc()
442+ let amtAsId = cfg[idxAmAsId]
443+ let prAsId = cfg[idxPrAsId]
444+ let sts = parseIntValue(cfg[idxPoolSt])
445+ let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
446+ let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
447+ let accAmtAsBalance = getAccBalance(amtAsId)
448+ let accPrAsBalance = getAccBalance(prAsId)
449+ let curPriceX18 = if ((order.orderType == Buy))
450+ then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
451+ else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
452+ let curPrice = f1(curPriceX18, scale8)
632453 if (if (if (igs())
633454 then true
634- else (cfgPoolStatus == PoolMatcherDis))
455+ else (sts == PoolMatcherDis))
635456 then true
636- else (cfgPoolStatus == PoolShutdown))
457+ else (sts == PoolShutdown))
637458 then throw("Admin blocked")
638- else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
639- then true
640- else (order.assetPair.priceAsset != cfgPriceAssetId))
641- then throw("Wr assets")
642- else {
643- let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
644- let $t02524425344 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
645- let unusedActions = $t02524425344._1
646- let dLpNew = $t02524425344._2
647- let isOrderValid = (dLpNew >= dLp)
648- let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta)], "")
649- $Tuple2(isOrderValid, info)
650- }
459+ else {
460+ let orAmtAsset = order.assetPair.amountAsset
461+ let orAmtAsStr = if ((orAmtAsset == unit))
462+ then "WAVES"
463+ else toBase58String(value(orAmtAsset))
464+ let orPrAsset = order.assetPair.priceAsset
465+ let orPrAsStr = if ((orPrAsset == unit))
466+ then "WAVES"
467+ else toBase58String(value(orPrAsset))
468+ if (if ((orAmtAsStr != amtAsId))
469+ then true
470+ else (orPrAsStr != prAsId))
471+ then throw("Wr assets")
472+ else {
473+ let orderPrice = order.price
474+ let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
475+ let castOrderPrice = ts(orderPrice, scale8, priceDcm)
476+ let isOrderPriceValid = if ((order.orderType == Buy))
477+ then (curPrice >= castOrderPrice)
478+ else (castOrderPrice >= curPrice)
479+ true
480+ }
481+ }
651482 }
652483
653484
683514 }
684515
685516
517+func getD (xp) = {
518+ let n = big2
519+ let xp0 = xp[0]
520+ let xp1 = xp[1]
521+ let aPrecision = parseBigIntValue(Amult)
522+ let a = (parseBigIntValue(A) * aPrecision)
523+ let s = (xp0 + xp1)
524+ if ((s == big0))
525+ then big0
526+ else {
527+ let ann = (a * n)
528+ let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
529+ let ann_s_aPrecision = ((ann * s) / aPrecision)
530+ let ann_aPrecision = (ann - aPrecision)
531+ let n1 = (n + big1)
532+ func calc (acc,cur) = {
533+ let $t02250222522 = acc
534+ let d = $t02250222522._1
535+ let found = $t02250222522._2
536+ if ((found != unit))
537+ then acc
538+ else {
539+ let dp = (((d * d) * d) / xp0_xp1_n_n)
540+ let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
541+ let dDiff = absBigInt((dNext - value(d)))
542+ if ((big1 >= dDiff))
543+ then $Tuple2(dNext, cur)
544+ else $Tuple2(dNext, unit)
545+ }
546+ }
547+
548+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
549+ let $t02294322990 = {
550+ let $l = arr
551+ let $s = size($l)
552+ let $acc0 = $Tuple2(s, unit)
553+ func $f0_1 ($a,$i) = if (($i >= $s))
554+ then $a
555+ else calc($a, $l[$i])
556+
557+ func $f0_2 ($a,$i) = if (($i >= $s))
558+ then $a
559+ else throw("List size exceeds 15")
560+
561+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
562+ }
563+ let d = $t02294322990._1
564+ let found = $t02294322990._2
565+ if ((found != unit))
566+ then d
567+ else throw(("D calculation error, D = " + toString(d)))
568+ }
569+ }
570+
571+
572+func getYD (xp,i,D) = {
573+ let n = big2
574+ let x = xp[if ((i == 0))
575+ then 1
576+ else 0]
577+ let aPrecision = parseBigIntValue(Amult)
578+ let a = (parseBigIntValue(A) * aPrecision)
579+ let s = x
580+ let ann = (a * n)
581+ let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
582+ let b = ((s + ((D * aPrecision) / ann)) - D)
583+ func calc (acc,cur) = {
584+ let $t02349023510 = acc
585+ let y = $t02349023510._1
586+ let found = $t02349023510._2
587+ if ((found != unit))
588+ then acc
589+ else {
590+ let yNext = (((y * y) + c) / ((big2 * y) + b))
591+ let yDiff = absBigInt((yNext - value(y)))
592+ if ((big1 >= yDiff))
593+ then $Tuple2(yNext, cur)
594+ else $Tuple2(yNext, unit)
595+ }
596+ }
597+
598+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
599+ let $t02381723864 = {
600+ let $l = arr
601+ let $s = size($l)
602+ let $acc0 = $Tuple2(D, unit)
603+ func $f0_1 ($a,$i) = if (($i >= $s))
604+ then $a
605+ else calc($a, $l[$i])
606+
607+ func $f0_2 ($a,$i) = if (($i >= $s))
608+ then $a
609+ else throw("List size exceeds 15")
610+
611+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
612+ }
613+ let y = $t02381723864._1
614+ let found = $t02381723864._2
615+ if ((found != unit))
616+ then y
617+ else throw(("Y calculation error, Y = " + toString(y)))
618+ }
619+
620+
686621 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
687- let amId = toBase58String(value(cfgAmountAssetId))
688- let prId = toBase58String(value(cfgPriceAssetId))
689- let lpId = cfgLpAssetId
690- let amtDcm = cfgAmountAssetDecimals
691- let priceDcm = cfgPriceAssetDecimals
692- let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
622+ let poolConfig = gpc()
623+ let amId = poolConfig[idxAmAsId]
624+ let prId = poolConfig[idxPrAsId]
625+ let lpId = poolConfig[idxLPAsId]
626+ let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
627+ let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
628+ let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
693629 let chechEmission = if ((lpAssetEmission > big0))
694630 then true
695631 else throw("initial deposit requires all coins")
697633 then {
698634 let amBalance = getAccBalance(amId)
699635 let prBalance = getAccBalance(prId)
700- let $t02796528427 = if ((txId == ""))
636+ let $t02464725109 = if ((txId == ""))
701637 then $Tuple2(amBalance, prBalance)
702638 else if ((pmtAssetId == amId))
703639 then if ((pmtAmtRaw > amBalance))
708644 then throw("invalid payment amount")
709645 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
710646 else throw("wrong pmtAssetId")
711- let amBalanceOld = $t02796528427._1
712- let prBalanceOld = $t02796528427._2
713- let $t02843328609 = if ((pmtAssetId == amId))
647+ let amBalanceOld = $t02464725109._1
648+ let prBalanceOld = $t02464725109._2
649+ let $t02511525291 = if ((pmtAssetId == amId))
714650 then $Tuple2(pmtAmtRaw, 0)
715651 else if ((pmtAssetId == prId))
716652 then $Tuple2(0, pmtAmtRaw)
717653 else throw("invalid payment")
718- let amAmountRaw = $t02843328609._1
719- let prAmountRaw = $t02843328609._2
720- let $t02861328867 = if (withTakeFee)
654+ let amAmountRaw = $t02511525291._1
655+ let prAmountRaw = $t02511525291._2
656+ let $t02529525549 = if (withTakeFee)
721657 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
722658 else $Tuple3(amAmountRaw, prAmountRaw, 0)
723- let amAmount = $t02861328867._1
724- let prAmount = $t02861328867._2
725- let feeAmount = $t02861328867._3
659+ let amAmount = $t02529525549._1
660+ let prAmount = $t02529525549._2
661+ let feeAmount = $t02529525549._3
726662 let amBalanceNew = (amBalanceOld + amAmount)
727663 let prBalanceNew = (prBalanceOld + prAmount)
728- let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
729- let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
664+ let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
665+ let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
730666 let checkD = if ((D1 > D0))
731667 then true
732668 else throw()
733669 if ((checkD == checkD))
734670 then {
735- let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
671+ let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
736672 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
737673 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
738674 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
749685
750686
751687 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
752- let lpId = toBase58String(value(cfgLpAssetId))
753- let amId = toBase58String(value(cfgAmountAssetId))
754- let prId = toBase58String(value(cfgPriceAssetId))
755- let amDecimals = cfgAmountAssetDecimals
756- let prDecimals = cfgPriceAssetDecimals
757- let poolStatus = cfgPoolStatus
688+ let poolConfig = gpc()
689+ let lpId = poolConfig[idxLPAsId]
690+ let amId = poolConfig[idxAmAsId]
691+ let prId = poolConfig[idxPrAsId]
692+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
693+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
694+ let poolStatus = poolConfig[idxPoolSt]
758695 let userAddress = if ((caller == restContract))
759696 then originCaller
760697 else caller
761698 let pmt = value(payments[0])
762699 let pmtAssetId = value(pmt.assetId)
763700 let pmtAmt = pmt.amount
764- let currentDLp = calcCurrentDLp(big0, big0, big0)
765- if ((currentDLp == currentDLp))
766- then {
767- let txId58 = toBase58String(transactionId)
768- if ((lpId != toBase58String(pmtAssetId)))
769- then throw("Wrong LP")
770- else {
771- let amBalance = getAccBalance(amId)
772- let prBalance = getAccBalance(prId)
773- let $t03097931090 = {
774- let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
775- if ($isInstanceOf(@, "(Int, Int)"))
776- then @
777- else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
778- }
779- if (($t03097931090 == $t03097931090))
701+ let txId58 = toBase58String(transactionId)
702+ if ((lpId != toBase58String(pmtAssetId)))
703+ then throw("Wrong LP")
704+ else {
705+ let amBalance = getAccBalance(amId)
706+ let prBalance = getAccBalance(prId)
707+ let $t02755127662 = {
708+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
709+ if ($isInstanceOf(@, "(Int, Int)"))
710+ then @
711+ else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
712+ }
713+ if (($t02755127662 == $t02755127662))
714+ then {
715+ let feeAmount = $t02755127662._2
716+ let totalGet = $t02755127662._1
717+ let totalAmount = if (if ((minOutAmount > 0))
718+ then (minOutAmount > totalGet)
719+ else false)
720+ then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
721+ else totalGet
722+ let $t02785228159 = if ((outAssetId == amId))
723+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
724+ else if ((outAssetId == prId))
725+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
726+ else throw("invalid out asset id")
727+ let outAm = $t02785228159._1
728+ let outPr = $t02785228159._2
729+ let amBalanceNew = $t02785228159._3
730+ let prBalanceNew = $t02785228159._4
731+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
732+ let curPr = f1(curPrX18, scale8)
733+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
734+ then unit
735+ else fromBase58String(outAssetId)
736+ let sendFeeToMatcher = if ((feeAmount > 0))
737+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
738+ else nil
739+ 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)] ++ sendFeeToMatcher)
740+ if ((state == state))
780741 then {
781- let feeAmount = $t03097931090._2
782- let totalGet = $t03097931090._1
783- let totalAmount = if (if ((minOutAmount > 0))
784- then (minOutAmount > totalGet)
785- else false)
786- then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
787- else totalGet
788- let $t03128031587 = if ((outAssetId == amId))
789- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
790- else if ((outAssetId == prId))
791- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
792- else throw("invalid out asset id")
793- let outAm = $t03128031587._1
794- let outPr = $t03128031587._2
795- let amBalanceNew = $t03128031587._3
796- let prBalanceNew = $t03128031587._4
797- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
798- let curPr = f1(curPrX18, scale8)
799- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
800- then unit
801- else fromBase58String(outAssetId)
802- let sendFeeToMatcher = if ((feeAmount > 0))
803- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
804- else nil
805- 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)] ++ sendFeeToMatcher)
806- if ((state == state))
807- then {
808- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
809- if ((burn == burn))
810- then {
811- let $t03237232722 = {
812- let feeAmountForCalc = if ((this == feeCollectorAddress))
813- then 0
814- else feeAmount
815- let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
816- then true
817- else false
818- if (outInAmountAsset)
819- then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
820- else $Tuple2(0, -((totalGet + feeAmountForCalc)))
821- }
822- let amountAssetBalanceDelta = $t03237232722._1
823- let priceAssetBalanceDelta = $t03237232722._2
824- let $t03272532833 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
825- let refreshDLpActions = $t03272532833._1
826- let updatedDLp = $t03272532833._2
827- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
828- if ((isUpdatedDLpValid == isUpdatedDLpValid))
829- then $Tuple2((state ++ refreshDLpActions), totalAmount)
830- else throw("Strict value is not equal to itself.")
831- }
832- else throw("Strict value is not equal to itself.")
833- }
742+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
743+ if ((burn == burn))
744+ then $Tuple2(state, totalAmount)
834745 else throw("Strict value is not equal to itself.")
835746 }
836747 else throw("Strict value is not equal to itself.")
837748 }
749+ else throw("Strict value is not equal to itself.")
838750 }
839- else throw("Strict value is not equal to itself.")
840751 }
841752
842753
884795 case _ =>
885796 throw("Match error")
886797 }
798+
799+
800+func getY (isReverse,D,poolAmountInBalance) = {
801+ let poolConfig = gpc()
802+ let amId = poolConfig[idxAmAsId]
803+ let prId = poolConfig[idxPrAsId]
804+ let n = big2
805+ let aPrecision = parseBigIntValue(Amult)
806+ let a = (parseBigIntValue(A) * aPrecision)
807+ let xp = if ((isReverse == false))
808+ then [(toBigInt(getAccBalance(amId)) - poolAmountInBalance), toBigInt(getAccBalance(prId))]
809+ else [(toBigInt(getAccBalance(prId)) - poolAmountInBalance), toBigInt(getAccBalance(amId))]
810+ let x = xp[0]
811+ let s = x
812+ let ann = (a * n)
813+ let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
814+ let b = ((s + ((D * aPrecision) / ann)) - D)
815+ func calc (acc,cur) = {
816+ let $t03029130311 = acc
817+ let y = $t03029130311._1
818+ let found = $t03029130311._2
819+ if ((found != unit))
820+ then acc
821+ else {
822+ let yNext = (((y * y) + c) / ((big2 * y) + b))
823+ let yDiff = absBigInt((yNext - value(y)))
824+ if ((big1 >= yDiff))
825+ then $Tuple2(yNext, cur)
826+ else $Tuple2(yNext, unit)
827+ }
828+ }
829+
830+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
831+ let $t03064230689 = {
832+ let $l = arr
833+ let $s = size($l)
834+ let $acc0 = $Tuple2(D, unit)
835+ func $f0_1 ($a,$i) = if (($i >= $s))
836+ then $a
837+ else calc($a, $l[$i])
838+
839+ func $f0_2 ($a,$i) = if (($i >= $s))
840+ then $a
841+ else throw("List size exceeds 15")
842+
843+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
844+ }
845+ let y = $t03064230689._1
846+ let found = $t03064230689._2
847+ if ((found != unit))
848+ then y
849+ else throw(("Y calculation error, Y = " + toString(y)))
850+ }
851+
852+
853+@Callable(i)
854+func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse) = {
855+ let $t03091031506 = if ((isReverse == false))
856+ then {
857+ let assetOut = strf(this, pa())
858+ let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
859+ $Tuple2(assetOut, poolAmountInBalance)
860+ }
861+ else {
862+ let assetOut = strf(this, aa())
863+ let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
864+ $Tuple2(assetOut, poolAmountInBalance)
865+ }
866+ let assetOut = $t03091031506._1
867+ let poolAmountInBalance = $t03091031506._2
868+ let poolConfig = gpc()
869+ let amId = poolConfig[idxAmAsId]
870+ let prId = poolConfig[idxPrAsId]
871+ let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
872+ let D = getD(xp)
873+ let y = getY(isReverse, D, poolAmountInBalance)
874+ let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
875+ let totalGetRaw = max([0, toInt(dy)])
876+ $Tuple2(nil, totalGetRaw)
877+ }
878+
879+
880+
881+@Callable(i)
882+func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo) = {
883+ let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
884+ then true
885+ else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(strf(this, swapContract()))))
886+ then true
887+ else throwErr("Permission denied")]
888+ if ((checks == checks))
889+ then {
890+ let pmt = value(i.payments[0])
891+ let assetIn = if ((pmt.assetId == unit))
892+ then toBase58String(toBytes("WAVES"))
893+ else toBase58String(value(pmt.assetId))
894+ let $t03256432958 = if ((isReverse == false))
895+ then {
896+ let assetOut = strf(this, pa())
897+ let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
898+ $Tuple2(assetOut, poolAmountInBalance)
899+ }
900+ else {
901+ let assetOut = strf(this, aa())
902+ let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
903+ $Tuple2(assetOut, poolAmountInBalance)
904+ }
905+ let assetOut = $t03256432958._1
906+ let poolAmountInBalance = $t03256432958._2
907+ let poolConfig = gpc()
908+ let amId = poolConfig[idxAmAsId]
909+ let prId = poolConfig[idxPrAsId]
910+ let xp = [(toBigInt(getAccBalance(amId)) - toBigInt(value(i.payments[0]).amount)), toBigInt(getAccBalance(prId))]
911+ let D = getD(xp)
912+ let y = getY(isReverse, D, toBigInt(poolAmountInBalance))
913+ let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
914+ let totalGetRaw = max([0, toInt(dy)])
915+ let checkMin = if ((totalGetRaw >= amountOutMin))
916+ then true
917+ else throw("Exchange result is fewer coins than expected")
918+ if ((checkMin == checkMin))
919+ then [ScriptTransfer(addressFromStringValue(addressTo), totalGetRaw, if ((assetIn == "WAVES"))
920+ then unit
921+ else fromBase58String(assetOut))]
922+ else throw("Strict value is not equal to itself.")
923+ }
924+ else throw("Strict value is not equal to itself.")
925+ }
926+
887927
888928
889929 @Callable(i)
941981 else if ((size(i.payments) != 2))
942982 then throw("2 pmnts expd")
943983 else {
944- let amAssetPmt = toBigInt(value(i.payments[0]).amount)
945- let prAssetPmt = toBigInt(value(i.payments[1]).amount)
946- let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
947- if ((amountAssetBalance == amountAssetBalance))
984+ 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, "")
985+ let emitLpAmt = e._2
986+ let lpAssetId = e._7
987+ let state = e._9
988+ let amDiff = e._10
989+ let prDiff = e._11
990+ let amId = e._12
991+ let prId = e._13
992+ let r = invoke(fca, "emit", [emitLpAmt], nil)
993+ if ((r == r))
948994 then {
949- let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
950- if ((priceAssetBalance == priceAssetBalance))
995+ let el = match r {
996+ case legacy: Address =>
997+ invoke(legacy, "emit", [emitLpAmt], nil)
998+ case _ =>
999+ unit
1000+ }
1001+ if ((el == el))
9511002 then {
952- let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
953- if ((lpAssetEmission == lpAssetEmission))
1003+ let sa = if ((amDiff > 0))
1004+ then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
1005+ else nil
1006+ if ((sa == sa))
9541007 then {
955- let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
956- if ((currentDLp == currentDLp))
1008+ let sp = if ((prDiff > 0))
1009+ then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
1010+ else nil
1011+ if ((sp == sp))
9571012 then {
958- 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, "")
959- let emitLpAmt = e._2
960- let lpAssetId = e._7
961- let state = e._9
962- let amDiff = e._10
963- let prDiff = e._11
964- let amId = e._12
965- let prId = e._13
966- let r = invoke(fca, "emit", [emitLpAmt], nil)
967- if ((r == r))
1013+ let lpTrnsfr = if (autoStake)
9681014 then {
969- let el = match r {
970- case legacy: Address =>
971- invoke(legacy, "emit", [emitLpAmt], nil)
972- case _ =>
973- unit
974- }
975- if ((el == el))
976- then {
977- let sa = if ((amDiff > 0))
978- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
979- else nil
980- if ((sa == sa))
981- then {
982- let sp = if ((prDiff > 0))
983- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
984- else nil
985- if ((sp == sp))
986- then {
987- let lpTrnsfr = if (autoStake)
988- then {
989- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
990- if ((ss == ss))
991- then nil
992- else throw("Strict value is not equal to itself.")
993- }
994- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
995- let $t03698237124 = refreshDLpInternal(0, 0, 0)
996- let refreshDLpActions = $t03698237124._1
997- let updatedDLp = $t03698237124._2
998- let check = if ((updatedDLp >= currentDLp))
999- then true
1000- else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
1001- if ((check == check))
1002- then {
1003- let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
1004- if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
1005- then ((state ++ lpTrnsfr) ++ refreshDLpActions)
1006- else throw("Strict value is not equal to itself.")
1007- }
1008- else throw("Strict value is not equal to itself.")
1009- }
1010- else throw("Strict value is not equal to itself.")
1011- }
1012- else throw("Strict value is not equal to itself.")
1013- }
1015+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
1016+ if ((ss == ss))
1017+ then nil
10141018 else throw("Strict value is not equal to itself.")
10151019 }
1016- else throw("Strict value is not equal to itself.")
1020+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1021+ (state ++ lpTrnsfr)
10171022 }
10181023 else throw("Strict value is not equal to itself.")
10191024 }
10511056 else throwErr("exactly 1 payment are expected")]
10521057 if ((checks == checks))
10531058 then {
1054- let amId = toBase58String(value(cfgAmountAssetId))
1055- let prId = toBase58String(value(cfgPriceAssetId))
1056- let lpId = cfgLpAssetId
1057- let amDecimals = cfgAmountAssetDecimals
1058- let prDecimals = cfgPriceAssetDecimals
1059+ let poolConfig = gpc()
1060+ let amId = poolConfig[idxAmAsId]
1061+ let prId = poolConfig[idxPrAsId]
1062+ let lpId = fromBase58String(poolConfig[idxLPAsId])
1063+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
1064+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
10591065 let userAddress = if ((i.caller == this))
10601066 then i.originCaller
10611067 else i.caller
10621068 let pmt = value(i.payments[0])
10631069 let pmtAssetId = toBase58String(value(pmt.assetId))
10641070 let pmtAmt = pmt.amount
1065- let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
1066- then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
1067- else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
1068- if ((currentDLp == currentDLp))
1071+ let $t03777737935 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1072+ if (($t03777737935 == $t03777737935))
10691073 then {
1070- let $t03876538923 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1071- if (($t03876538923 == $t03876538923))
1074+ let feeAmount = $t03777737935._3
1075+ let state = $t03777737935._2
1076+ let estimLP = $t03777737935._1
1077+ let emitLpAmt = if (if ((minOutAmount > 0))
1078+ then (minOutAmount > estimLP)
1079+ else false)
1080+ then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
1081+ else estimLP
1082+ let e = invoke(fca, "emit", [emitLpAmt], nil)
1083+ if ((e == e))
10721084 then {
1073- let feeAmount = $t03876538923._3
1074- let state = $t03876538923._2
1075- let estimLP = $t03876538923._1
1076- let emitLpAmt = if (if ((minOutAmount > 0))
1077- then (minOutAmount > estimLP)
1078- else false)
1079- then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
1080- else estimLP
1081- let e = invoke(fca, "emit", [emitLpAmt], nil)
1082- if ((e == e))
1085+ let el = match e {
1086+ case legacy: Address =>
1087+ invoke(legacy, "emit", [emitLpAmt], nil)
1088+ case _ =>
1089+ unit
1090+ }
1091+ if ((el == el))
10831092 then {
1084- let el = match e {
1085- case legacy: Address =>
1086- invoke(legacy, "emit", [emitLpAmt], nil)
1087- case _ =>
1088- unit
1089- }
1090- if ((el == el))
1093+ let lpTrnsfr = if (autoStake)
10911094 then {
1092- let lpTrnsfr = if (autoStake)
1093- then {
1094- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
1095- if ((ss == ss))
1096- then nil
1097- else throw("Strict value is not equal to itself.")
1098- }
1099- else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
1100- let sendFeeToMatcher = if ((feeAmount > 0))
1101- then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
1102- else nil
1103- let $t03973840087 = if ((this == feeCollectorAddress))
1104- then $Tuple2(0, 0)
1105- else {
1106- let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
1107- then true
1108- else false
1109- if (paymentInAmountAsset)
1110- then $Tuple2(-(feeAmount), 0)
1111- else $Tuple2(0, -(feeAmount))
1112- }
1113- let amountAssetBalanceDelta = $t03973840087._1
1114- let priceAssetBalanceDelta = $t03973840087._2
1115- let $t04009040198 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1116- let refreshDLpActions = $t04009040198._1
1117- let updatedDLp = $t04009040198._2
1118- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1119- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1120- then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
1095+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
1096+ if ((ss == ss))
1097+ then nil
11211098 else throw("Strict value is not equal to itself.")
11221099 }
1123- else throw("Strict value is not equal to itself.")
1100+ else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
1101+ let sendFeeToMatcher = if ((feeAmount > 0))
1102+ then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
1103+ else nil
1104+ $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
11241105 }
11251106 else throw("Strict value is not equal to itself.")
11261107 }
11401121 then throw("2 pmnts expd")
11411122 else {
11421123 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, "")
1143- let state = estPut._9
1144- let amAssetPmt = toBigInt(value(i.payments[0]).amount)
1145- let prAssetPmt = toBigInt(value(i.payments[1]).amount)
1146- let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
1147- if ((currentDLp == currentDLp))
1148- then {
1149- let $t04122841293 = refreshDLpInternal(0, 0, 0)
1150- let refreshDLpActions = $t04122841293._1
1151- let updatedDLp = $t04122841293._2
1152- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1153- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1154- then (state ++ refreshDLpActions)
1155- else throw("Strict value is not equal to itself.")
1156- }
1157- else throw("Strict value is not equal to itself.")
1124+ estPut._9
11581125 }
11591126
11601127
11611128
11621129 @Callable(i)
11631130 func get () = {
1164- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1165- if ((currentDLp == currentDLp))
1166- then {
1167- let r = cg(i)
1168- let outAmtAmt = r._1
1169- let outPrAmt = r._2
1170- let pmtAmt = r._3
1171- let pmtAssetId = r._4
1172- let state = r._5
1173- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1174- if ((b == b))
1175- then {
1176- let $t04246642548 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1177- let refreshDLpActions = $t04246642548._1
1178- let updatedDLp = $t04246642548._2
1179- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1180- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1181- then (state ++ refreshDLpActions)
1182- else throw("Strict value is not equal to itself.")
1183- }
1184- else throw("Strict value is not equal to itself.")
1185- }
1131+ let r = cg(i)
1132+ let outAmtAmt = r._1
1133+ let outPrAmt = r._2
1134+ let pmtAmt = r._3
1135+ let pmtAssetId = r._4
1136+ let state = r._5
1137+ let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1138+ if ((b == b))
1139+ then state
11861140 else throw("Strict value is not equal to itself.")
11871141 }
11881142
12101164 else throwErr("exactly 1 payment are expected")]
12111165 if ((checks == checks))
12121166 then {
1213- let $t04316643321 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1214- let state = $t04316643321._1
1215- let totalAmount = $t04316643321._2
1167+ let $t04055740712 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1168+ let state = $t04055740712._1
1169+ let totalAmount = $t04055740712._2
12161170 $Tuple2(state, totalAmount)
12171171 }
12181172 else throw("Strict value is not equal to itself.")
12211175
12221176
12231177 @Callable(i)
1224-func refreshDLp () = {
1225- let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
1226- let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
1227- then unit
1228- else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
1229- if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
1230- then {
1231- let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1232- let $t04384543909 = refreshDLpInternal(0, 0, 0)
1233- let dLpUpdateActions = $t04384543909._1
1234- let updatedDLp = $t04384543909._2
1235- let actions = if ((dLp != updatedDLp))
1236- then dLpUpdateActions
1237- else throwErr("nothing to refresh")
1238- $Tuple2(actions, toString(updatedDLp))
1239- }
1240- else throw("Strict value is not equal to itself.")
1241- }
1242-
1243-
1244-
1245-@Callable(i)
12461178 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
1247- let amId = toBase58String(value(cfgAmountAssetId))
1248- let prId = toBase58String(value(cfgPriceAssetId))
1249- let lpId = toBase58String(value(cfgLpAssetId))
1179+ let poolConfig = gpc()
1180+ let amId = poolConfig[idxAmAsId]
1181+ let prId = poolConfig[idxPrAsId]
1182+ let lpId = poolConfig[idxLPAsId]
12501183 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
12511184 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
12521185 let D0 = getD(xp)
12591192 let newY = getYD(xp, index, D1)
12601193 let dy = (xp[index] - newY)
12611194 let totalGetRaw = max([0, toInt((dy - big1))])
1262- let $t04483944894 = takeFee(totalGetRaw, outFee)
1263- let totalGet = $t04483944894._1
1264- let feeAmount = $t04483944894._2
1195+ let $t04150241557 = takeFee(totalGetRaw, outFee)
1196+ let totalGet = $t04150241557._1
1197+ let feeAmount = $t04150241557._2
12651198 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12661199 }
12671200
12691202
12701203 @Callable(i)
12711204 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
1272- let amId = toBase58String(value(cfgAmountAssetId))
1273- let prId = toBase58String(value(cfgPriceAssetId))
1274- let lpId = toBase58String(value(cfgLpAssetId))
1205+ let poolConfig = gpc()
1206+ let amId = poolConfig[idxAmAsId]
1207+ let prId = poolConfig[idxPrAsId]
1208+ let lpId = poolConfig[idxLPAsId]
12751209 let amBalance = getAccBalance(amId)
12761210 let prBalance = getAccBalance(prId)
1277- let $t04526945384 = {
1211+ let $t04190242017 = {
12781212 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12791213 if ($isInstanceOf(@, "(Int, Int)"))
12801214 then @
12811215 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12821216 }
1283- let totalGet = $t04526945384._1
1284- let feeAmount = $t04526945384._2
1217+ let totalGet = $t04190242017._1
1218+ let feeAmount = $t04190242017._2
12851219 let r = ego("", lpId, lpAssetAmount, this)
12861220 let outAmAmt = r._1
12871221 let outPrAmt = r._2
13091243 else if ((noLessThenPriceAsset > outPrAmt))
13101244 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
13111245 else {
1312- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1313- if ((currentDLp == currentDLp))
1314- then {
1315- let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1316- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1317- then {
1318- let $t04655046631 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1319- let refreshDLpActions = $t04655046631._1
1320- let updatedDLp = $t04655046631._2
1321- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1322- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1323- then (state ++ refreshDLpActions)
1324- else throw("Strict value is not equal to itself.")
1325- }
1326- else throw("Strict value is not equal to itself.")
1327- }
1246+ let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1247+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1248+ then state
13281249 else throw("Strict value is not equal to itself.")
13291250 }
13301251 }
13381259 else true
13391260 if ((checkPayments == checkPayments))
13401261 then {
1262+ let cfg = gpc()
13411263 let factoryCfg = gfc()
1342- let lpAssetId = cfgLpAssetId
1264+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
13431265 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
1344- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1345- if ((currentDLp == currentDLp))
1266+ let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1267+ if ((unstakeInv == unstakeInv))
13461268 then {
1347- let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1348- if ((unstakeInv == unstakeInv))
1269+ let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1270+ let sts = parseIntValue(r._9)
1271+ let state = r._10
1272+ let v = if (if (igs())
1273+ then true
1274+ else (sts == PoolShutdown))
1275+ then throw(("Blocked: " + toString(sts)))
1276+ else true
1277+ if ((v == v))
13491278 then {
1350- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1351- let outAmAmt = r._1
1352- let outPrAmt = r._2
1353- let sts = parseIntValue(r._9)
1354- let state = r._10
1355- let v = if (if (igs())
1356- then true
1357- else (sts == PoolShutdown))
1358- then throw(("Blocked: " + toString(sts)))
1359- else true
1360- if ((v == v))
1361- then {
1362- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1363- if ((burnA == burnA))
1364- then {
1365- let $t04765847739 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1366- let refreshDLpActions = $t04765847739._1
1367- let updatedDLp = $t04765847739._2
1368- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1369- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1370- then (state ++ refreshDLpActions)
1371- else throw("Strict value is not equal to itself.")
1372- }
1373- else throw("Strict value is not equal to itself.")
1374- }
1279+ let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1280+ if ((burnA == burnA))
1281+ then state
13751282 else throw("Strict value is not equal to itself.")
13761283 }
13771284 else throw("Strict value is not equal to itself.")
13951302 else throw("no payments are expected")]
13961303 if ((checks == checks))
13971304 then {
1398- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1399- if ((currentDLp == currentDLp))
1305+ let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1306+ if ((unstakeInv == unstakeInv))
14001307 then {
1401- let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1402- if ((unstakeInv == unstakeInv))
1308+ let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1309+ let outAmAmt = res._1
1310+ let outPrAmt = res._2
1311+ let state = res._10
1312+ let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1313+ then true
1314+ else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1315+ then true
1316+ else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1317+ if ((checkAmounts == checkAmounts))
14031318 then {
1404- let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1405- let outAmAmt = res._1
1406- let outPrAmt = res._2
1407- let state = res._10
1408- let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1409- then true
1410- else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1411- then true
1412- else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1413- if ((checkAmounts == checkAmounts))
1414- then {
1415- let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1416- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1417- then {
1418- let $t04899049071 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1419- let refreshDLpActions = $t04899049071._1
1420- let updatedDLp = $t04899049071._2
1421- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1422- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1423- then (state ++ refreshDLpActions)
1424- else throw("Strict value is not equal to itself.")
1425- }
1426- else throw("Strict value is not equal to itself.")
1427- }
1319+ let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1320+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1321+ then state
14281322 else throw("Strict value is not equal to itself.")
14291323 }
14301324 else throw("Strict value is not equal to itself.")
14581352 else throwErr("no payments are expected")]
14591353 if ((checks == checks))
14601354 then {
1355+ let cfg = gpc()
14611356 let factoryCfg = gfc()
1462- let lpAssetId = cfgLpAssetId
1357+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
14631358 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
14641359 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14651360 if ((unstakeInv == unstakeInv))
14661361 then {
1467- let $t04996650154 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1468- let state = $t04996650154._1
1469- let totalAmount = $t04996650154._2
1362+ let $t04585546043 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1363+ let state = $t04585546043._1
1364+ let totalAmount = $t04585546043._2
14701365 $Tuple2(state, totalAmount)
14711366 }
14721367 else throw("Strict value is not equal to itself.")
14781373
14791374 @Callable(i)
14801375 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1481- let $t05028250385 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1482- let lpAmount = $t05028250385._1
1483- let state = $t05028250385._2
1484- let feeAmount = $t05028250385._3
1485- let bonus = $t05028250385._4
1376+ let poolConfig = gpc()
1377+ let amId = poolConfig[idxAmAsId]
1378+ let prId = poolConfig[idxPrAsId]
1379+ let lpId = poolConfig[idxLPAsId]
1380+ let $t04630246405 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1381+ let lpAmount = $t04630246405._1
1382+ let state = $t04630246405._2
1383+ let feeAmount = $t04630246405._3
1384+ let bonus = $t04630246405._4
14861385 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14871386 }
14881387
14901389
14911390 @Callable(i)
14921391 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1493- let $t05053350637 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1494- let lpAmount = $t05053350637._1
1495- let state = $t05053350637._2
1496- let feeAmount = $t05053350637._3
1497- let bonus = $t05053350637._4
1392+ let poolConfig = gpc()
1393+ let amId = poolConfig[idxAmAsId]
1394+ let prId = poolConfig[idxPrAsId]
1395+ let lpId = poolConfig[idxLPAsId]
1396+ let $t04668446788 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1397+ let lpAmount = $t04668446788._1
1398+ let state = $t04668446788._2
1399+ let feeAmount = $t04668446788._3
1400+ let bonus = $t04668446788._4
14981401 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14991402 }
15001403
15791482 match tx {
15801483 case order: Order =>
15811484 let matcherPub = mp()
1582- let $t05342953498 = validateMatcherOrderAllowed(order)
1583- let orderValid = $t05342953498._1
1584- let orderValidInfo = $t05342953498._2
1485+ let orderValid = moa(order)
15851486 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15861487 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15871488 if (if (if (orderValid)
15901491 then matcherValid
15911492 else false)
15921493 then true
1593- else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
1494+ else toe(orderValid, senderValid, matcherValid)
15941495 case s: SetScriptTransaction =>
1595- if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
1496+ let newHash = blake2b256(value(s.script))
1497+ let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
1498+ let currentHash = scriptHash(this)
1499+ if (if ((allowedHash == newHash))
1500+ then (currentHash != newHash)
1501+ else false)
15961502 then true
1597- else {
1598- let newHash = blake2b256(value(s.script))
1599- let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
1600- let currentHash = scriptHash(this)
1601- if ((allowedHash == newHash))
1602- then (currentHash != newHash)
1603- else false
1604- }
1503+ else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16051504 case _ =>
16061505 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16071506 }
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)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
17-
18-let big3 = toBigInt(3)
19-
20-let big4 = toBigInt(4)
2117
2218 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2319
2420 let wavesString = "WAVES"
2521
2622 let Amult = "100"
2723
2824 let Dconv = "1"
2925
3026 let SEP = "__"
3127
3228 let EMPTY = ""
3329
3430 let PoolActive = 1
3531
3632 let PoolPutDis = 2
3733
3834 let PoolMatcherDis = 3
3935
4036 let PoolShutdown = 4
4137
4238 let idxPoolAddress = 1
4339
4440 let idxPoolSt = 2
4541
4642 let idxLPAsId = 3
4743
4844 let idxAmAsId = 4
4945
5046 let idxPrAsId = 5
5147
5248 let idxAmtAsDcm = 6
5349
5450 let idxPriceAsDcm = 7
5551
5652 let idxIAmtAsId = 8
5753
5854 let idxIPriceAsId = 9
5955
6056 let idxFactStakCntr = 1
6157
6258 let idxFactoryRestCntr = 6
6359
6460 let idxFactSlippCntr = 7
6561
6662 let idxFactGwxRewCntr = 10
6763
6864 let feeDefault = fraction(10, scale8, 10000)
6965
7066 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7167
7268
73-func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
74-
75-
7669 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
77-
78-
79-func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
80-
81-
82-func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
83-
84-
85-func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
8670
8771
8872 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
8973
9074
9175 func abs (val) = if ((zeroBigInt > val))
9276 then -(val)
9377 else val
9478
9579
9680 func absBigInt (val) = if ((zeroBigInt > val))
9781 then -(val)
9882 else val
9983
10084
10185 func fc () = "%s__factoryContract"
10286
10387
10488 func mpk () = "%s__managerPublicKey"
10589
10690
10791 func pmpk () = "%s__pendingManagerPublicKey"
10892
10993
11094 func pl () = "%s%s__price__last"
11195
11296
11397 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
11498
11599
116100 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
117101
118102
119103 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
120104
121105
122106 func aa () = "%s__amountAsset"
123107
124108
125109 func pa () = "%s__priceAsset"
126110
127111
128112 func amp () = "%s__amp"
129113
130114
131115 func ada () = "%s__addonAddr"
132116
133117
134-let keyFee = "%s__fee"
118+func swapContract () = "%s__swapContract"
135119
136-let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
137-
138-let keyDLp = makeString(["%s", "dLp"], SEP)
139-
140-let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
141-
142-let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
143-
144-let dLpRefreshDelayDefault = 30
145-
146-let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
147120
148121 func fcfg () = "%s__factoryConfig"
149122
150123
151124 func mtpk () = "%s%s__matcher__publicKey"
152125
153126
154127 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
155128
156129
157130 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
158131
159132
160133 func aps () = "%s__shutdown"
161134
162135
163136 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
164137
165138
166139 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
167140
168141
169-func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
142+func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
143+
144+
145+func str (val) = match val {
146+ case valStr: String =>
147+ valStr
148+ case _ =>
149+ throw("fail cast to String")
150+}
170151
171152
172153 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
173154
174155
175156 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
176157
177158
178159 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
179-
180-
181-func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
182160
183161
184162 let fca = addressFromStringValue(strf(this, fc()))
185163
186164 let inFee = {
187165 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
188166 if ($isInstanceOf(@, "Int"))
189167 then @
190168 else throw(($getType(@) + " couldn't be cast to Int"))
191169 }
192170
193171 let outFee = {
194172 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
195173 if ($isInstanceOf(@, "Int"))
196174 then @
197175 else throw(($getType(@) + " couldn't be cast to Int"))
198176 }
199177
200178 let A = strf(this, amp())
201179
202180 func igs () = valueOrElse(getBoolean(fca, aps()), false)
203181
204182
205183 func mp () = fromBase58String(strf(fca, mtpk()))
206184
207185
208186 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
209187
210188 func gpc () = {
211189 let amtAs = strf(this, aa())
212190 let priceAs = strf(this, pa())
213191 let iPriceAs = intf(fca, mba(priceAs))
214192 let iAmtAs = intf(fca, mba(amtAs))
215193 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
216194 }
217195
218196
219197 func parseAssetId (input) = if ((input == wavesString))
220198 then unit
221199 else fromBase58String(input)
222200
223201
224202 func assetIdToString (input) = if ((input == unit))
225203 then wavesString
226204 else toBase58String(value(input))
227205
228206
229-func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
207+func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
230208
231209
232210 let poolConfigParsed = parsePoolConfig(gpc())
233211
234-let $t079658194 = poolConfigParsed
212+let $t069527138 = poolConfigParsed
235213
236-let cfgPoolAddress = $t079658194._1
214+let cfgPoolAddress = $t069527138._1
237215
238-let cfgPoolStatus = $t079658194._2
216+let cfgPoolStatus = $t069527138._2
239217
240-let cfgLpAssetId = $t079658194._3
218+let cfgLpAssetId = $t069527138._3
241219
242-let cfgAmountAssetId = $t079658194._4
220+let cfgAmountAssetId = $t069527138._4
243221
244-let cfgPriceAssetId = $t079658194._5
222+let cfgPriceAssetId = $t069527138._5
245223
246-let cfgAmountAssetDecimals = $t079658194._6
224+let cfgAmountAssetDecimals = $t069527138._6
247225
248-let cfgPriceAssetDecimals = $t079658194._7
249-
250-let cfgInAmountAssedId = $t079658194._8
251-
252-let cfgInPriceAssetId = $t079658194._9
226+let cfgPriceAssetDecimals = $t069527138._7
253227
254228 func gfc () = split(strf(fca, fcfg()), SEP)
255229
256230
257231 let factoryConfig = gfc()
258232
259233 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
260234
261235 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
262236
263237 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
264238
265239 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
266240
267241 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)
268242
269243
270244 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)
271245
272246
273247 func getAccBalance (assetId) = if ((assetId == "WAVES"))
274248 then wavesBalance(this).available
275249 else assetBalance(this, fromBase58String(assetId))
276250
277251
278252 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
279-
280-
281-func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
282253
283254
284255 func vad (A1,A2,slippage) = {
285256 let diff = fraction((A1 - A2), scale8BigInt, A2)
286257 let pass = ((slippage - abs(diff)) > zeroBigInt)
287258 if (!(pass))
288259 then throw(("Big slpg: " + toString(diff)))
289260 else $Tuple2(pass, min([A1, A2]))
290261 }
291262
292263
293264 func vd (D1,D0,slpg) = {
294265 let diff = fraction(D0, scale8BigInt, D1)
295266 let fail = (slpg > diff)
296267 if (if (fail)
297268 then true
298269 else (D0 > D1))
299270 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
300271 else fail
301272 }
302273
303274
304275 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
305276 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
306277 let prAsAmtX18 = t1(prAmt, prAssetDcm)
307278 cpbi(prAsAmtX18, amtAsAmtX18)
308279 }
309280
310281
311282 func calcPrices (amAmt,prAmt,lpAmt) = {
312- let amtAsDcm = cfgAmountAssetDecimals
313- let prAsDcm = cfgPriceAssetDecimals
283+ let cfg = gpc()
284+ let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
285+ let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
314286 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
315287 let amAmtX18 = t1(amAmt, amtAsDcm)
316288 let prAmtX18 = t1(prAmt, prAsDcm)
317289 let lpAmtX18 = t1(lpAmt, scale8)
318290 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
319291 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
320292 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
321293 }
322294
323295
324296 func calculatePrices (amAmt,prAmt,lpAmt) = {
325297 let p = calcPrices(amAmt, prAmt, lpAmt)
326298 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
327299 }
328300
329301
330302 func takeFee (amount,fee) = {
331303 let feeAmount = if ((fee == 0))
332304 then 0
333305 else fraction(amount, fee, scale8)
334306 $Tuple2((amount - feeAmount), feeAmount)
335307 }
336308
337309
338-func getD (xp) = {
339- let xp0 = xp[0]
340- let xp1 = xp[1]
341- let s = (xp0 + xp1)
342- if ((s == big0))
343- then big0
344- else {
345- let a = parseIntValue(A)
346- let ann = (a * 2)
347- let p = fraction(xp0, xp1, big1)
348- let xp0_xp1_n_n = fraction(p, big4, big1)
349- let ann_s = fraction(toBigInt(ann), s, big1)
350- let ann_1 = toBigInt((ann - 1))
351- func calcDNext (d) = {
352- let dd = fraction(d, d, big1)
353- let ddd = fraction(dd, d, big1)
354- let dp = fraction(ddd, big1, xp0_xp1_n_n)
355- fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
356- }
357-
358- func calc (acc,i) = if (acc._2)
359- then acc
360- else {
361- let d = acc._1
362- let dNext = calcDNext(d)
363- let dDiffRaw = (dNext - value(d))
364- let dDiff = if ((big0 > dDiffRaw))
365- then -(dDiffRaw)
366- else dDiffRaw
367- if ((big1 >= dDiff))
368- then $Tuple2(dNext, true)
369- else $Tuple2(dNext, false)
370- }
371-
372- let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
373- let $t01269112739 = {
374- let $l = arr
375- let $s = size($l)
376- let $acc0 = $Tuple2(s, false)
377- func $f0_1 ($a,$i) = if (($i >= $s))
378- then $a
379- else calc($a, $l[$i])
380-
381- func $f0_2 ($a,$i) = if (($i >= $s))
382- then $a
383- else throw("List size exceeds 15")
384-
385- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
386- }
387- let d = $t01269112739._1
388- let found = $t01269112739._2
389- if (found)
390- then d
391- else throw(("D calculation error, D = " + toString(d)))
392- }
393- }
394-
395-
396310 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
397- let lpId = cfgLpAssetId
398- let amId = toBase58String(value(cfgAmountAssetId))
399- let prId = toBase58String(value(cfgPriceAssetId))
400- let amDcm = cfgAmountAssetDecimals
401- let prDcm = cfgPriceAssetDecimals
402- let sts = toString(cfgPoolStatus)
403- let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
404- if ((toBase58String(lpId) != pmtAssetId))
311+ let cfg = gpc()
312+ let lpId = cfg[idxLPAsId]
313+ let amId = cfg[idxAmAsId]
314+ let prId = cfg[idxPrAsId]
315+ let amDcm = parseIntValue(cfg[idxAmtAsDcm])
316+ let prDcm = parseIntValue(cfg[idxPriceAsDcm])
317+ let sts = cfg[idxPoolSt]
318+ let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
319+ if ((lpId != pmtAssetId))
405320 then throw("Wrong pmt asset")
406321 else {
407322 let amBalance = getAccBalance(amId)
408323 let amBalanceX18 = t1(amBalance, amDcm)
409324 let prBalance = getAccBalance(prId)
410325 let prBalanceX18 = t1(prBalance, prDcm)
411326 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
412327 let curPrice = f1(curPriceX18, scale8)
413328 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
414329 let lpEmissX18 = t1(lpEmiss, scale8)
415330 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
416331 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
417- let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
418- let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
332+ let outAmAmt = f1(outAmAmtX18, amDcm)
333+ let outPrAmt = f1(outPrAmtX18, prDcm)
419334 let state = if ((txId58 == ""))
420335 then nil
421336 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
422337 then unit
423338 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
424339 then unit
425340 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)]
426341 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
427342 }
428343 }
429344
430345
431346 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
432- let lpId = cfgLpAssetId
433- let amIdStr = toBase58String(value(cfgAmountAssetId))
434- let prIdStr = toBase58String(value(cfgPriceAssetId))
435- let inAmIdStr = cfgInAmountAssedId
436- let inPrIdStr = cfgInPriceAssetId
437- let amtDcm = cfgAmountAssetDecimals
438- let priceDcm = cfgPriceAssetDecimals
439- let sts = toString(cfgPoolStatus)
347+ let cfg = gpc()
348+ let lpId = fromBase58String(cfg[idxLPAsId])
349+ let amIdStr = cfg[idxAmAsId]
350+ let prIdStr = cfg[idxPrAsId]
351+ let inAmIdStr = cfg[idxIAmtAsId]
352+ let inPrIdStr = cfg[idxIPriceAsId]
353+ let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
354+ let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
355+ let sts = cfg[idxPoolSt]
440356 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
441357 let amBalance = if (isEval)
442358 then getAccBalance(amIdStr)
443359 else if (if (isOneAsset)
444360 then (pmtId == amIdStr)
445361 else false)
446362 then (getAccBalance(amIdStr) - pmtAmt)
447363 else if (isOneAsset)
448364 then getAccBalance(amIdStr)
449365 else (getAccBalance(amIdStr) - inAmAmt)
450366 let prBalance = if (isEval)
451367 then getAccBalance(prIdStr)
452368 else if (if (isOneAsset)
453369 then (pmtId == prIdStr)
454370 else false)
455371 then (getAccBalance(prIdStr) - pmtAmt)
456372 else if (isOneAsset)
457373 then getAccBalance(prIdStr)
458374 else (getAccBalance(prIdStr) - inPrAmt)
459375 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
460376 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
461377 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
462378 let amBalanceX18 = t1(amBalance, amtDcm)
463379 let prBalanceX18 = t1(prBalance, priceDcm)
464- let D0 = getD([amBalanceX18, prBalanceX18])
465380 let r = if ((lpEm == 0))
466381 then {
467- let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
468- let checkD = if ((D1 > D0))
469- then true
470- else throw("D1 should be greater than D0")
471- if ((checkD == checkD))
472- then {
473- let curPriceX18 = zeroBigInt
474- let slippageX18 = zeroBigInt
475- let lpAmtX18 = D1
476- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
477- }
478- else throw("Strict value is not equal to itself.")
382+ let curPriceX18 = zeroBigInt
383+ let slippageX18 = zeroBigInt
384+ let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
385+ $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
479386 }
480387 else {
481388 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
482389 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
483390 let slippageX18 = t1(slippage, scale8)
484391 if (if (if (validateSlippage)
485392 then (curPriceX18 != zeroBigInt)
486393 else false)
487394 then (slippageRealX18 > slippageX18)
488395 else false)
489396 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
490397 else {
491398 let lpEmissionX18 = t1(lpEm, scale8)
492- let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
493- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
399+ let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
400+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
494401 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
495402 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
496403 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
497404 let expAmtAssetAmtX18 = expectedAmts._1
498405 let expPriceAssetAmtX18 = expectedAmts._2
499- let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
500- let checkD = if ((D1 > D0))
501- then true
502- else throw("D1 should be greater than D0")
503- if ((checkD == checkD))
504- then {
505- let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
506- $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
507- }
508- else throw("Strict value is not equal to itself.")
406+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
407+ $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
509408 }
510409 }
511410 let calcLpAmt = r._1
512411 let calcAmAssetPmt = r._2
513412 let calcPrAssetPmt = r._3
514413 let curPrice = f1(r._4, scale8)
515414 let slippageCalc = f1(r._5, scale8)
516415 if ((0 >= calcLpAmt))
517416 then throw("LP <= 0")
518417 else {
519418 let emitLpAmt = if (!(emitLp))
520419 then 0
521420 else calcLpAmt
522421 let amDiff = (inAmAmt - calcAmAssetPmt)
523422 let prDiff = (inPrAmt - calcPrAssetPmt)
524- let $t02057820923 = if (if (isOneAsset)
423+ let $t01760517950 = if (if (isOneAsset)
525424 then (pmtId == amIdStr)
526425 else false)
527426 then $Tuple2(pmtAmt, 0)
528427 else if (if (isOneAsset)
529428 then (pmtId == prIdStr)
530429 else false)
531430 then $Tuple2(0, pmtAmt)
532431 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
533- let writeAmAmt = $t02057820923._1
534- let writePrAmt = $t02057820923._2
432+ let writeAmAmt = $t01760517950._1
433+ let writePrAmt = $t01760517950._2
535434 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))]
536435 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
537436 }
538437 }
539438
540439
541-func getYD (xp,i,D) = {
542- let n = big2
543- let x = xp[if ((i == 0))
544- then 1
545- else 0]
546- let aPrecision = parseBigIntValue(Amult)
547- let a = (parseBigIntValue(A) * aPrecision)
548- let s = x
549- let ann = (a * n)
550- let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
551- let b = ((s + ((D * aPrecision) / ann)) - D)
552- func calc (acc,cur) = {
553- let $t02211822138 = acc
554- let y = $t02211822138._1
555- let found = $t02211822138._2
556- if ((found != unit))
557- then acc
558- else {
559- let yNext = (((y * y) + c) / ((big2 * y) + b))
560- let yDiff = absBigInt((yNext - value(y)))
561- if ((big1 >= yDiff))
562- then $Tuple2(yNext, cur)
563- else $Tuple2(yNext, unit)
564- }
565- }
566-
567- let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
568- let $t02244522492 = {
569- let $l = arr
570- let $s = size($l)
571- let $acc0 = $Tuple2(D, unit)
572- func $f0_1 ($a,$i) = if (($i >= $s))
573- then $a
574- else calc($a, $l[$i])
575-
576- func $f0_2 ($a,$i) = if (($i >= $s))
577- then $a
578- else throw("List size exceeds 15")
579-
580- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
581- }
582- let y = $t02244522492._1
583- let found = $t02244522492._2
584- if ((found != unit))
585- then y
586- else throw(("Y calculation error, Y = " + toString(y)))
587- }
588-
589-
590-func calcDLp (amountBalance,priceBalance,lpEmission) = {
591- let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
592- if ((lpEmission == big0))
593- then big0
594- else updatedDLp
595- }
596-
597-
598-func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
599- let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
600- let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
601- let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
602- let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
603- currentDLp
604- }
605-
606-
607-func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
608- let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
609- let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
610- let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
611- let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
612- let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
613- $Tuple2(actions, updatedDLp)
614- }
615-
616-
617-func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
618- then true
619- else throwErr("updated DLp lower than current DLp")
620-
621-
622-func validateMatcherOrderAllowed (order) = {
623- let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
624- let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
625- let amountAssetAmount = order.amount
626- let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
627- let $t02469024902 = if ((order.orderType == Buy))
628- then $Tuple2(amountAssetAmount, -(priceAssetAmount))
629- else $Tuple2(-(amountAssetAmount), priceAssetAmount)
630- let amountAssetBalanceDelta = $t02469024902._1
631- let priceAssetBalanceDelta = $t02469024902._2
440+func moa (order) = {
441+ let cfg = gpc()
442+ let amtAsId = cfg[idxAmAsId]
443+ let prAsId = cfg[idxPrAsId]
444+ let sts = parseIntValue(cfg[idxPoolSt])
445+ let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
446+ let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
447+ let accAmtAsBalance = getAccBalance(amtAsId)
448+ let accPrAsBalance = getAccBalance(prAsId)
449+ let curPriceX18 = if ((order.orderType == Buy))
450+ then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
451+ else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
452+ let curPrice = f1(curPriceX18, scale8)
632453 if (if (if (igs())
633454 then true
634- else (cfgPoolStatus == PoolMatcherDis))
455+ else (sts == PoolMatcherDis))
635456 then true
636- else (cfgPoolStatus == PoolShutdown))
457+ else (sts == PoolShutdown))
637458 then throw("Admin blocked")
638- else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
639- then true
640- else (order.assetPair.priceAsset != cfgPriceAssetId))
641- then throw("Wr assets")
642- else {
643- let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
644- let $t02524425344 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
645- let unusedActions = $t02524425344._1
646- let dLpNew = $t02524425344._2
647- let isOrderValid = (dLpNew >= dLp)
648- let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta)], "")
649- $Tuple2(isOrderValid, info)
650- }
459+ else {
460+ let orAmtAsset = order.assetPair.amountAsset
461+ let orAmtAsStr = if ((orAmtAsset == unit))
462+ then "WAVES"
463+ else toBase58String(value(orAmtAsset))
464+ let orPrAsset = order.assetPair.priceAsset
465+ let orPrAsStr = if ((orPrAsset == unit))
466+ then "WAVES"
467+ else toBase58String(value(orPrAsset))
468+ if (if ((orAmtAsStr != amtAsId))
469+ then true
470+ else (orPrAsStr != prAsId))
471+ then throw("Wr assets")
472+ else {
473+ let orderPrice = order.price
474+ let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
475+ let castOrderPrice = ts(orderPrice, scale8, priceDcm)
476+ let isOrderPriceValid = if ((order.orderType == Buy))
477+ then (curPrice >= castOrderPrice)
478+ else (castOrderPrice >= curPrice)
479+ true
480+ }
481+ }
651482 }
652483
653484
654485 func cg (i) = if ((size(i.payments) != 1))
655486 then throw("1 pmnt exp")
656487 else {
657488 let pmt = value(i.payments[0])
658489 let pmtAssetId = value(pmt.assetId)
659490 let pmtAmt = pmt.amount
660491 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
661492 let outAmAmt = r._1
662493 let outPrAmt = r._2
663494 let sts = parseIntValue(r._9)
664495 let state = r._10
665496 if (if (igs())
666497 then true
667498 else (sts == PoolShutdown))
668499 then throw(("Admin blocked: " + toString(sts)))
669500 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
670501 }
671502
672503
673504 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
674505 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
675506 let sts = parseIntValue(r._8)
676507 if (if (if (igs())
677508 then true
678509 else (sts == PoolPutDis))
679510 then true
680511 else (sts == PoolShutdown))
681512 then throw(("Blocked:" + toString(sts)))
682513 else r
683514 }
684515
685516
517+func getD (xp) = {
518+ let n = big2
519+ let xp0 = xp[0]
520+ let xp1 = xp[1]
521+ let aPrecision = parseBigIntValue(Amult)
522+ let a = (parseBigIntValue(A) * aPrecision)
523+ let s = (xp0 + xp1)
524+ if ((s == big0))
525+ then big0
526+ else {
527+ let ann = (a * n)
528+ let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
529+ let ann_s_aPrecision = ((ann * s) / aPrecision)
530+ let ann_aPrecision = (ann - aPrecision)
531+ let n1 = (n + big1)
532+ func calc (acc,cur) = {
533+ let $t02250222522 = acc
534+ let d = $t02250222522._1
535+ let found = $t02250222522._2
536+ if ((found != unit))
537+ then acc
538+ else {
539+ let dp = (((d * d) * d) / xp0_xp1_n_n)
540+ let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
541+ let dDiff = absBigInt((dNext - value(d)))
542+ if ((big1 >= dDiff))
543+ then $Tuple2(dNext, cur)
544+ else $Tuple2(dNext, unit)
545+ }
546+ }
547+
548+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
549+ let $t02294322990 = {
550+ let $l = arr
551+ let $s = size($l)
552+ let $acc0 = $Tuple2(s, unit)
553+ func $f0_1 ($a,$i) = if (($i >= $s))
554+ then $a
555+ else calc($a, $l[$i])
556+
557+ func $f0_2 ($a,$i) = if (($i >= $s))
558+ then $a
559+ else throw("List size exceeds 15")
560+
561+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
562+ }
563+ let d = $t02294322990._1
564+ let found = $t02294322990._2
565+ if ((found != unit))
566+ then d
567+ else throw(("D calculation error, D = " + toString(d)))
568+ }
569+ }
570+
571+
572+func getYD (xp,i,D) = {
573+ let n = big2
574+ let x = xp[if ((i == 0))
575+ then 1
576+ else 0]
577+ let aPrecision = parseBigIntValue(Amult)
578+ let a = (parseBigIntValue(A) * aPrecision)
579+ let s = x
580+ let ann = (a * n)
581+ let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
582+ let b = ((s + ((D * aPrecision) / ann)) - D)
583+ func calc (acc,cur) = {
584+ let $t02349023510 = acc
585+ let y = $t02349023510._1
586+ let found = $t02349023510._2
587+ if ((found != unit))
588+ then acc
589+ else {
590+ let yNext = (((y * y) + c) / ((big2 * y) + b))
591+ let yDiff = absBigInt((yNext - value(y)))
592+ if ((big1 >= yDiff))
593+ then $Tuple2(yNext, cur)
594+ else $Tuple2(yNext, unit)
595+ }
596+ }
597+
598+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
599+ let $t02381723864 = {
600+ let $l = arr
601+ let $s = size($l)
602+ let $acc0 = $Tuple2(D, unit)
603+ func $f0_1 ($a,$i) = if (($i >= $s))
604+ then $a
605+ else calc($a, $l[$i])
606+
607+ func $f0_2 ($a,$i) = if (($i >= $s))
608+ then $a
609+ else throw("List size exceeds 15")
610+
611+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
612+ }
613+ let y = $t02381723864._1
614+ let found = $t02381723864._2
615+ if ((found != unit))
616+ then y
617+ else throw(("Y calculation error, Y = " + toString(y)))
618+ }
619+
620+
686621 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
687- let amId = toBase58String(value(cfgAmountAssetId))
688- let prId = toBase58String(value(cfgPriceAssetId))
689- let lpId = cfgLpAssetId
690- let amtDcm = cfgAmountAssetDecimals
691- let priceDcm = cfgPriceAssetDecimals
692- let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
622+ let poolConfig = gpc()
623+ let amId = poolConfig[idxAmAsId]
624+ let prId = poolConfig[idxPrAsId]
625+ let lpId = poolConfig[idxLPAsId]
626+ let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
627+ let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
628+ let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
693629 let chechEmission = if ((lpAssetEmission > big0))
694630 then true
695631 else throw("initial deposit requires all coins")
696632 if ((chechEmission == chechEmission))
697633 then {
698634 let amBalance = getAccBalance(amId)
699635 let prBalance = getAccBalance(prId)
700- let $t02796528427 = if ((txId == ""))
636+ let $t02464725109 = if ((txId == ""))
701637 then $Tuple2(amBalance, prBalance)
702638 else if ((pmtAssetId == amId))
703639 then if ((pmtAmtRaw > amBalance))
704640 then throw("invalid payment amount")
705641 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
706642 else if ((pmtAssetId == prId))
707643 then if ((pmtAmtRaw > prBalance))
708644 then throw("invalid payment amount")
709645 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
710646 else throw("wrong pmtAssetId")
711- let amBalanceOld = $t02796528427._1
712- let prBalanceOld = $t02796528427._2
713- let $t02843328609 = if ((pmtAssetId == amId))
647+ let amBalanceOld = $t02464725109._1
648+ let prBalanceOld = $t02464725109._2
649+ let $t02511525291 = if ((pmtAssetId == amId))
714650 then $Tuple2(pmtAmtRaw, 0)
715651 else if ((pmtAssetId == prId))
716652 then $Tuple2(0, pmtAmtRaw)
717653 else throw("invalid payment")
718- let amAmountRaw = $t02843328609._1
719- let prAmountRaw = $t02843328609._2
720- let $t02861328867 = if (withTakeFee)
654+ let amAmountRaw = $t02511525291._1
655+ let prAmountRaw = $t02511525291._2
656+ let $t02529525549 = if (withTakeFee)
721657 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
722658 else $Tuple3(amAmountRaw, prAmountRaw, 0)
723- let amAmount = $t02861328867._1
724- let prAmount = $t02861328867._2
725- let feeAmount = $t02861328867._3
659+ let amAmount = $t02529525549._1
660+ let prAmount = $t02529525549._2
661+ let feeAmount = $t02529525549._3
726662 let amBalanceNew = (amBalanceOld + amAmount)
727663 let prBalanceNew = (prBalanceOld + prAmount)
728- let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
729- let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
664+ let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
665+ let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
730666 let checkD = if ((D1 > D0))
731667 then true
732668 else throw()
733669 if ((checkD == checkD))
734670 then {
735- let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
671+ let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
736672 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
737673 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
738674 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
739675 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
740676 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
741677 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
742678 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
743679 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
744680 }
745681 else throw("Strict value is not equal to itself.")
746682 }
747683 else throw("Strict value is not equal to itself.")
748684 }
749685
750686
751687 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
752- let lpId = toBase58String(value(cfgLpAssetId))
753- let amId = toBase58String(value(cfgAmountAssetId))
754- let prId = toBase58String(value(cfgPriceAssetId))
755- let amDecimals = cfgAmountAssetDecimals
756- let prDecimals = cfgPriceAssetDecimals
757- let poolStatus = cfgPoolStatus
688+ let poolConfig = gpc()
689+ let lpId = poolConfig[idxLPAsId]
690+ let amId = poolConfig[idxAmAsId]
691+ let prId = poolConfig[idxPrAsId]
692+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
693+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
694+ let poolStatus = poolConfig[idxPoolSt]
758695 let userAddress = if ((caller == restContract))
759696 then originCaller
760697 else caller
761698 let pmt = value(payments[0])
762699 let pmtAssetId = value(pmt.assetId)
763700 let pmtAmt = pmt.amount
764- let currentDLp = calcCurrentDLp(big0, big0, big0)
765- if ((currentDLp == currentDLp))
766- then {
767- let txId58 = toBase58String(transactionId)
768- if ((lpId != toBase58String(pmtAssetId)))
769- then throw("Wrong LP")
770- else {
771- let amBalance = getAccBalance(amId)
772- let prBalance = getAccBalance(prId)
773- let $t03097931090 = {
774- let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
775- if ($isInstanceOf(@, "(Int, Int)"))
776- then @
777- else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
778- }
779- if (($t03097931090 == $t03097931090))
701+ let txId58 = toBase58String(transactionId)
702+ if ((lpId != toBase58String(pmtAssetId)))
703+ then throw("Wrong LP")
704+ else {
705+ let amBalance = getAccBalance(amId)
706+ let prBalance = getAccBalance(prId)
707+ let $t02755127662 = {
708+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
709+ if ($isInstanceOf(@, "(Int, Int)"))
710+ then @
711+ else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
712+ }
713+ if (($t02755127662 == $t02755127662))
714+ then {
715+ let feeAmount = $t02755127662._2
716+ let totalGet = $t02755127662._1
717+ let totalAmount = if (if ((minOutAmount > 0))
718+ then (minOutAmount > totalGet)
719+ else false)
720+ then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
721+ else totalGet
722+ let $t02785228159 = if ((outAssetId == amId))
723+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
724+ else if ((outAssetId == prId))
725+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
726+ else throw("invalid out asset id")
727+ let outAm = $t02785228159._1
728+ let outPr = $t02785228159._2
729+ let amBalanceNew = $t02785228159._3
730+ let prBalanceNew = $t02785228159._4
731+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
732+ let curPr = f1(curPrX18, scale8)
733+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
734+ then unit
735+ else fromBase58String(outAssetId)
736+ let sendFeeToMatcher = if ((feeAmount > 0))
737+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
738+ else nil
739+ 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)] ++ sendFeeToMatcher)
740+ if ((state == state))
780741 then {
781- let feeAmount = $t03097931090._2
782- let totalGet = $t03097931090._1
783- let totalAmount = if (if ((minOutAmount > 0))
784- then (minOutAmount > totalGet)
785- else false)
786- then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
787- else totalGet
788- let $t03128031587 = if ((outAssetId == amId))
789- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
790- else if ((outAssetId == prId))
791- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
792- else throw("invalid out asset id")
793- let outAm = $t03128031587._1
794- let outPr = $t03128031587._2
795- let amBalanceNew = $t03128031587._3
796- let prBalanceNew = $t03128031587._4
797- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
798- let curPr = f1(curPrX18, scale8)
799- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
800- then unit
801- else fromBase58String(outAssetId)
802- let sendFeeToMatcher = if ((feeAmount > 0))
803- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
804- else nil
805- 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)] ++ sendFeeToMatcher)
806- if ((state == state))
807- then {
808- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
809- if ((burn == burn))
810- then {
811- let $t03237232722 = {
812- let feeAmountForCalc = if ((this == feeCollectorAddress))
813- then 0
814- else feeAmount
815- let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
816- then true
817- else false
818- if (outInAmountAsset)
819- then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
820- else $Tuple2(0, -((totalGet + feeAmountForCalc)))
821- }
822- let amountAssetBalanceDelta = $t03237232722._1
823- let priceAssetBalanceDelta = $t03237232722._2
824- let $t03272532833 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
825- let refreshDLpActions = $t03272532833._1
826- let updatedDLp = $t03272532833._2
827- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
828- if ((isUpdatedDLpValid == isUpdatedDLpValid))
829- then $Tuple2((state ++ refreshDLpActions), totalAmount)
830- else throw("Strict value is not equal to itself.")
831- }
832- else throw("Strict value is not equal to itself.")
833- }
742+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
743+ if ((burn == burn))
744+ then $Tuple2(state, totalAmount)
834745 else throw("Strict value is not equal to itself.")
835746 }
836747 else throw("Strict value is not equal to itself.")
837748 }
749+ else throw("Strict value is not equal to itself.")
838750 }
839- else throw("Strict value is not equal to itself.")
840751 }
841752
842753
843754 func m () = match getString(mpk()) {
844755 case s: String =>
845756 fromBase58String(s)
846757 case _: Unit =>
847758 unit
848759 case _ =>
849760 throw("Match error")
850761 }
851762
852763
853764 func pm () = match getString(pmpk()) {
854765 case s: String =>
855766 fromBase58String(s)
856767 case _: Unit =>
857768 unit
858769 case _ =>
859770 throw("Match error")
860771 }
861772
862773
863774 let pd = throw("Permission denied")
864775
865776 func isManager (i) = match m() {
866777 case pk: ByteVector =>
867778 (i.callerPublicKey == pk)
868779 case _: Unit =>
869780 (i.caller == this)
870781 case _ =>
871782 throw("Match error")
872783 }
873784
874785
875786 func mm (i) = match m() {
876787 case pk: ByteVector =>
877788 if ((i.callerPublicKey == pk))
878789 then true
879790 else pd
880791 case _: Unit =>
881792 if ((i.caller == this))
882793 then true
883794 else pd
884795 case _ =>
885796 throw("Match error")
886797 }
798+
799+
800+func getY (isReverse,D,poolAmountInBalance) = {
801+ let poolConfig = gpc()
802+ let amId = poolConfig[idxAmAsId]
803+ let prId = poolConfig[idxPrAsId]
804+ let n = big2
805+ let aPrecision = parseBigIntValue(Amult)
806+ let a = (parseBigIntValue(A) * aPrecision)
807+ let xp = if ((isReverse == false))
808+ then [(toBigInt(getAccBalance(amId)) - poolAmountInBalance), toBigInt(getAccBalance(prId))]
809+ else [(toBigInt(getAccBalance(prId)) - poolAmountInBalance), toBigInt(getAccBalance(amId))]
810+ let x = xp[0]
811+ let s = x
812+ let ann = (a * n)
813+ let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
814+ let b = ((s + ((D * aPrecision) / ann)) - D)
815+ func calc (acc,cur) = {
816+ let $t03029130311 = acc
817+ let y = $t03029130311._1
818+ let found = $t03029130311._2
819+ if ((found != unit))
820+ then acc
821+ else {
822+ let yNext = (((y * y) + c) / ((big2 * y) + b))
823+ let yDiff = absBigInt((yNext - value(y)))
824+ if ((big1 >= yDiff))
825+ then $Tuple2(yNext, cur)
826+ else $Tuple2(yNext, unit)
827+ }
828+ }
829+
830+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
831+ let $t03064230689 = {
832+ let $l = arr
833+ let $s = size($l)
834+ let $acc0 = $Tuple2(D, unit)
835+ func $f0_1 ($a,$i) = if (($i >= $s))
836+ then $a
837+ else calc($a, $l[$i])
838+
839+ func $f0_2 ($a,$i) = if (($i >= $s))
840+ then $a
841+ else throw("List size exceeds 15")
842+
843+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
844+ }
845+ let y = $t03064230689._1
846+ let found = $t03064230689._2
847+ if ((found != unit))
848+ then y
849+ else throw(("Y calculation error, Y = " + toString(y)))
850+ }
851+
852+
853+@Callable(i)
854+func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse) = {
855+ let $t03091031506 = if ((isReverse == false))
856+ then {
857+ let assetOut = strf(this, pa())
858+ let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
859+ $Tuple2(assetOut, poolAmountInBalance)
860+ }
861+ else {
862+ let assetOut = strf(this, aa())
863+ let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
864+ $Tuple2(assetOut, poolAmountInBalance)
865+ }
866+ let assetOut = $t03091031506._1
867+ let poolAmountInBalance = $t03091031506._2
868+ let poolConfig = gpc()
869+ let amId = poolConfig[idxAmAsId]
870+ let prId = poolConfig[idxPrAsId]
871+ let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
872+ let D = getD(xp)
873+ let y = getY(isReverse, D, poolAmountInBalance)
874+ let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
875+ let totalGetRaw = max([0, toInt(dy)])
876+ $Tuple2(nil, totalGetRaw)
877+ }
878+
879+
880+
881+@Callable(i)
882+func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo) = {
883+ let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
884+ then true
885+ else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(strf(this, swapContract()))))
886+ then true
887+ else throwErr("Permission denied")]
888+ if ((checks == checks))
889+ then {
890+ let pmt = value(i.payments[0])
891+ let assetIn = if ((pmt.assetId == unit))
892+ then toBase58String(toBytes("WAVES"))
893+ else toBase58String(value(pmt.assetId))
894+ let $t03256432958 = if ((isReverse == false))
895+ then {
896+ let assetOut = strf(this, pa())
897+ let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
898+ $Tuple2(assetOut, poolAmountInBalance)
899+ }
900+ else {
901+ let assetOut = strf(this, aa())
902+ let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
903+ $Tuple2(assetOut, poolAmountInBalance)
904+ }
905+ let assetOut = $t03256432958._1
906+ let poolAmountInBalance = $t03256432958._2
907+ let poolConfig = gpc()
908+ let amId = poolConfig[idxAmAsId]
909+ let prId = poolConfig[idxPrAsId]
910+ let xp = [(toBigInt(getAccBalance(amId)) - toBigInt(value(i.payments[0]).amount)), toBigInt(getAccBalance(prId))]
911+ let D = getD(xp)
912+ let y = getY(isReverse, D, toBigInt(poolAmountInBalance))
913+ let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
914+ let totalGetRaw = max([0, toInt(dy)])
915+ let checkMin = if ((totalGetRaw >= amountOutMin))
916+ then true
917+ else throw("Exchange result is fewer coins than expected")
918+ if ((checkMin == checkMin))
919+ then [ScriptTransfer(addressFromStringValue(addressTo), totalGetRaw, if ((assetIn == "WAVES"))
920+ then unit
921+ else fromBase58String(assetOut))]
922+ else throw("Strict value is not equal to itself.")
923+ }
924+ else throw("Strict value is not equal to itself.")
925+ }
926+
887927
888928
889929 @Callable(i)
890930 func constructor (fc) = {
891931 let c = mm(i)
892932 if ((c == c))
893933 then [StringEntry(fc(), fc)]
894934 else throw("Strict value is not equal to itself.")
895935 }
896936
897937
898938
899939 @Callable(i)
900940 func setManager (pendingManagerPublicKey) = {
901941 let c = mm(i)
902942 if ((c == c))
903943 then {
904944 let cm = fromBase58String(pendingManagerPublicKey)
905945 if ((cm == cm))
906946 then [StringEntry(pmpk(), pendingManagerPublicKey)]
907947 else throw("Strict value is not equal to itself.")
908948 }
909949 else throw("Strict value is not equal to itself.")
910950 }
911951
912952
913953
914954 @Callable(i)
915955 func confirmManager () = {
916956 let p = pm()
917957 let hpm = if (isDefined(p))
918958 then true
919959 else throw("No pending manager")
920960 if ((hpm == hpm))
921961 then {
922962 let cpm = if ((i.callerPublicKey == value(p)))
923963 then true
924964 else throw("You are not pending manager")
925965 if ((cpm == cpm))
926966 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
927967 else throw("Strict value is not equal to itself.")
928968 }
929969 else throw("Strict value is not equal to itself.")
930970 }
931971
932972
933973
934974 @Callable(i)
935975 func put (slip,autoStake) = {
936976 let factCfg = gfc()
937977 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
938978 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
939979 if ((0 > slip))
940980 then throw("Wrong slippage")
941981 else if ((size(i.payments) != 2))
942982 then throw("2 pmnts expd")
943983 else {
944- let amAssetPmt = toBigInt(value(i.payments[0]).amount)
945- let prAssetPmt = toBigInt(value(i.payments[1]).amount)
946- let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
947- if ((amountAssetBalance == amountAssetBalance))
984+ 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, "")
985+ let emitLpAmt = e._2
986+ let lpAssetId = e._7
987+ let state = e._9
988+ let amDiff = e._10
989+ let prDiff = e._11
990+ let amId = e._12
991+ let prId = e._13
992+ let r = invoke(fca, "emit", [emitLpAmt], nil)
993+ if ((r == r))
948994 then {
949- let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
950- if ((priceAssetBalance == priceAssetBalance))
995+ let el = match r {
996+ case legacy: Address =>
997+ invoke(legacy, "emit", [emitLpAmt], nil)
998+ case _ =>
999+ unit
1000+ }
1001+ if ((el == el))
9511002 then {
952- let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
953- if ((lpAssetEmission == lpAssetEmission))
1003+ let sa = if ((amDiff > 0))
1004+ then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
1005+ else nil
1006+ if ((sa == sa))
9541007 then {
955- let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
956- if ((currentDLp == currentDLp))
1008+ let sp = if ((prDiff > 0))
1009+ then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
1010+ else nil
1011+ if ((sp == sp))
9571012 then {
958- 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, "")
959- let emitLpAmt = e._2
960- let lpAssetId = e._7
961- let state = e._9
962- let amDiff = e._10
963- let prDiff = e._11
964- let amId = e._12
965- let prId = e._13
966- let r = invoke(fca, "emit", [emitLpAmt], nil)
967- if ((r == r))
1013+ let lpTrnsfr = if (autoStake)
9681014 then {
969- let el = match r {
970- case legacy: Address =>
971- invoke(legacy, "emit", [emitLpAmt], nil)
972- case _ =>
973- unit
974- }
975- if ((el == el))
976- then {
977- let sa = if ((amDiff > 0))
978- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
979- else nil
980- if ((sa == sa))
981- then {
982- let sp = if ((prDiff > 0))
983- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
984- else nil
985- if ((sp == sp))
986- then {
987- let lpTrnsfr = if (autoStake)
988- then {
989- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
990- if ((ss == ss))
991- then nil
992- else throw("Strict value is not equal to itself.")
993- }
994- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
995- let $t03698237124 = refreshDLpInternal(0, 0, 0)
996- let refreshDLpActions = $t03698237124._1
997- let updatedDLp = $t03698237124._2
998- let check = if ((updatedDLp >= currentDLp))
999- then true
1000- else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
1001- if ((check == check))
1002- then {
1003- let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
1004- if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
1005- then ((state ++ lpTrnsfr) ++ refreshDLpActions)
1006- else throw("Strict value is not equal to itself.")
1007- }
1008- else throw("Strict value is not equal to itself.")
1009- }
1010- else throw("Strict value is not equal to itself.")
1011- }
1012- else throw("Strict value is not equal to itself.")
1013- }
1015+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
1016+ if ((ss == ss))
1017+ then nil
10141018 else throw("Strict value is not equal to itself.")
10151019 }
1016- else throw("Strict value is not equal to itself.")
1020+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1021+ (state ++ lpTrnsfr)
10171022 }
10181023 else throw("Strict value is not equal to itself.")
10191024 }
10201025 else throw("Strict value is not equal to itself.")
10211026 }
10221027 else throw("Strict value is not equal to itself.")
10231028 }
10241029 else throw("Strict value is not equal to itself.")
10251030 }
10261031 }
10271032
10281033
10291034
10301035 @Callable(i)
10311036 func putOneTknV2 (minOutAmount,autoStake) = {
10321037 let isPoolOneTokenOperationsDisabled = {
10331038 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10341039 if ($isInstanceOf(@, "Boolean"))
10351040 then @
10361041 else throw(($getType(@) + " couldn't be cast to Boolean"))
10371042 }
10381043 let isPutDisabled = if (if (if (igs())
10391044 then true
10401045 else (cfgPoolStatus == PoolPutDis))
10411046 then true
10421047 else (cfgPoolStatus == PoolShutdown))
10431048 then true
10441049 else isPoolOneTokenOperationsDisabled
10451050 let checks = [if (if (!(isPutDisabled))
10461051 then true
10471052 else isManager(i))
10481053 then true
10491054 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
10501055 then true
10511056 else throwErr("exactly 1 payment are expected")]
10521057 if ((checks == checks))
10531058 then {
1054- let amId = toBase58String(value(cfgAmountAssetId))
1055- let prId = toBase58String(value(cfgPriceAssetId))
1056- let lpId = cfgLpAssetId
1057- let amDecimals = cfgAmountAssetDecimals
1058- let prDecimals = cfgPriceAssetDecimals
1059+ let poolConfig = gpc()
1060+ let amId = poolConfig[idxAmAsId]
1061+ let prId = poolConfig[idxPrAsId]
1062+ let lpId = fromBase58String(poolConfig[idxLPAsId])
1063+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
1064+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
10591065 let userAddress = if ((i.caller == this))
10601066 then i.originCaller
10611067 else i.caller
10621068 let pmt = value(i.payments[0])
10631069 let pmtAssetId = toBase58String(value(pmt.assetId))
10641070 let pmtAmt = pmt.amount
1065- let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
1066- then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
1067- else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
1068- if ((currentDLp == currentDLp))
1071+ let $t03777737935 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1072+ if (($t03777737935 == $t03777737935))
10691073 then {
1070- let $t03876538923 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1071- if (($t03876538923 == $t03876538923))
1074+ let feeAmount = $t03777737935._3
1075+ let state = $t03777737935._2
1076+ let estimLP = $t03777737935._1
1077+ let emitLpAmt = if (if ((minOutAmount > 0))
1078+ then (minOutAmount > estimLP)
1079+ else false)
1080+ then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
1081+ else estimLP
1082+ let e = invoke(fca, "emit", [emitLpAmt], nil)
1083+ if ((e == e))
10721084 then {
1073- let feeAmount = $t03876538923._3
1074- let state = $t03876538923._2
1075- let estimLP = $t03876538923._1
1076- let emitLpAmt = if (if ((minOutAmount > 0))
1077- then (minOutAmount > estimLP)
1078- else false)
1079- then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
1080- else estimLP
1081- let e = invoke(fca, "emit", [emitLpAmt], nil)
1082- if ((e == e))
1085+ let el = match e {
1086+ case legacy: Address =>
1087+ invoke(legacy, "emit", [emitLpAmt], nil)
1088+ case _ =>
1089+ unit
1090+ }
1091+ if ((el == el))
10831092 then {
1084- let el = match e {
1085- case legacy: Address =>
1086- invoke(legacy, "emit", [emitLpAmt], nil)
1087- case _ =>
1088- unit
1089- }
1090- if ((el == el))
1093+ let lpTrnsfr = if (autoStake)
10911094 then {
1092- let lpTrnsfr = if (autoStake)
1093- then {
1094- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
1095- if ((ss == ss))
1096- then nil
1097- else throw("Strict value is not equal to itself.")
1098- }
1099- else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
1100- let sendFeeToMatcher = if ((feeAmount > 0))
1101- then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
1102- else nil
1103- let $t03973840087 = if ((this == feeCollectorAddress))
1104- then $Tuple2(0, 0)
1105- else {
1106- let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
1107- then true
1108- else false
1109- if (paymentInAmountAsset)
1110- then $Tuple2(-(feeAmount), 0)
1111- else $Tuple2(0, -(feeAmount))
1112- }
1113- let amountAssetBalanceDelta = $t03973840087._1
1114- let priceAssetBalanceDelta = $t03973840087._2
1115- let $t04009040198 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1116- let refreshDLpActions = $t04009040198._1
1117- let updatedDLp = $t04009040198._2
1118- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1119- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1120- then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
1095+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
1096+ if ((ss == ss))
1097+ then nil
11211098 else throw("Strict value is not equal to itself.")
11221099 }
1123- else throw("Strict value is not equal to itself.")
1100+ else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
1101+ let sendFeeToMatcher = if ((feeAmount > 0))
1102+ then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
1103+ else nil
1104+ $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
11241105 }
11251106 else throw("Strict value is not equal to itself.")
11261107 }
11271108 else throw("Strict value is not equal to itself.")
11281109 }
11291110 else throw("Strict value is not equal to itself.")
11301111 }
11311112 else throw("Strict value is not equal to itself.")
11321113 }
11331114
11341115
11351116
11361117 @Callable(i)
11371118 func putForFree (maxSlpg) = if ((0 > maxSlpg))
11381119 then throw("Wrong slpg")
11391120 else if ((size(i.payments) != 2))
11401121 then throw("2 pmnts expd")
11411122 else {
11421123 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, "")
1143- let state = estPut._9
1144- let amAssetPmt = toBigInt(value(i.payments[0]).amount)
1145- let prAssetPmt = toBigInt(value(i.payments[1]).amount)
1146- let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
1147- if ((currentDLp == currentDLp))
1148- then {
1149- let $t04122841293 = refreshDLpInternal(0, 0, 0)
1150- let refreshDLpActions = $t04122841293._1
1151- let updatedDLp = $t04122841293._2
1152- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1153- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1154- then (state ++ refreshDLpActions)
1155- else throw("Strict value is not equal to itself.")
1156- }
1157- else throw("Strict value is not equal to itself.")
1124+ estPut._9
11581125 }
11591126
11601127
11611128
11621129 @Callable(i)
11631130 func get () = {
1164- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1165- if ((currentDLp == currentDLp))
1166- then {
1167- let r = cg(i)
1168- let outAmtAmt = r._1
1169- let outPrAmt = r._2
1170- let pmtAmt = r._3
1171- let pmtAssetId = r._4
1172- let state = r._5
1173- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1174- if ((b == b))
1175- then {
1176- let $t04246642548 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1177- let refreshDLpActions = $t04246642548._1
1178- let updatedDLp = $t04246642548._2
1179- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1180- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1181- then (state ++ refreshDLpActions)
1182- else throw("Strict value is not equal to itself.")
1183- }
1184- else throw("Strict value is not equal to itself.")
1185- }
1131+ let r = cg(i)
1132+ let outAmtAmt = r._1
1133+ let outPrAmt = r._2
1134+ let pmtAmt = r._3
1135+ let pmtAssetId = r._4
1136+ let state = r._5
1137+ let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1138+ if ((b == b))
1139+ then state
11861140 else throw("Strict value is not equal to itself.")
11871141 }
11881142
11891143
11901144
11911145 @Callable(i)
11921146 func getOneTknV2 (outAssetId,minOutAmount) = {
11931147 let isPoolOneTokenOperationsDisabled = {
11941148 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11951149 if ($isInstanceOf(@, "Boolean"))
11961150 then @
11971151 else throw(($getType(@) + " couldn't be cast to Boolean"))
11981152 }
11991153 let isGetDisabled = if (if (igs())
12001154 then true
12011155 else (cfgPoolStatus == PoolShutdown))
12021156 then true
12031157 else isPoolOneTokenOperationsDisabled
12041158 let checks = [if (if (!(isGetDisabled))
12051159 then true
12061160 else isManager(i))
12071161 then true
12081162 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12091163 then true
12101164 else throwErr("exactly 1 payment are expected")]
12111165 if ((checks == checks))
12121166 then {
1213- let $t04316643321 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1214- let state = $t04316643321._1
1215- let totalAmount = $t04316643321._2
1167+ let $t04055740712 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1168+ let state = $t04055740712._1
1169+ let totalAmount = $t04055740712._2
12161170 $Tuple2(state, totalAmount)
12171171 }
12181172 else throw("Strict value is not equal to itself.")
12191173 }
12201174
12211175
12221176
12231177 @Callable(i)
1224-func refreshDLp () = {
1225- let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
1226- let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
1227- then unit
1228- else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
1229- if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
1230- then {
1231- let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1232- let $t04384543909 = refreshDLpInternal(0, 0, 0)
1233- let dLpUpdateActions = $t04384543909._1
1234- let updatedDLp = $t04384543909._2
1235- let actions = if ((dLp != updatedDLp))
1236- then dLpUpdateActions
1237- else throwErr("nothing to refresh")
1238- $Tuple2(actions, toString(updatedDLp))
1239- }
1240- else throw("Strict value is not equal to itself.")
1241- }
1242-
1243-
1244-
1245-@Callable(i)
12461178 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
1247- let amId = toBase58String(value(cfgAmountAssetId))
1248- let prId = toBase58String(value(cfgPriceAssetId))
1249- let lpId = toBase58String(value(cfgLpAssetId))
1179+ let poolConfig = gpc()
1180+ let amId = poolConfig[idxAmAsId]
1181+ let prId = poolConfig[idxPrAsId]
1182+ let lpId = poolConfig[idxLPAsId]
12501183 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
12511184 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
12521185 let D0 = getD(xp)
12531186 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
12541187 let index = if ((outAssetId == amId))
12551188 then 0
12561189 else if ((outAssetId == prId))
12571190 then 1
12581191 else throw("invalid out asset id")
12591192 let newY = getYD(xp, index, D1)
12601193 let dy = (xp[index] - newY)
12611194 let totalGetRaw = max([0, toInt((dy - big1))])
1262- let $t04483944894 = takeFee(totalGetRaw, outFee)
1263- let totalGet = $t04483944894._1
1264- let feeAmount = $t04483944894._2
1195+ let $t04150241557 = takeFee(totalGetRaw, outFee)
1196+ let totalGet = $t04150241557._1
1197+ let feeAmount = $t04150241557._2
12651198 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12661199 }
12671200
12681201
12691202
12701203 @Callable(i)
12711204 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
1272- let amId = toBase58String(value(cfgAmountAssetId))
1273- let prId = toBase58String(value(cfgPriceAssetId))
1274- let lpId = toBase58String(value(cfgLpAssetId))
1205+ let poolConfig = gpc()
1206+ let amId = poolConfig[idxAmAsId]
1207+ let prId = poolConfig[idxPrAsId]
1208+ let lpId = poolConfig[idxLPAsId]
12751209 let amBalance = getAccBalance(amId)
12761210 let prBalance = getAccBalance(prId)
1277- let $t04526945384 = {
1211+ let $t04190242017 = {
12781212 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12791213 if ($isInstanceOf(@, "(Int, Int)"))
12801214 then @
12811215 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12821216 }
1283- let totalGet = $t04526945384._1
1284- let feeAmount = $t04526945384._2
1217+ let totalGet = $t04190242017._1
1218+ let feeAmount = $t04190242017._2
12851219 let r = ego("", lpId, lpAssetAmount, this)
12861220 let outAmAmt = r._1
12871221 let outPrAmt = r._2
12881222 let sumOfGetAssets = (outAmAmt + outPrAmt)
12891223 let bonus = if ((sumOfGetAssets == 0))
12901224 then if ((totalGet == 0))
12911225 then 0
12921226 else throw("bonus calculation error")
12931227 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
12941228 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
12951229 }
12961230
12971231
12981232
12991233 @Callable(i)
13001234 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
13011235 let r = cg(i)
13021236 let outAmAmt = r._1
13031237 let outPrAmt = r._2
13041238 let pmtAmt = r._3
13051239 let pmtAssetId = r._4
13061240 let state = r._5
13071241 if ((noLessThenAmtAsset > outAmAmt))
13081242 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
13091243 else if ((noLessThenPriceAsset > outPrAmt))
13101244 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
13111245 else {
1312- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1313- if ((currentDLp == currentDLp))
1314- then {
1315- let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1316- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1317- then {
1318- let $t04655046631 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1319- let refreshDLpActions = $t04655046631._1
1320- let updatedDLp = $t04655046631._2
1321- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1322- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1323- then (state ++ refreshDLpActions)
1324- else throw("Strict value is not equal to itself.")
1325- }
1326- else throw("Strict value is not equal to itself.")
1327- }
1246+ let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1247+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1248+ then state
13281249 else throw("Strict value is not equal to itself.")
13291250 }
13301251 }
13311252
13321253
13331254
13341255 @Callable(i)
13351256 func unstakeAndGet (amount) = {
13361257 let checkPayments = if ((size(i.payments) != 0))
13371258 then throw("No pmnts expd")
13381259 else true
13391260 if ((checkPayments == checkPayments))
13401261 then {
1262+ let cfg = gpc()
13411263 let factoryCfg = gfc()
1342- let lpAssetId = cfgLpAssetId
1264+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
13431265 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
1344- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1345- if ((currentDLp == currentDLp))
1266+ let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1267+ if ((unstakeInv == unstakeInv))
13461268 then {
1347- let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1348- if ((unstakeInv == unstakeInv))
1269+ let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1270+ let sts = parseIntValue(r._9)
1271+ let state = r._10
1272+ let v = if (if (igs())
1273+ then true
1274+ else (sts == PoolShutdown))
1275+ then throw(("Blocked: " + toString(sts)))
1276+ else true
1277+ if ((v == v))
13491278 then {
1350- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1351- let outAmAmt = r._1
1352- let outPrAmt = r._2
1353- let sts = parseIntValue(r._9)
1354- let state = r._10
1355- let v = if (if (igs())
1356- then true
1357- else (sts == PoolShutdown))
1358- then throw(("Blocked: " + toString(sts)))
1359- else true
1360- if ((v == v))
1361- then {
1362- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1363- if ((burnA == burnA))
1364- then {
1365- let $t04765847739 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1366- let refreshDLpActions = $t04765847739._1
1367- let updatedDLp = $t04765847739._2
1368- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1369- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1370- then (state ++ refreshDLpActions)
1371- else throw("Strict value is not equal to itself.")
1372- }
1373- else throw("Strict value is not equal to itself.")
1374- }
1279+ let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1280+ if ((burnA == burnA))
1281+ then state
13751282 else throw("Strict value is not equal to itself.")
13761283 }
13771284 else throw("Strict value is not equal to itself.")
13781285 }
13791286 else throw("Strict value is not equal to itself.")
13801287 }
13811288 else throw("Strict value is not equal to itself.")
13821289 }
13831290
13841291
13851292
13861293 @Callable(i)
13871294 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
13881295 let isGetDisabled = if (igs())
13891296 then true
13901297 else (cfgPoolStatus == PoolShutdown)
13911298 let checks = [if (!(isGetDisabled))
13921299 then true
13931300 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
13941301 then true
13951302 else throw("no payments are expected")]
13961303 if ((checks == checks))
13971304 then {
1398- let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1399- if ((currentDLp == currentDLp))
1305+ let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1306+ if ((unstakeInv == unstakeInv))
14001307 then {
1401- let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1402- if ((unstakeInv == unstakeInv))
1308+ let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1309+ let outAmAmt = res._1
1310+ let outPrAmt = res._2
1311+ let state = res._10
1312+ let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1313+ then true
1314+ else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1315+ then true
1316+ else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1317+ if ((checkAmounts == checkAmounts))
14031318 then {
1404- let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1405- let outAmAmt = res._1
1406- let outPrAmt = res._2
1407- let state = res._10
1408- let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1409- then true
1410- else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1411- then true
1412- else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1413- if ((checkAmounts == checkAmounts))
1414- then {
1415- let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1416- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1417- then {
1418- let $t04899049071 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1419- let refreshDLpActions = $t04899049071._1
1420- let updatedDLp = $t04899049071._2
1421- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1422- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1423- then (state ++ refreshDLpActions)
1424- else throw("Strict value is not equal to itself.")
1425- }
1426- else throw("Strict value is not equal to itself.")
1427- }
1319+ let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1320+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1321+ then state
14281322 else throw("Strict value is not equal to itself.")
14291323 }
14301324 else throw("Strict value is not equal to itself.")
14311325 }
14321326 else throw("Strict value is not equal to itself.")
14331327 }
14341328 else throw("Strict value is not equal to itself.")
14351329 }
14361330
14371331
14381332
14391333 @Callable(i)
14401334 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
14411335 let isPoolOneTokenOperationsDisabled = {
14421336 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
14431337 if ($isInstanceOf(@, "Boolean"))
14441338 then @
14451339 else throw(($getType(@) + " couldn't be cast to Boolean"))
14461340 }
14471341 let isGetDisabled = if (if (igs())
14481342 then true
14491343 else (cfgPoolStatus == PoolShutdown))
14501344 then true
14511345 else isPoolOneTokenOperationsDisabled
14521346 let checks = [if (if (!(isGetDisabled))
14531347 then true
14541348 else isManager(i))
14551349 then true
14561350 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
14571351 then true
14581352 else throwErr("no payments are expected")]
14591353 if ((checks == checks))
14601354 then {
1355+ let cfg = gpc()
14611356 let factoryCfg = gfc()
1462- let lpAssetId = cfgLpAssetId
1357+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
14631358 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
14641359 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14651360 if ((unstakeInv == unstakeInv))
14661361 then {
1467- let $t04996650154 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1468- let state = $t04996650154._1
1469- let totalAmount = $t04996650154._2
1362+ let $t04585546043 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1363+ let state = $t04585546043._1
1364+ let totalAmount = $t04585546043._2
14701365 $Tuple2(state, totalAmount)
14711366 }
14721367 else throw("Strict value is not equal to itself.")
14731368 }
14741369 else throw("Strict value is not equal to itself.")
14751370 }
14761371
14771372
14781373
14791374 @Callable(i)
14801375 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1481- let $t05028250385 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1482- let lpAmount = $t05028250385._1
1483- let state = $t05028250385._2
1484- let feeAmount = $t05028250385._3
1485- let bonus = $t05028250385._4
1376+ let poolConfig = gpc()
1377+ let amId = poolConfig[idxAmAsId]
1378+ let prId = poolConfig[idxPrAsId]
1379+ let lpId = poolConfig[idxLPAsId]
1380+ let $t04630246405 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1381+ let lpAmount = $t04630246405._1
1382+ let state = $t04630246405._2
1383+ let feeAmount = $t04630246405._3
1384+ let bonus = $t04630246405._4
14861385 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14871386 }
14881387
14891388
14901389
14911390 @Callable(i)
14921391 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1493- let $t05053350637 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1494- let lpAmount = $t05053350637._1
1495- let state = $t05053350637._2
1496- let feeAmount = $t05053350637._3
1497- let bonus = $t05053350637._4
1392+ let poolConfig = gpc()
1393+ let amId = poolConfig[idxAmAsId]
1394+ let prId = poolConfig[idxPrAsId]
1395+ let lpId = poolConfig[idxLPAsId]
1396+ let $t04668446788 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1397+ let lpAmount = $t04668446788._1
1398+ let state = $t04668446788._2
1399+ let feeAmount = $t04668446788._3
1400+ let bonus = $t04668446788._4
14981401 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14991402 }
15001403
15011404
15021405
15031406 @Callable(i)
15041407 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
15051408 then throw("denied")
15061409 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
15071410
15081411
15091412
15101413 @Callable(i)
15111414 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
15121415 then pd
15131416 else [StringEntry(k, v)]
15141417
15151418
15161419
15171420 @Callable(i)
15181421 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
15191422 then pd
15201423 else [IntegerEntry(k, v)]
15211424
15221425
15231426
15241427 @Callable(i)
15251428 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
15261429
15271430
15281431
15291432 @Callable(i)
15301433 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
15311434
15321435
15331436
15341437 @Callable(i)
15351438 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
15361439 let pr = calcPrices(amAmt, prAmt, lpAmt)
15371440 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
15381441 }
15391442
15401443
15411444
15421445 @Callable(i)
15431446 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
15441447
15451448
15461449
15471450 @Callable(i)
15481451 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
15491452
15501453
15511454
15521455 @Callable(i)
15531456 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
15541457
15551458
15561459
15571460 @Callable(i)
15581461 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, ""))
15591462
15601463
15611464
15621465 @Callable(i)
15631466 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
15641467 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
15651468 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
15661469 }
15671470
15681471
15691472 @Verifier(tx)
15701473 func verify () = {
15711474 let targetPublicKey = match m() {
15721475 case pk: ByteVector =>
15731476 pk
15741477 case _: Unit =>
15751478 tx.senderPublicKey
15761479 case _ =>
15771480 throw("Match error")
15781481 }
15791482 match tx {
15801483 case order: Order =>
15811484 let matcherPub = mp()
1582- let $t05342953498 = validateMatcherOrderAllowed(order)
1583- let orderValid = $t05342953498._1
1584- let orderValidInfo = $t05342953498._2
1485+ let orderValid = moa(order)
15851486 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15861487 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15871488 if (if (if (orderValid)
15881489 then senderValid
15891490 else false)
15901491 then matcherValid
15911492 else false)
15921493 then true
1593- else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
1494+ else toe(orderValid, senderValid, matcherValid)
15941495 case s: SetScriptTransaction =>
1595- if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
1496+ let newHash = blake2b256(value(s.script))
1497+ let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
1498+ let currentHash = scriptHash(this)
1499+ if (if ((allowedHash == newHash))
1500+ then (currentHash != newHash)
1501+ else false)
15961502 then true
1597- else {
1598- let newHash = blake2b256(value(s.script))
1599- let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
1600- let currentHash = scriptHash(this)
1601- if ((allowedHash == newHash))
1602- then (currentHash != newHash)
1603- else false
1604- }
1503+ else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16051504 case _ =>
16061505 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16071506 }
16081507 }
16091508

github/deemru/w8io/3ef1775 
285.59 ms