tx · 51TwL5vVcGmrtF2KqLx3NkzcWGkv1aTZKcQxXJ7PLuTB

3PPhuBwEmhZrseTB4ne9wsjUa61c7GrAjB3:  -0.01500000 Waves

2024.03.29 02:39 [4104516] smart account 3PPhuBwEmhZrseTB4ne9wsjUa61c7GrAjB3 > SELF 0.00000000 Waves

{ "type": 13, "id": "51TwL5vVcGmrtF2KqLx3NkzcWGkv1aTZKcQxXJ7PLuTB", "fee": 1500000, "feeAssetId": null, "timestamp": 1711669110022, "version": 2, "chainId": 87, "sender": "3PPhuBwEmhZrseTB4ne9wsjUa61c7GrAjB3", "senderPublicKey": "BeJibL27zyW5t1iwB5w9kmajYnsaEac1bL5N3kVRGNJw", "proofs": [ "3cAnj3VFcWSS31ofZnsCN6ZFHCTvJo6pyx5FeZDqA2c6NjzSAXa44kiv8xiX6JpmB9vmJZGcYZ6uCygseURZvRAQ" ], "script": "base64:BgInCAISABIECgIIARIDCgEIEgQKAggIEgQKAggIEgMKAQgSAwoBCBIADAAHVkVSU0lPTgIKUFpTVC0xLjAuMQAJc2VudGluZWxzCQDMCAIJAQdBZGRyZXNzAQEaAVfX4SNRjnyriFrV1yiXddiIddOPriMFpuEJAMwIAgkBB0FkZHJlc3MBARoBV/j6+gImwFGL7Go7RjNJ0hxxsHWL+aTKmgkAzAgCCQEHQWRkcmVzcwEBGgFXSQEY9kN/P0xs4Wd15bfkly/eUC2yg93xCQDMCAIJAQdBZGRyZXNzAQEaAVdLw2zO+zNYQ1hDURDu7+4hEBdL8njLfDIFA25pbAAFcHpMcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAhVzZXR1cF9zdXBwb3J0ZWRBc3NldHMChQFYamRKS1d0UFlDejU4NVFCN0xueERQNzZVR1J1a2F6ZWREdWJVeDlESFFILDZiWmJSbW91N003d1hCdW5NWFFuWjRSbTY2SHhaRjNLZk1FaUZ3azN3bW5BLEVBN3NpR01TVHh6NkV0ZHBrQ2lWV1FIdXBGVDVON1VidlFyVzlrdnhDRTQyAgEsAAxwelBvb2xzU3RyTGkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwINc2V0dXBfcHpQb29scwJrM1AzRW5ZQTU3a01aOGtYVlZUaGkxWlpBcFplWFVRSHF0RWUsM1BDcGpMR280d0R1djIza2ptR0Y2bUhzODZCZjNzb1l2QXEsM1A0VTZmbzdCWkhEeW1RSzgyRzVwdmVHUEg3Q0E2UGJLaXQBDHN0clRvQWRkcmVzcwIFYWNjdW0KYWRkcmVzc1N0cgkAzggCBQVhY2N1bQkAzAgCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUKYWRkcmVzc1N0cgIYd3JvbmcgYWRkcmVzcyBpbiBwelBvb2xzBQNuaWwAB3B6UG9vbHMKAAIkbAkAtQkCBQxwelBvb2xzU3RyTGkCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHN0clRvQWRkcmVzcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABREaXN0cmlidXRlSXRlcmF0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhpzZXR1cF9kaXN0cmlidXRlSXRlcmF0aW9ucwAGAA9EaXN0cmlidXRlRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIVc2V0dXBfZGlzdHJpYnV0ZURlbGF5CQBoAgA8AAQBDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEKZ2V0QmFsYW5jZQEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQphc3NldElkU3RyAQt0b2tlblRvU3dhcAEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwkAZQIJAQpnZXRCYWxhbmNlAQIFV0FWRVMAgK3iBAkBCmdldEJhbGFuY2UBBQphc3NldElkU3RyCAFpAQdzdGFrZUxQAAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgkAoggBCQCsAgICCndoaXRlbGlzdF8JAKUIAQgFAWkGY2FsbGVyAgN5ZXMJAAIBAg53aGl0ZWxpc3Qgb25seQMJAQIhPQIJAM8IAgUFcHpMcHMFCmFzc2V0SWRTdHIFBHVuaXQEBGludjIJAPwHBAkAkQMCBQdwelBvb2xzCQEFdmFsdWUBCQDPCAIFBXB6THBzBQphc3NldElkU3RyAg1zdGFrZUluZGV4Rm9yCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAAUDbmlsAwkAAAIFBGludjIFBGludjIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAWkBCXVuc3Rha2VMUAIKYXNzZXRJZFN0cgZhbW91bnQDCQECIT0CCQCiCAEJAKwCAgIKd2hpdGVsaXN0XwkApQgBCAUBaQZjYWxsZXICA3llcwkAAgECDndoaXRlbGlzdCBvbmx5AwkBAiE9AgkAzwgCBQVwekxwcwUKYXNzZXRJZFN0cgUEdW5pdAQEaW52MgkA/AcECQCRAwIFB3B6UG9vbHMJAQV2YWx1ZQEJAM8IAgUFcHpMcHMFCmFzc2V0SWRTdHICDHVuc3Rha2VJbmRleAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFBGludjIFBGludjIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUKYXNzZXRJZFN0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwBaQEPY29tcG91bmRSZXdhcmRzAQphc3NldElkU3RyAwkAZgIJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgIXc3RhdHNfbGFzdERpc3RyaWJ1dGlvbl8FCmFzc2V0SWRTdHIAAAUPRGlzdHJpYnV0ZURlbGF5BQZoZWlnaHQJAAIBAhRjYW5ub3QgYmUgY2FsbGVkIHlldAMJAQIhPQIJAM8IAgUFcHpMcHMFCmFzc2V0SWRTdHIFBHVuaXQEBWxwTnVtCQEFdmFsdWUBCQDPCAIFBXB6THBzBQphc3NldElkU3RyBAZwelBvb2wJAJEDAgUHcHpQb29scwUFbHBOdW0ECHB6VG9rZW5zCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBnB6UG9vbAIPc3RhdGljX3Rva2VuSWRzAgEsBAdwekJhc2VUCQERQGV4dHJOYXRpdmUoMTA1MykCBQZwelBvb2wCEnN0YXRpY19iYXNlVG9rZW5JZAQEaW52MQkA/AcEBQZwelBvb2wCEWNsYWltSW5kZXhSZXdhcmRzBQNuaWwFA25pbAMJAAACBQRpbnYxBQRpbnYxCgECZjICBWFjY3VtBG5leHQDCQECIT0CBQRuZXh0BQdwekJhc2VUBARpbnYzCQD8BwQFBnB6UG9vbAIEc3dhcAkAzAgCBQdwekJhc2VUCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFBG5leHQJAQt0b2tlblRvU3dhcAEFBG5leHQFA25pbAMJAAACBQRpbnYzBQRpbnYzBQVhY2N1bQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUFYWNjdW0EDHN3YXBzSW52b2tlcwoAAiRsBQhwelRva2VucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQECZjICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECXRvRGVwb3NpdAkBC3Rva2VuVG9Td2FwAQUHcHpCYXNlVAoBB2hhbmRsZXICBWFjY3VtCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgUHcHpCYXNlVAUFYWNjdW0EB2Fzc2V0SWQJAQ1nZXRBc3NldEJ5dGVzAQUKYXNzZXRJZFN0cgQLYXNzZXRXZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBnB6UG9vbAkArAICCQCsAgICB3N0YXRpY18FCmFzc2V0SWRTdHICB193ZWlnaHQEBmFtb3VudAkAawMFCXRvRGVwb3NpdAULYXNzZXRXZWlnaHQAkE4EAmluBAckbWF0Y2gwCQD9BwQFBnB6UG9vbAIEc3dhcAkAzAgCBQphc3NldElkU3RyCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFB3B6QmFzZVQFBmFtb3VudAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAAAAwkAAAIFAmluBQJpbgkAzggCBQVhY2N1bQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUCaW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQPYmFzZUFzc2V0V2VpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQZwelBvb2wJAKwCAgkArAICAgdzdGF0aWNfBQdwekJhc2VUAgdfd2VpZ2h0BA1iYXNlUGF5QW1vdW50CQBrAwUJdG9EZXBvc2l0BQ9iYXNlQXNzZXRXZWlnaHQAkE4ED2V4Y2hhbmdlSW52b2tlcwoAAiRsBQhwelRva2VucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRBc3NldEJ5dGVzAQUHcHpCYXNlVAUNYmFzZVBheUFtb3VudAUDbmlsCgEFJGYyXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYyXzICCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAwkAAAIFD2V4Y2hhbmdlSW52b2tlcwUPZXhjaGFuZ2VJbnZva2VzBAhscEFtb3VudAQHJG1hdGNoMAkA/QcEBQZwelBvb2wCDWdlbmVyYXRlSW5kZXgJAMwIAgcFA25pbAUPZXhjaGFuZ2VJbnZva2VzAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAAAAwkAAAIFCGxwQW1vdW50BQhscEFtb3VudAQMdG9EaXN0cmlidXRlCQBpAgUIbHBBbW91bnQFFERpc3RyaWJ1dGVJdGVyYXRpb25zBARpbnY1CQD8BwQJAQdBZGRyZXNzAQEaAVdE/GOYf4xUiFwqh24YTlEVxsZ4fW/QWXwCE2FkZEludGVyZXN0RVhURVJOQUwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQphc3NldElkU3RyBQx0b0Rpc3RyaWJ1dGUFA25pbAMJAAACBQRpbnY1BQRpbnY1CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICF3N0YXRzX2xhc3REaXN0cmlidXRpb25fBQphc3NldElkU3RyBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIXc3RhdHNfdG90YWxEaXN0cmlidXRlZF8FCmFzc2V0SWRTdHIJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgIXc3RhdHNfdG90YWxEaXN0cmlidXRlZF8FCmFzc2V0SWRTdHIAAAUMdG9EaXN0cmlidXRlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhB3cm9uZyBhc3NldElkU3RyAWkBDHVwZGF0ZVN0cmluZwIBawF2AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIQc2VsZiBpbnZva2Ugb25seQkAzAgCCQELU3RyaW5nRW50cnkCBQFrBQF2BQNuaWwBaQEQYWRkU3VwcG9ydGVkUG9vbAIJcHpUb2tlbklkBnB6UG9vbAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEHNlbGYgaW52b2tlIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIVc2V0dXBfc3VwcG9ydGVkQXNzZXRzCQCsAgIJAKwCAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIVc2V0dXBfc3VwcG9ydGVkQXNzZXRzAgEsBQlwelRva2VuSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgINc2V0dXBfcHpQb29scwkArAICCQCsAgIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCDXNldHVwX3B6UG9vbHMCASwJAKUIAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcHpQb29sBQNuaWwBaQENaW5pdE5ld01hc3RlcgEGbWFzdGVyBAlhZGRyZXNzT0sEByRtYXRjaDAJAKYIAQUGbWFzdGVyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwMJAQEhAQUJYWRkcmVzc09LCQACAQkArAICAhJpbmNvcnJlY3QgYWRkcmVzcyAFBm1hc3RlcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGF2YWlsYWJsZSBmb3Igc2VsZiBjYWxsIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIPdmVyaWZpZXJfbWFzdGVyBQZtYXN0ZXIFA25pbAFpARByZXF1ZXN0TmV3TWFzdGVyAQluZXdNYXN0ZXIECWFkZHJlc3NPSwQHJG1hdGNoMAkApggBBQluZXdNYXN0ZXIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAwkBASEBBQlhZGRyZXNzT0sJAAIBCQCsAgICEmluY29ycmVjdCBhZGRyZXNzIAUJbmV3TWFzdGVyAwkAAAIJAM8IAgUJc2VudGluZWxzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAg53aGl0ZWxpc3Qgb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhJ2ZXJpZmllcl9uZXdNYXN0ZXIFCW5ld01hc3RlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIfdmVyaWZpZXJfbmV3TWFzdGVyRWxpZ2libGVBZnRlcgkAZAIFBmhlaWdodACQTgUDbmlsAWkBEWFjdGl2YXRlTmV3TWFzdGVyAAQOZWxpZ2libGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCH3ZlcmlmaWVyX25ld01hc3RlckVsaWdpYmxlQWZ0ZXIECW5ld01hc3RlcgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwISdmVyaWZpZXJfbmV3TWFzdGVyAwkAAAIJAM8IAgUJc2VudGluZWxzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAg53aGl0ZWxpc3Qgb25seQMJAGYCBQ5lbGlnaWJsZUhlaWdodAUGaGVpZ2h0CQACAQIibmV3IG1hc3RlciBjYW5ub3QgYmUgYWN0aXZhdGVkIHlldAkAzAgCCQELRGVsZXRlRW50cnkBAhJ2ZXJpZmllcl9uZXdNYXN0ZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQIfdmVyaWZpZXJfbmV3TWFzdGVyRWxpZ2libGVBZnRlcgkAzAgCCQELU3RyaW5nRW50cnkCAg92ZXJpZmllcl9tYXN0ZXIFCW5ld01hc3RlcgUDbmlsAQJ0eAEGdmVyaWZ5AAQNbWFzdGVyQWRkcmVzcwkAoggBAg92ZXJpZmllcl9tYXN0ZXIEEGFwcHJvdmVkQnlNYXN0ZXIEByRtYXRjaDAFDW1hc3RlckFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBAckbWF0Y2gxCQCaCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXgJAKwCAgILYXBwcm92ZWRUeF8JANgEAQgFAnR4AmlkAwkAAQIFByRtYXRjaDECA0ludAQBeQUHJG1hdGNoMQUBeQAAAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQBmAgUQYXBwcm92ZWRCeU1hc3RlcgAAByiGBaY=", "height": 4104516, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 226AxaLm88fEzKiLuK6qqRbX2DJwRoCfxT7eq91Yfp43 Next: HxKerxVJ5LY9FDt9pgqaJuNkCjGMXf3Wi8MaZCiCjHuC Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "PZST-1.0.0"
4+let VERSION = "PZST-1.0.1"
55
66 let sentinels = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
77
2626
2727 $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($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), 16), 17), 18), 19), 20)
2828 }
29+
30+let DistributeIterations = valueOrElse(getInteger(this, "setup_distributeIterations"), 6)
31+
32+let DistributeDelay = valueOrElse(getInteger(this, "setup_distributeDelay"), (60 * 4))
2933
3034 func getAssetString (assetId) = match assetId {
3135 case b: ByteVector =>
8286
8387
8488 @Callable(i)
85-func compoundRewards (assetIdStr) = if ((indexOf(pzLps, assetIdStr) != unit))
86- then {
87- let lpNum = value(indexOf(pzLps, assetIdStr))
88- let pzPool = pzPools[lpNum]
89- let pzTokens = split(getStringValue(pzPool, "static_tokenIds"), ",")
90- let pzBaseT = getStringValue(pzPool, "static_baseTokenId")
91- let inv1 = invoke(pzPool, "claimIndexRewards", nil, nil)
92- if ((inv1 == inv1))
93- then {
94- func f2 (accum,next) = if ((next != pzBaseT))
95- then {
96- let inv3 = invoke(pzPool, "swap", [pzBaseT, 0], [AttachedPayment(getAssetBytes(next), tokenToSwap(next))])
97- if ((inv3 == inv3))
98- then accum
99- else throw("Strict value is not equal to itself.")
89+func compoundRewards (assetIdStr) = if (((valueOrElse(getInteger(("stats_lastDistribution_" + assetIdStr)), 0) + DistributeDelay) > height))
90+ then throw("cannot be called yet")
91+ else if ((indexOf(pzLps, assetIdStr) != unit))
92+ then {
93+ let lpNum = value(indexOf(pzLps, assetIdStr))
94+ let pzPool = pzPools[lpNum]
95+ let pzTokens = split(getStringValue(pzPool, "static_tokenIds"), ",")
96+ let pzBaseT = getStringValue(pzPool, "static_baseTokenId")
97+ let inv1 = invoke(pzPool, "claimIndexRewards", nil, nil)
98+ if ((inv1 == inv1))
99+ then {
100+ func f2 (accum,next) = if ((next != pzBaseT))
101+ then {
102+ let inv3 = invoke(pzPool, "swap", [pzBaseT, 0], [AttachedPayment(getAssetBytes(next), tokenToSwap(next))])
103+ if ((inv3 == inv3))
104+ then accum
105+ else throw("Strict value is not equal to itself.")
106+ }
107+ else accum
108+
109+ let swapsInvokes = {
110+ let $l = pzTokens
111+ let $s = size($l)
112+ let $acc0 = nil
113+ func $f1_1 ($a,$i) = if (($i >= $s))
114+ then $a
115+ else f2($a, $l[$i])
116+
117+ func $f1_2 ($a,$i) = if (($i >= $s))
118+ then $a
119+ else throw("List size exceeds 10")
120+
121+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
100122 }
101- else accum
123+ let toDeposit = tokenToSwap(pzBaseT)
124+ func handler (accum,assetIdStr) = if ((assetIdStr == pzBaseT))
125+ then accum
126+ else {
127+ let assetId = getAssetBytes(assetIdStr)
128+ let assetWeight = getIntegerValue(pzPool, (("static_" + assetIdStr) + "_weight"))
129+ let amount = fraction(toDeposit, assetWeight, 10000)
130+ let in = match reentrantInvoke(pzPool, "swap", [assetIdStr, 0], [AttachedPayment(getAssetBytes(pzBaseT), amount)]) {
131+ case x: Int =>
132+ x
133+ case _ =>
134+ 0
135+ }
136+ if ((in == in))
137+ then (accum ++ [AttachedPayment(assetId, in)])
138+ else throw("Strict value is not equal to itself.")
139+ }
102140
103- let swapsInvokes = {
104- let $l = pzTokens
105- let $s = size($l)
106- let $acc0 = nil
107- func $f1_1 ($a,$i) = if (($i >= $s))
108- then $a
109- else f2($a, $l[$i])
141+ let baseAssetWeight = getIntegerValue(pzPool, (("static_" + pzBaseT) + "_weight"))
142+ let basePayAmount = fraction(toDeposit, baseAssetWeight, 10000)
143+ let exchangeInvokes = {
144+ let $l = pzTokens
145+ let $s = size($l)
146+ let $acc0 = [AttachedPayment(getAssetBytes(pzBaseT), basePayAmount)]
147+ func $f2_1 ($a,$i) = if (($i >= $s))
148+ then $a
149+ else handler($a, $l[$i])
110150
111- func $f1_2 ($a,$i) = if (($i >= $s))
112- then $a
113- else throw("List size exceeds 10")
151+ func $f2_2 ($a,$i) = if (($i >= $s))
152+ then $a
153+ else throw("List size exceeds 9")
114154
115- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
155+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
156+ }
157+ if ((exchangeInvokes == exchangeInvokes))
158+ then {
159+ let lpAmount = match reentrantInvoke(pzPool, "generateIndex", [false], exchangeInvokes) {
160+ case x: Int =>
161+ x
162+ case _ =>
163+ 0
164+ }
165+ if ((lpAmount == lpAmount))
166+ then {
167+ let toDistribute = (lpAmount / DistributeIterations)
168+ let inv5 = invoke(Address(base58'3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou'), "addInterestEXTERNAL", nil, [AttachedPayment(fromBase58String(assetIdStr), toDistribute)])
169+ if ((inv5 == inv5))
170+ then [IntegerEntry(("stats_lastDistribution_" + assetIdStr), height), IntegerEntry(("stats_totalDistributed_" + assetIdStr), (valueOrElse(getInteger(("stats_totalDistributed_" + assetIdStr)), 0) + toDistribute))]
171+ else throw("Strict value is not equal to itself.")
172+ }
173+ else throw("Strict value is not equal to itself.")
174+ }
175+ else throw("Strict value is not equal to itself.")
116176 }
117- let toDeposit = tokenToSwap(pzBaseT)
118- func handler (accum,assetIdStr) = if ((assetIdStr == pzBaseT))
119- then accum
120- else {
121- let assetId = getAssetBytes(assetIdStr)
122- let assetWeight = getIntegerValue(pzPool, (("static_" + assetIdStr) + "_weight"))
123- let amount = fraction(toDeposit, assetWeight, 10000)
124- let in = match reentrantInvoke(pzPool, "swap", [assetIdStr, 0], [AttachedPayment(getAssetBytes(pzBaseT), amount)]) {
125- case x: Int =>
126- x
127- case _ =>
128- 0
129- }
130- if ((in == in))
131- then (accum ++ [AttachedPayment(assetId, in)])
132- else throw("Strict value is not equal to itself.")
133- }
134-
135- let baseAssetWeight = getIntegerValue(pzPool, (("static_" + pzBaseT) + "_weight"))
136- let basePayAmount = fraction(toDeposit, baseAssetWeight, 10000)
137- let exchangeInvokes = {
138- let $l = pzTokens
139- let $s = size($l)
140- let $acc0 = [AttachedPayment(getAssetBytes(pzBaseT), basePayAmount)]
141- func $f2_1 ($a,$i) = if (($i >= $s))
142- then $a
143- else handler($a, $l[$i])
144-
145- func $f2_2 ($a,$i) = if (($i >= $s))
146- then $a
147- else throw("List size exceeds 9")
148-
149- $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
150- }
151- if ((exchangeInvokes == exchangeInvokes))
152- then {
153- let lpAmount = match reentrantInvoke(pzPool, "generateIndex", [false], exchangeInvokes) {
154- case x: Int =>
155- x
156- case _ =>
157- 0
158- }
159- if ((lpAmount == lpAmount))
160- then {
161- let inv5 = invoke(Address(base58'3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou'), "addInterestEXTERNAL", nil, [AttachedPayment(fromBase58String(assetIdStr), lpAmount)])
162- if ((inv5 == inv5))
163- then nil
164- else throw("Strict value is not equal to itself.")
165- }
166- else throw("Strict value is not equal to itself.")
167- }
168- else throw("Strict value is not equal to itself.")
169- }
170- else throw("Strict value is not equal to itself.")
171- }
172- else throw("wrong assetIdStr")
177+ else throw("Strict value is not equal to itself.")
178+ }
179+ else throw("wrong assetIdStr")
173180
174181
175182
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "PZST-1.0.0"
4+let VERSION = "PZST-1.0.1"
55
66 let sentinels = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
77
88 let pzLps = split(valueOrElse(getString(this, "setup_supportedAssets"), "XjdJKWtPYCz585QB7LnxDP76UGRukazedDubUx9DHQH,6bZbRmou7M7wXBunMXQnZ4Rm66HxZF3KfMEiFwk3wmnA,EA7siGMSTxz6EtdpkCiVWQHupFT5N7UbvQrW9kvxCE42"), ",")
99
1010 let pzPoolsStrLi = valueOrElse(getString(this, "setup_pzPools"), "3P3EnYA57kMZ8kXVVThi1ZZApZeXUQHqtEe,3PCpjLGo4wDuv23kjmGF6mHs86Bf3soYvAq,3P4U6fo7BZHDymQK82G5pveGPH7CA6PbKit")
1111
1212 func strToAddress (accum,addressStr) = (accum ++ [valueOrErrorMessage(addressFromString(addressStr), "wrong address in pzPools")])
1313
1414
1515 let pzPools = {
1616 let $l = split(pzPoolsStrLi, ",")
1717 let $s = size($l)
1818 let $acc0 = nil
1919 func $f0_1 ($a,$i) = if (($i >= $s))
2020 then $a
2121 else strToAddress($a, $l[$i])
2222
2323 func $f0_2 ($a,$i) = if (($i >= $s))
2424 then $a
2525 else throw("List size exceeds 20")
2626
2727 $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($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), 16), 17), 18), 19), 20)
2828 }
29+
30+let DistributeIterations = valueOrElse(getInteger(this, "setup_distributeIterations"), 6)
31+
32+let DistributeDelay = valueOrElse(getInteger(this, "setup_distributeDelay"), (60 * 4))
2933
3034 func getAssetString (assetId) = match assetId {
3135 case b: ByteVector =>
3236 toBase58String(b)
3337 case _ =>
3438 "WAVES"
3539 }
3640
3741
3842 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
3943 then unit
4044 else fromBase58String(assetIdStr)
4145
4246
4347 func getBalance (assetIdStr) = if ((assetIdStr == "WAVES"))
4448 then wavesBalance(this).available
4549 else assetBalance(this, fromBase58String(assetIdStr))
4650
4751
4852 func tokenToSwap (assetIdStr) = if ((assetIdStr == "WAVES"))
4953 then (getBalance("WAVES") - 10000000)
5054 else getBalance(assetIdStr)
5155
5256
5357 @Callable(i)
5458 func stakeLP () = {
5559 let assetIdStr = getAssetString(i.payments[0].assetId)
5660 if ((getString(("whitelist_" + toString(i.caller))) != "yes"))
5761 then throw("whitelist only")
5862 else if ((indexOf(pzLps, assetIdStr) != unit))
5963 then {
6064 let inv2 = invoke(pzPools[value(indexOf(pzLps, assetIdStr))], "stakeIndexFor", [toString(this)], [i.payments[0]])
6165 if ((inv2 == inv2))
6266 then nil
6367 else throw("Strict value is not equal to itself.")
6468 }
6569 else nil
6670 }
6771
6872
6973
7074 @Callable(i)
7175 func unstakeLP (assetIdStr,amount) = if ((getString(("whitelist_" + toString(i.caller))) != "yes"))
7276 then throw("whitelist only")
7377 else if ((indexOf(pzLps, assetIdStr) != unit))
7478 then {
7579 let inv2 = invoke(pzPools[value(indexOf(pzLps, assetIdStr))], "unstakeIndex", [amount], nil)
7680 if ((inv2 == inv2))
7781 then [ScriptTransfer(i.caller, amount, fromBase58String(assetIdStr))]
7882 else throw("Strict value is not equal to itself.")
7983 }
8084 else nil
8185
8286
8387
8488 @Callable(i)
85-func compoundRewards (assetIdStr) = if ((indexOf(pzLps, assetIdStr) != unit))
86- then {
87- let lpNum = value(indexOf(pzLps, assetIdStr))
88- let pzPool = pzPools[lpNum]
89- let pzTokens = split(getStringValue(pzPool, "static_tokenIds"), ",")
90- let pzBaseT = getStringValue(pzPool, "static_baseTokenId")
91- let inv1 = invoke(pzPool, "claimIndexRewards", nil, nil)
92- if ((inv1 == inv1))
93- then {
94- func f2 (accum,next) = if ((next != pzBaseT))
95- then {
96- let inv3 = invoke(pzPool, "swap", [pzBaseT, 0], [AttachedPayment(getAssetBytes(next), tokenToSwap(next))])
97- if ((inv3 == inv3))
98- then accum
99- else throw("Strict value is not equal to itself.")
89+func compoundRewards (assetIdStr) = if (((valueOrElse(getInteger(("stats_lastDistribution_" + assetIdStr)), 0) + DistributeDelay) > height))
90+ then throw("cannot be called yet")
91+ else if ((indexOf(pzLps, assetIdStr) != unit))
92+ then {
93+ let lpNum = value(indexOf(pzLps, assetIdStr))
94+ let pzPool = pzPools[lpNum]
95+ let pzTokens = split(getStringValue(pzPool, "static_tokenIds"), ",")
96+ let pzBaseT = getStringValue(pzPool, "static_baseTokenId")
97+ let inv1 = invoke(pzPool, "claimIndexRewards", nil, nil)
98+ if ((inv1 == inv1))
99+ then {
100+ func f2 (accum,next) = if ((next != pzBaseT))
101+ then {
102+ let inv3 = invoke(pzPool, "swap", [pzBaseT, 0], [AttachedPayment(getAssetBytes(next), tokenToSwap(next))])
103+ if ((inv3 == inv3))
104+ then accum
105+ else throw("Strict value is not equal to itself.")
106+ }
107+ else accum
108+
109+ let swapsInvokes = {
110+ let $l = pzTokens
111+ let $s = size($l)
112+ let $acc0 = nil
113+ func $f1_1 ($a,$i) = if (($i >= $s))
114+ then $a
115+ else f2($a, $l[$i])
116+
117+ func $f1_2 ($a,$i) = if (($i >= $s))
118+ then $a
119+ else throw("List size exceeds 10")
120+
121+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
100122 }
101- else accum
123+ let toDeposit = tokenToSwap(pzBaseT)
124+ func handler (accum,assetIdStr) = if ((assetIdStr == pzBaseT))
125+ then accum
126+ else {
127+ let assetId = getAssetBytes(assetIdStr)
128+ let assetWeight = getIntegerValue(pzPool, (("static_" + assetIdStr) + "_weight"))
129+ let amount = fraction(toDeposit, assetWeight, 10000)
130+ let in = match reentrantInvoke(pzPool, "swap", [assetIdStr, 0], [AttachedPayment(getAssetBytes(pzBaseT), amount)]) {
131+ case x: Int =>
132+ x
133+ case _ =>
134+ 0
135+ }
136+ if ((in == in))
137+ then (accum ++ [AttachedPayment(assetId, in)])
138+ else throw("Strict value is not equal to itself.")
139+ }
102140
103- let swapsInvokes = {
104- let $l = pzTokens
105- let $s = size($l)
106- let $acc0 = nil
107- func $f1_1 ($a,$i) = if (($i >= $s))
108- then $a
109- else f2($a, $l[$i])
141+ let baseAssetWeight = getIntegerValue(pzPool, (("static_" + pzBaseT) + "_weight"))
142+ let basePayAmount = fraction(toDeposit, baseAssetWeight, 10000)
143+ let exchangeInvokes = {
144+ let $l = pzTokens
145+ let $s = size($l)
146+ let $acc0 = [AttachedPayment(getAssetBytes(pzBaseT), basePayAmount)]
147+ func $f2_1 ($a,$i) = if (($i >= $s))
148+ then $a
149+ else handler($a, $l[$i])
110150
111- func $f1_2 ($a,$i) = if (($i >= $s))
112- then $a
113- else throw("List size exceeds 10")
151+ func $f2_2 ($a,$i) = if (($i >= $s))
152+ then $a
153+ else throw("List size exceeds 9")
114154
115- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
155+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
156+ }
157+ if ((exchangeInvokes == exchangeInvokes))
158+ then {
159+ let lpAmount = match reentrantInvoke(pzPool, "generateIndex", [false], exchangeInvokes) {
160+ case x: Int =>
161+ x
162+ case _ =>
163+ 0
164+ }
165+ if ((lpAmount == lpAmount))
166+ then {
167+ let toDistribute = (lpAmount / DistributeIterations)
168+ let inv5 = invoke(Address(base58'3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou'), "addInterestEXTERNAL", nil, [AttachedPayment(fromBase58String(assetIdStr), toDistribute)])
169+ if ((inv5 == inv5))
170+ then [IntegerEntry(("stats_lastDistribution_" + assetIdStr), height), IntegerEntry(("stats_totalDistributed_" + assetIdStr), (valueOrElse(getInteger(("stats_totalDistributed_" + assetIdStr)), 0) + toDistribute))]
171+ else throw("Strict value is not equal to itself.")
172+ }
173+ else throw("Strict value is not equal to itself.")
174+ }
175+ else throw("Strict value is not equal to itself.")
116176 }
117- let toDeposit = tokenToSwap(pzBaseT)
118- func handler (accum,assetIdStr) = if ((assetIdStr == pzBaseT))
119- then accum
120- else {
121- let assetId = getAssetBytes(assetIdStr)
122- let assetWeight = getIntegerValue(pzPool, (("static_" + assetIdStr) + "_weight"))
123- let amount = fraction(toDeposit, assetWeight, 10000)
124- let in = match reentrantInvoke(pzPool, "swap", [assetIdStr, 0], [AttachedPayment(getAssetBytes(pzBaseT), amount)]) {
125- case x: Int =>
126- x
127- case _ =>
128- 0
129- }
130- if ((in == in))
131- then (accum ++ [AttachedPayment(assetId, in)])
132- else throw("Strict value is not equal to itself.")
133- }
134-
135- let baseAssetWeight = getIntegerValue(pzPool, (("static_" + pzBaseT) + "_weight"))
136- let basePayAmount = fraction(toDeposit, baseAssetWeight, 10000)
137- let exchangeInvokes = {
138- let $l = pzTokens
139- let $s = size($l)
140- let $acc0 = [AttachedPayment(getAssetBytes(pzBaseT), basePayAmount)]
141- func $f2_1 ($a,$i) = if (($i >= $s))
142- then $a
143- else handler($a, $l[$i])
144-
145- func $f2_2 ($a,$i) = if (($i >= $s))
146- then $a
147- else throw("List size exceeds 9")
148-
149- $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
150- }
151- if ((exchangeInvokes == exchangeInvokes))
152- then {
153- let lpAmount = match reentrantInvoke(pzPool, "generateIndex", [false], exchangeInvokes) {
154- case x: Int =>
155- x
156- case _ =>
157- 0
158- }
159- if ((lpAmount == lpAmount))
160- then {
161- let inv5 = invoke(Address(base58'3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou'), "addInterestEXTERNAL", nil, [AttachedPayment(fromBase58String(assetIdStr), lpAmount)])
162- if ((inv5 == inv5))
163- then nil
164- else throw("Strict value is not equal to itself.")
165- }
166- else throw("Strict value is not equal to itself.")
167- }
168- else throw("Strict value is not equal to itself.")
169- }
170- else throw("Strict value is not equal to itself.")
171- }
172- else throw("wrong assetIdStr")
177+ else throw("Strict value is not equal to itself.")
178+ }
179+ else throw("wrong assetIdStr")
173180
174181
175182
176183 @Callable(i)
177184 func updateString (k,v) = if ((i.caller != this))
178185 then throw("self invoke only")
179186 else [StringEntry(k, v)]
180187
181188
182189
183190 @Callable(i)
184191 func addSupportedPool (pzTokenId,pzPool) = if ((i.caller != this))
185192 then throw("self invoke only")
186193 else [StringEntry("setup_supportedAssets", ((getStringValue(this, "setup_supportedAssets") + ",") + pzTokenId)), StringEntry("setup_pzPools", ((getStringValue(this, "setup_pzPools") + ",") + toString(addressFromStringValue(pzPool))))]
187194
188195
189196
190197 @Callable(i)
191198 func initNewMaster (master) = {
192199 let addressOK = match addressFromString(master) {
193200 case a: Address =>
194201 true
195202 case _ =>
196203 false
197204 }
198205 if (!(addressOK))
199206 then throw(("incorrect address " + master))
200207 else if ((i.caller != this))
201208 then throw("available for self call only")
202209 else [StringEntry("verifier_master", master)]
203210 }
204211
205212
206213
207214 @Callable(i)
208215 func requestNewMaster (newMaster) = {
209216 let addressOK = match addressFromString(newMaster) {
210217 case a: Address =>
211218 true
212219 case _ =>
213220 false
214221 }
215222 if (!(addressOK))
216223 then throw(("incorrect address " + newMaster))
217224 else if ((indexOf(sentinels, i.caller) == unit))
218225 then throw("whitelist only")
219226 else [StringEntry("verifier_newMaster", newMaster), IntegerEntry("verifier_newMasterEligibleAfter", (height + 10000))]
220227 }
221228
222229
223230
224231 @Callable(i)
225232 func activateNewMaster () = {
226233 let eligibleHeight = getIntegerValue(this, "verifier_newMasterEligibleAfter")
227234 let newMaster = getStringValue(this, "verifier_newMaster")
228235 if ((indexOf(sentinels, i.caller) == unit))
229236 then throw("whitelist only")
230237 else if ((eligibleHeight > height))
231238 then throw("new master cannot be activated yet")
232239 else [DeleteEntry("verifier_newMaster"), DeleteEntry("verifier_newMasterEligibleAfter"), StringEntry("verifier_master", newMaster)]
233240 }
234241
235242
236243 @Verifier(tx)
237244 func verify () = {
238245 let masterAddress = getString("verifier_master")
239246 let approvedByMaster = match masterAddress {
240247 case x: String =>
241248 match getInteger(addressFromStringValue(x), ("approvedTx_" + toBase58String(tx.id))) {
242249 case y: Int =>
243250 y
244251 case _ =>
245252 0
246253 }
247254 case _ =>
248255 1
249256 }
250257 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
251258 then (approvedByMaster > 0)
252259 else false
253260 }
254261

github/deemru/w8io/3ef1775 
138.70 ms