tx · G69cBD6mnqUvtQv7x1MefQPAEzUQs1WqVk9UUc5gCHkd

3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA:  -0.02100000 Waves

2023.02.27 12:42 [2467950] smart account 3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA > SELF 0.00000000 Waves

{ "type": 13, "id": "G69cBD6mnqUvtQv7x1MefQPAEzUQs1WqVk9UUc5gCHkd", "fee": 2100000, "feeAssetId": null, "timestamp": 1677490964824, "version": 1, "sender": "3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA", "senderPublicKey": "D46gQxzmdzdCTYRg6dMcwFoUrc6ZmxF6GKd5ZoTkvzp1", "proofs": [ "5dgVDZ6pLH1Qv7NLAkQ7YeL3khaFw7NSWWmExPXYAvBSjrhLbdcPvXsKvUWuGTQxdufLN76Cd4Reh4vTEjV8F3f3" ], "script": "base64:BgLFEwgCEgMKAQgSABIECgIIARIHCgUICAgIARIECgIICBIFCgMICAESBAoCCAgSAwoBARIDCgEBEgQKAggIEgQKAggEEgASAwoBARIAEgQKAggIEgQKAggIEgQKAggIIglzZXBhcmF0b3IiDnBvb2xXZWlnaHRNdWx0Ig9tYXhEZXB0aERlZmF1bHQiFmZpbmFsaXphdGlvblN0YWdlVG90YWwiF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzIg5rZXlFcG9jaExlbmd0aCIPa2V5Q3VycmVudEVwb2NoIgtrZXlNYXhEZXB0aCIia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdCISa2V5RmFjdG9yeUNvbnRyYWN0IhNrZXlCb29zdGluZ0NvbnRyYWN0IhJrZXlTdGFraW5nQ29udHJhY3QiFGtleUZpbmFsaXphdGlvblN0YWdlIgtrZXlOZXh0UG9vbCILa2V5TmV4dFVzZXIiDmtleVN0YXJ0SGVpZ2h0IhFrZXlDdXJyZW50RXBvY2hVaSIQa2V5U3RhcnRIZWlnaHRVaSIda2V5RmluYWxpemF0aW9uU2hvdWxkQmVGb3JjZWQiFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaCIFZXBvY2giDGtleUZpbmFsaXplZCIJa2V5SW5MaXN0IgRwb29sIgskdDAxNTExMTU1MSINYW1vdW50QXNzZXRJZCIMcHJpY2VBc3NldElkIgdrZXlVc2VkIgdhZGRyZXNzIgdrZXlWb3RlIgskdDAxODI1MTg2NSIPa2V5Vm90aW5nUmVzdWx0IgskdDAyMDQ3MjA4NyIMa2V5UG9vbFNoYXJlIgskdDAyMjUyMjI5MiINa2V5VG90YWxWb3RlcyIOZ2V0VmFsdWVPckZhaWwiA2tleSIEdHlwZSIFZXJyb3IiByRtYXRjaDAiA3N0ciIDaW50IgxnZXRTdHJPckZhaWwiAUAiDGdldEludE9yRmFpbCIMcG9vbFRvU3RyaW5nIgxzdHJpbmdUb1Bvb2wiBXBhcnRzIhZnZXRMcEFzc2V0QnlQb29sQXNzZXRzIh9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkIgxiYXNlQXNzZXRTdHIiKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzIhhpbnRlcm5hbEFtb3VudEFzc2V0SWRTdHIiF2ludGVybmFsUHJpY2VBc3NldElkU3RyIh9rZXlNYXBwaW5nUG9vbENvbnRyYWN0VG9MUEFzc2V0IhNwb29sQ29udHJhY3RBZGRyZXNzIg9mYWN0b3J5Q29udHJhY3QiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiCWxwQXNzZXRJZCIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsIgskdDA0NTM0NDU3NCINcG9vbHNMaXN0TmFtZSIQZ2V0Vm90ZXNMaXN0TmFtZSILJHQwNDg3NTQ5MTUiC2tleUxpc3RIZWFkIghsaXN0TmFtZSIEbWV0YSILa2V5TGlzdFNpemUiC2tleUxpc3RQcmV2IgJpZCILa2V5TGlzdE5leHQiDGNvbnRhaW5zTm9kZSIKaGVhZE9yVW5pdCIKcHJldk9yVW5pdCIKbmV4dE9yVW5pdCIRaW5zZXJ0Tm9kZUFjdGlvbnMiCGxpc3RTaXplIgljaGVja05vZGUiEWRlbGV0ZU5vZGVBY3Rpb25zIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCIBcyIdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQiFXBlcm1pc3Npb25EZW5pZWRFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiC2NoZWNrQ2FsbGVyIhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSILdXNlckFkZHJlc3MiDHRhcmdldEhlaWdodCIXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MiH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiD3N0YWtpbmdDb250cmFjdCILZXBvY2hMZW5ndGgiBmNoZWNrcyINaW5MaXN0QWN0aW9ucyIYY3VycmVudEVwb2NoSXNOb3REZWZpbmVkIhJzdGFydEhlaWdodEFjdGlvbnMiBmFtb3VudCILc3RhcnRIZWlnaHQiCWVuZEhlaWdodCIXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQiBHVzZWQiBHZvdGUiCnBvb2xSZXN1bHQiCnRvdGFsVm90ZXMiE2d3eEFtb3VudEF0RW5kVG90YWwiCWF2YWlsYWJsZSIHbmV3Vm90ZSIKd3hFbWlzc2lvbiINdm90ZXNMaXN0TmFtZSIOdXNlckFkZHJlc3NTdHIiEHZvdGVzTGlzdEFjdGlvbnMiDm5ld0Vwb2NoTGVuZ3RoIgtuZXdNYXhEZXB0aCIHcG9vbFN0ciINZXBvY2hQcmV2aW91cyITc3RhcnRIZWlnaHRQcmV2aW91cyIRZW5kSGVpZ2h0UHJldmlvdXMiEGNoZWNrVGFyZ2V0RXBvY2giDSR0MDE3MjcwMTczMTAiG2d3eEFtb3VudEF0RW5kVG90YWxQcmV2aW91cyIMdm90aW5nUmVzdWx0Igx2b3RlUHJldmlvdXMiB2FjdGlvbnMiBWZvcmNlIgt0YXJnZXRFcG9jaCIMY3VycmVudEVwb2NoIg0kdDAxOTAzNjE5MDc2IgFyIgVzaGFyZSIPbW9kaWZ5V2VpZ2h0SW52IhBwb29sc0xpc3RBY3Rpb25zIg1wcmV2aW91c0Vwb2NoIghuZXdFcG9jaCIKcG9vbE9yVW5pdCIKdXNlck9yVW5pdCIHJG1hdGNoMSIMcG9vbHNIZWFkU3RyIg5uZXh0VXNlck9yVW5pdCIEdXNlciIEbmV4dCIOcHJvY2Vzc1ZvdGVJbnYiDm5leHRQb29sT3JVbml0IgckbWF0Y2gyIghuZXh0VXNlciILbmV4dFBvb2xTdHIiB2NvdW50ZXIiBnJlc3VsdCIIbWF4RGVwdGgiA2ludiICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5MgABYQICX18AAWIAgMLXLwABYwAKAAFkAAAAAWUAAQABZgkAuQkCCQDMCAICAiVzCQDMCAICC2Vwb2NoTGVuZ3RoBQNuaWwFAWEAAWcJALkJAgkAzAgCAgIlcwkAzAgCAgxjdXJyZW50RXBvY2gFA25pbAUBYQABaAkAuQkCCQDMCAICAiVzCQDMCAICCG1heERlcHRoBQNuaWwFAWEAAWkJALkJAgkAzAgCAgIlcwkAzAgCAh92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQNuaWwFAWEAAWoJALkJAgkAzAgCAgIlcwkAzAgCAg9mYWN0b3J5Q29udHJhY3QFA25pbAUBYQABawkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUBYQABbAkAuQkCCQDMCAICAiVzCQDMCAICD3N0YWtpbmdDb250cmFjdAUDbmlsBQFhAAFtCQC5CQIJAMwIAgICJXMJAMwIAgIRZmluYWxpemF0aW9uU3RhZ2UFA25pbAUBYQABbgkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRQb29sBQNuaWwFAWEAAW8JALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0VXNlcgUDbmlsBQFhAAFwCQC5CQIJAMwIAgICJXMJAMwIAgILc3RhcnRIZWlnaHQFA25pbAUBYQABcQkAuQkCCQDMCAICAiVzCQDMCAICDmN1cnJlbnRFcG9jaFVpBQNuaWwFAWEAAXIJALkJAgkAzAgCAgIlcwkAzAgCAg1zdGFydEhlaWdodFVpBQNuaWwFAWEAAXMJALkJAgkAzAgCAgIlcwkAzAgCAgVmb3JjZQUDbmlsBQFhAQF0AQF1CQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFAXUFA25pbAUBYQEBdgEBdQkAuQkCCQDMCAICBCVzJWQJAMwIAgIJZmluYWxpemVkCQDMCAIJAKQDAQUBdQUDbmlsBQFhAQF3AQF4BAF5BQF4BAF6CAUBeQJfMQQBQQgFAXkCXzIJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGaW5MaXN0CQDMCAIFAXoJAMwIAgUBQQUDbmlsBQFhAQFCAgFDAXUJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIEdXNlZAkAzAgCCQClCAEFAUMJAMwIAgkApAMBBQF1BQNuaWwFAWEBAUQDAXgBQwF1BAFFBQF4BAF6CAUBRQJfMQQBQQgFAUUCXzIJALkJAgkAzAgCAgolcyVzJXMlcyVkCQDMCAICBHZvdGUJAMwIAgUBegkAzAgCBQFBCQDMCAIJAKUIAQUBQwkAzAgCCQCkAwEFAXUFA25pbAUBYQEBRgIBeAF1BAFHBQF4BAF6CAUBRwJfMQQBQQgFAUcCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAgx2b3RpbmdSZXN1bHQJAMwIAgUBegkAzAgCBQFBCQDMCAIJAKQDAQUBdQUDbmlsBQFhAQFIAgF4AXUEAUkFAXgEAXoIBQFJAl8xBAFBCAUBSQJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICCXBvb2xTaGFyZQkAzAgCBQF6CQDMCAIFAUEJAMwIAgkApAMBBQF1BQNuaWwFAWEBAUoBAXUJALkJAgkAzAgCAgQlcyVkCQDMCAICCnRvdGFsVm90ZXMJAMwIAgkApAMBBQF1BQNuaWwFAWEBAUsDAUMBTAFNBAFOCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAUMJAMwIAgIBLgkAzAgCBQFMCQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgQBTwUBTQMJAAECBQFPAgZTdHJpbmcEAVAFAU8JAJ0IAgUBQwUBTAMJAAECBQFPAgNJbnQEAVEFAU8JAJoIAgUBQwUBTAkAAgECEmludmFsaWQgZW50cnkgdHlwZQUBTgEBUgIBQwFMCgABUwkBAUsDBQFDBQFMAgADCQABAgUBUwIGU3RyaW5nBQFTCQACAQkArAICCQADAQUBUwIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAQFUAgFDAUwKAAFTCQEBSwMFAUMFAUwAAAMJAAECBQFTAgNJbnQFAVMJAAIBCQCsAgIJAAMBBQFTAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBAVUBAXgJAKwCAgkArAICCAUBeAJfMQUBYQgFAXgCXzIBAVYBAVAEAVcJALUJAgUBUAUBYQMJAAACCQCQAwEFAVcAAgkAlAoCCQCRAwIFAVcAAAkAkQMCBQFXAAEJAAIBAhNpbnZhbGlkIHBvb2wgc3RyaW5nAQFYAgF6AUEKAQFZAQFaCQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAVoKAQJhYQICYWICYWMJAKwCAgkArAICCQCsAgIJAKwCAgIKJWQlZCVzJXNfXwkApAMBBQJhYgICX18JAKQDAQUCYWMCI19fbWFwcGluZ3NfX3Bvb2xBc3NldHMyUG9vbENvbnRyYWN0CgECYWQBAmFlCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFlAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAQCYWYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFSAgUEdGhpcwUBagQCYWcJAQFUAgUCYWYJAQFZAQUBegQCYWgJAQFUAgUCYWYJAQFZAQUBQQQCYWUJAQFSAgUCYWYJAQJhYQIFAmFnBQJhaAQCYWkJAQFSAgUCYWYJAQJhZAEFAmFlBQJhaQECYWoBAXgEAmFrBQF4BAF6CAUCYWsCXzEEAUEIBQJhawJfMgQCYWYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFSAgUEdGhpcwUBagoAAVMJAPwHBAUCYWYCGGNoZWNrV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQF6CQDMCAIFAUEFA25pbAUDbmlsAwkAAQIFAVMCB0Jvb2xlYW4FAVMJAAIBCQCsAgIJAAMBBQFTAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAAJhbAIFcG9vbHMBAmFtAQF4BAJhbgUBeAQBeggFAmFuAl8xBAFBCAUCYW4CXzIJALkJAgkAzAgCAgV2b3RlcwkAzAgCBQF6CQDMCAIFAUEFA25pbAUBYQECYW8BAmFwBAJhcQMJAAACBQJhcAUCYWwCBCVzJXMCCCVzJXMlcyVzCQC5CQIJAMwIAgUCYXEJAMwIAgUCYXAJAMwIAgIEaGVhZAUDbmlsBQFhAQJhcgECYXAEAmFxAwkAAAIFAmFwBQJhbAIEJXMlcwIIJXMlcyVzJXMJALkJAgkAzAgCBQJhcQkAzAgCBQJhcAkAzAgCAgRzaXplBQNuaWwFAWEBAmFzAgJhcAJhdAQCYXEDCQAAAgUCYXAFAmFsAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFAmFxCQDMCAIFAmFwCQDMCAIFAmF0CQDMCAICBHByZXYFA25pbAUBYQECYXUCAmFwAmF0BAJhcQMJAAACBQJhcAUCYWwCCCVzJXMlcyVzAgolcyVzJXMlcyVzCQC5CQIJAMwIAgUCYXEJAMwIAgUCYXAJAMwIAgUCYXQJAMwIAgIEbmV4dAUDbmlsBQFhAQJhdgICYXACYXQEAmF3CQCdCAIFBHRoaXMJAQJhbwEFAmFwBAJheAkAnQgCBQR0aGlzCQECYXMCBQJhcAUCYXQEAmF5CQCdCAIFBHRoaXMJAQJhdQIFAmFwBQJhdAMDCQAAAgUCYXQJAQt2YWx1ZU9yRWxzZQIFAmF3AgAGCQECIT0CBQJheAUEdW5pdAYJAQIhPQIFAmF5BQR1bml0AQJhegICYXACYXQEAmF3CQCdCAIFBHRoaXMJAQJhbwEFAmFwBAJhQQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYXIBBQJhcAAABAJhQgMJAQEhAQkBAmF2AgUCYXAFAmF0BgkAAgECC05vZGUgZXhpc3RzAwkAAAIFAmFCBQJhQgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcgEFAmFwCQBkAgUCYUEAAQUDbmlsAwkBAiE9AgUCYXcFBHVuaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AgUCYXAFAmF0CQEFdmFsdWUBBQJhdwkAzAgCCQELU3RyaW5nRW50cnkCCQECYXMCBQJhcAkBBXZhbHVlAQUCYXcFAmF0BQNuaWwFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQECYW8BBQJhcAUCYXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECYUMCAmFwAmF0BAJhdwkAnQgCBQR0aGlzCQECYW8BBQJhcAQCYUEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFyAQUCYXAAAAQCYXgJAJ0IAgUEdGhpcwkBAmFzAgUCYXAFAmF0BAJheQkAnQgCBQR0aGlzCQECYXUCBQJhcAUCYXQJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFyAQUCYXAJAGUCBQJhQQABBQNuaWwDAwkBAiE9AgUCYXgFBHVuaXQJAQIhPQIFAmF5BQR1bml0BwkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQJhcAkBBXZhbHVlAQUCYXgJAQV2YWx1ZQEFAmF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAmFwCQEFdmFsdWUBBQJheQkBBXZhbHVlAQUCYXgJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFzAgUCYXAFAmF0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAmFwBQJhdAUDbmlsAwkBAiE9AgUCYXkFBHVuaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFvAQUCYXAJAQV2YWx1ZQEFAmF5CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAmFwBQJhdAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXMCBQJhcAkBBXZhbHVlAQUCYXkFA25pbAMJAQIhPQIFAmF4BQR1bml0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFwBQJhdAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXUCBQJhcAkBBXZhbHVlAQUCYXgFA25pbAMJAAACBQJhdAkBC3ZhbHVlT3JFbHNlAgUCYXcCAAkAzAgCCQELRGVsZXRlRW50cnkBCQECYW8BBQJhcAUDbmlsCQACAQkArAICCQCsAgIJAKwCAgIOaW52YWxpZCBub2RlOiAFAmFwAgEuBQJhdAECYUQAAhQlc19fbWFuYWdlclB1YmxpY0tleQECYUUAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAmFGAAQBTwkAoggBCQECYUQAAwkAAQIFAU8CBlN0cmluZwQCYUcFAU8JANkEAQUCYUcDCQABAgUBTwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJhSAAEAU8JAKIIAQkBAmFFAAMJAAECBQFPAgZTdHJpbmcEAmFHBQFPCQDZBAEFAmFHAwkAAQIFAU8CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACYUkJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECYUoBAmFLAwkAAAIIBQJhSwZjYWxsZXIFBHRoaXMGBQJhSQECYUwBAmFLBAFPCQECYUYAAwkAAQIFAU8CCkJ5dGVWZWN0b3IEAmFNBQFPAwkAAAIIBQJhSw9jYWxsZXJQdWJsaWNLZXkFAmFNBgUCYUkDCQABAgUBTwIEVW5pdAkBAmFKAQUCYUsJAAIBAgtNYXRjaCBlcnJvchECYUsBCnNldE1hbmFnZXIBAmFOBAJhTwkBAmFMAQUCYUsDCQAAAgUCYU8FAmFPBAJhUAkA2QQBBQJhTgMJAAACBQJhUAUCYVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFFAAUCYU4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSwEOY29uZmlybU1hbmFnZXIABAJhUQkBAmFIAAQCYVIDCQEJaXNEZWZpbmVkAQUCYVEGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmFSBQJhUgQCYVMDCQAAAggFAmFLD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCYVEGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmFTBQJhUwkAzAgCCQELU3RyaW5nRW50cnkCCQECYUQACQDYBAEJAQV2YWx1ZQEFAmFRCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhRQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSwEYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0AgJhVAJhVQQCYVYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQEBUgIFBHRoaXMFAWsCIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAlAoCBQNuaWwKAAFTCQD8BwQFAmFWAiBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkAzAgCBQJhVAkAzAgCBQJhVQUDbmlsBQNuaWwDCQABAgUBUwIDSW50BQFTCQACAQkArAICCQADAQUBUwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AmFLAQtjb25zdHJ1Y3RvcgUCYWYCYVcCYVgCYVkCYVoEAmJhCQDMCAIJAQJhTAEFAmFLCQDMCAIDCQECIT0CCQCmCAEFAmFmBQR1bml0BgIgaW52YWxpZCBmYWN0b3J5IGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUCYVcFBHVuaXQGAjJpbnZhbGlkIHZvdGluZyBlbWlzc2lvbiBjYW5kaWRhdGUgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJhWAUEdW5pdAYCIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJhWQUEdW5pdAYCIGludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQBmAgUCYVoAAAYJAAIBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJhBQJiYQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWoFAmFmCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWkFAmFXCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWsFAmFYCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWwFAmFZCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFmBQJhWgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLAQZjcmVhdGUCAXoBQQQCYmEJAMwIAgMJAAACCQDYBAEICAUCYUsGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWkCAAYJAQJhTAEFAmFLBQNuaWwDCQAAAgUCYmEFAmJhBAF4CQCUCgIFAXoFAUEEAmJiCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF3AQUBeAYFA25pbAkBAmF6AgUCYWwJAQFVAQUBeAQCYmMJAAACCQCaCAIFBHRoaXMFAWcFBHVuaXQEAmJkAwUCYmMEAXUAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBZwUBdQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXQBBQF1BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAXAFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcQUBdQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcgUGaGVpZ2h0BQNuaWwFA25pbAkAlAoCCQDOCAIFAmJiBQJiZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSwEEdm90ZQMBegFBAmJlBAF4CQCUCgIFAXoFAUEEAXUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBZwAABAJiZgkBAVQCBQR0aGlzCQEBdAEFAXUEAmFaCQEBVAIFBHRoaXMFAWYEAmJnCQBkAgUCYmYFAmFaBAJiaAkAmggCBQR0aGlzBQFtBAJiaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBQgIIBQJhSwZjYWxsZXIFAXUAAAQCYmoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUQDBQF4CAUCYUsGY2FsbGVyBQF1AAAEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFGAgUBeAUBdQAABAJibAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBSgEFAXUAAAQCYm0KAAFTCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCCQDYBAEICAUCYUsGY2FsbGVyBWJ5dGVzCQDMCAIFAmJnBQNuaWwFA25pbAMJAAECBQFTAgNJbnQFAVMJAAIBCQCsAgIJAAMBBQFTAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJuCQBlAgUCYm0FAmJpBAJibwkAZAIFAmJqBQJiZQQCYnAJAQJhagEFAXgEAmJhCQDMCAIDCQECIT0CCQCgCAEJAQF3AQUBeAUEdW5pdAYJAAIBAg5pbnZhbGlkIGFzc2V0cwkAzAgCAwkAZgIFAmJnBQZoZWlnaHQGCQACAQIOaW52YWxpZCBoZWlnaHQJAMwIAgMJAAACBQJiaAUEdW5pdAYJAAIBAhhmaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MJAMwIAgMJAGYCBQJibQAABgkAAgECE3lvdSBkbyBub3QgaGF2ZSBnV1gJAMwIAgMDCQBmAgUCYmUAAAkAZwIFAmJuBQJiZQcGCQACAQIOaW52YWxpZCBhbW91bnQJAMwIAgMFAmJwBgkAAgECHXBvb2wgaGFzbid0IFdYX0VNSVNTSU9OIGxhYmVsBQNuaWwDCQAAAgUCYmEFAmJhBAJicQkBAmFtAQUBeAQCYnIJAKUIAQgFAmFLBmNhbGxlcgQCYnMDCQECYXYCBQJicQUCYnIFA25pbAkBAmF6AgUCYnEFAmJyCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUICCAUCYUsGY2FsbGVyBQF1CQBkAgUCYmkFAmJlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRAMFAXgIBQJhSwZjYWxsZXIFAXUFAmJvCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRgIFAXgFAXUJAGQCBQJiawUCYmUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFKAQUBdQkAZAIFAmJsBQJiZQUDbmlsBQJicwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSwEKY2FuY2VsVm90ZQIBegFBBAF4CQCUCgIFAXoFAUEEAXUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBZwAABAJiZgkBAVQCBQR0aGlzCQEBdAEFAXUEAmFaCQEBVAIFBHRoaXMFAWYEAmJnCQBkAgUCYmYFAmFaBAJiaAkAmggCBQR0aGlzBQFtBAJiaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBQgIIBQJhSwZjYWxsZXIFAXUAAAQCYmoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUQDBQF4CAUCYUsGY2FsbGVyBQF1AAAEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFGAgUBeAUBdQAABAJibAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBSgEFAXUAAAQCYmEJAMwIAgMJAQIhPQIJAKAIAQkBAXcBBQF4BQR1bml0BgkAAgECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYmcFBmhlaWdodAYJAAIBAg5pbnZhbGlkIGhlaWdodAkAzAgCAwkAAAIFAmJoBQR1bml0BgkAAgECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFAmJqAAAGCQACAQIHbm8gdm90ZQUDbmlsAwkAAAIFAmJhBQJiYQQCYnEJAQJhbQEFAXgEAmJyCQClCAEIBQJhSwZjYWxsZXIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBQgIIBQJhSwZjYWxsZXIFAXUJAJYDAQkAzAgCCQBlAgUCYmkFAmJqCQDMCAIAAAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFEAwUBeAgFAmFLBmNhbGxlcgUBdQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUYCBQF4BQF1CQBlAgUCYmsFAmJqCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSgEFAXUJAGUCBQJibAUCYmoFA25pbAkBAmFDAgUCYnEFAmJyBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLAQ5zZXRFcG9jaExlbmd0aAECYnQEAmJhCQDMCAIJAQJhTAEFAmFLCQDMCAIDCQBmAgUCYnQAAAYJAAIBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJhBQJiYQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFmBQJidAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLAQtzZXRNYXhEZXB0aAECYnUEAmJhCQDMCAIJAQJhTAEFAmFLCQDMCAIDCQBmAgUCYnUAAAYJAAIBAhFpbnZhbGlkIG1heCBkZXB0aAUDbmlsAwkAAAIFAmJhBQJiYQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFoBQJidQUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLARNwcm9jZXNzVm90ZUlOVEVSTkFMAgJidgJicgQCYU8JAQJhSgEFAmFLAwkAAAIFAmFPBQJhTwQCYVQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQJicgkArAICAipwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHVzZXIgYWRkcmVzcyAFAmJyBAF1CQEBVAIFBHRoaXMFAWcEAmJ3CQBlAgUBdQABBAJhWgkBAVQCBQR0aGlzBQFmBAJiZgkBAVQCBQR0aGlzCQEBdAEFAXUEAmJnCQBkAgUCYmYFAmFaBAJieAkBAVQCBQR0aGlzCQEBdAEFAmJ3BAJieQkAZAIFAmJ4BQJhWgQCYnoDCQBnAgUCYncAAAYJAAIBAitwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHByZXZpb3VzIGVwb2NoAwkAAAIFAmJ6BQJiegQBeAkBAVYBBQJidgQCYkEFAXgEAXoIBQJiQQJfMQQBQQgFAmJBAl8yBAJicAkBAmFqAQUBeAQCYm0KAAFTCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCBQJicgkAzAgCBQJiZwUDbmlsBQNuaWwDCQABAgUBUwIDSW50BQFTCQACAQkArAICCQADAQUBUwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJiQgoAAVMJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAmJyCQDMCAIFAmJ5BQNuaWwFA25pbAMJAAECBQFTAgNJbnQFAVMJAAIBCQCsAgIJAAMBBQFTAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJsCQELdmFsdWVPckVsc2UCCQCfCAEJAQFKAQUBdQAABAJiQwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBRgIFAXgFAXUAAAQCYkQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEBRAMFAXgFAmFUBQJidwkArAICCQCsAgIJAKwCAgkArAICAhRwcm9jZXNzVm90ZUlOVEVSTkFMIAUCYnYCASAFAmJyAhI6IG5vIHByZXZpb3VzIHZvdGUEAmJpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFCAgUCYVQFAXUAAAQCYm8DCQBmAgUCYkIAAAkAawMFAmJEBQJibQUCYkIAAAQCYkUDAwkAZgIFAmJvAAAFAmJwBwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUQDBQF4BQJhVAUBdQUCYm8JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFKAQUBdQkAZAIFAmJsBQJibwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUYCBQF4BQF1CQBkAgUCYkMFAmJvCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBQgIFAmFUBQF1CQBkAgUCYmkFAmJvBQNuaWwJAQJhQwIJAQJhbQEFAXgFAmJyCQCUCgIFAmJFBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLARNwcm9jZXNzUG9vbElOVEVSTkFMAgJidgJiRgQCYU8JAQJhSgEFAmFLAwkAAAIFAmFPBQJhTwQCYkcEAmJICQEBVAIFBHRoaXMFAWcDBQJiRgUCYkgJAGUCBQJiSAABBAJiegMJAGcCBQJiRwAABgkAAgECKXByb2Nlc3NQb29sSU5URVJOQUw6IGludmFsaWQgdGFyZ2V0IGVwb2NoAwkAAAIFAmJ6BQJiegQBeAkBAVYBBQJidgQCYkkFAXgEAXoIBQJiSQJfMQQBQQgFAmJJAl8yBAJhWQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAVICBQR0aGlzBQFsBAJhZgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAVICBQR0aGlzBQFqBAJhaQkBAVgCBQF6BQFBBAJiSgoAAVMJAPwHBAUCYVkCEnVzZXJzTGlzdFRyYXZlcnNhbAkAzAgCBQJhaQUDbmlsBQNuaWwDCQABAgUBUwIHQm9vbGVhbgUBUwkAAgEJAKwCAgkAAwEFAVMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCYkoFAmJKAwUCYkoJAJQKAgUDbmlsBgQCYnAJAQJhagEFAXgEAmJsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFKAQUCYkcAAAQCYkMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUYCBQF4BQJiRwAABAJiSwMDCQAAAgUCYmwAAAYJAQEhAQUCYnAAAAkAawMFAmJDBQFiBQJibAQCYkwJAPwHBAUCYWYCDG1vZGlmeVdlaWdodAkAzAgCBQJhaQkAzAgCBQJiSwUDbmlsBQNuaWwDCQAAAgUCYkwFAmJMBAJiTQMDBQJicAYFAmJGBQNuaWwJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEBdwEFAXgFA25pbAkBAmFDAgUCYWwFAmJ2CQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUgCBQF4BQJiRwUCYksFA25pbAUCYk0HCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLAQ5maW5hbGl6ZUhlbHBlcgAEAmJGCQELdmFsdWVPckVsc2UCCQCgCAEFAXMHBAF1CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWcAAAQCYk4JAGUCBQF1AAEEAmJmCQEBVAIFBHRoaXMJAQF0AQUBdQQCYVoJAQFUAgUEdGhpcwUBZgQCYmcJAGQCBQJiZgUCYVoEAmJoCQCaCAIFBHRoaXMFAW0DAwMJAGcCBQZoZWlnaHQFAmJnCQAAAgUCYmgFBHVuaXQHCQEBIQEFAmJGBwQCYk8JAGQCBQF1AAEJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXQBBQJiTwUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFwBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAWcFAmJPCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFtBQFkBQNuaWwGAwMFAmJGCQAAAgUCYmgFBHVuaXQHCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAW0FAWUFA25pbAYDCQAAAgUCYmgFBHVuaXQJAJQKAgUDbmlsBwMJAAACBQJiaAUBZAQCYlAJAKIIAQUBbgQCYlEJAKIIAQUBbwQBTwUCYlADCQABAgUBTwIEVW5pdAQCYlIJAKIIAQkBAmFvAQUCYWwDCQABAgUCYlICBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBbQUBZQkAzAgCCQELRGVsZXRlRW50cnkBBQFuCQDMCAIJAQtEZWxldGVFbnRyeQEFAW8FA25pbAYDCQABAgUCYlICBlN0cmluZwQCYlMFAmJSCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbgUCYlMFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQFPAgZTdHJpbmcEAmJ2BQFPBAF4CQEBVgEFAmJ2BAJiVAQCYlIFAmJRAwkAAQIFAmJSAgRVbml0CQCiCAEJAQJhbwEJAQJhbQEFAXgDCQABAgUCYlICBlN0cmluZwQCYlUFAmJSBAJiVgkAoggBCQECYXUCCQECYW0BBQF4BQJiVQMJAAACBQJiVgUCYlYEAmJXCQD8BwQFBHRoaXMCE3Byb2Nlc3NWb3RlSU5URVJOQUwJAMwIAgUCYnYJAMwIAgUCYlUFA25pbAUDbmlsAwkAAAIFAmJXBQJiVwUCYlYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgQCYlIFAmJUAwkAAQIFAmJSAgRVbml0BAJiWAkAoggBCQECYXUCBQJhbAUCYnYEAmJZBQJiWAMJAAECBQJiWQIEVW5pdAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFtBQFlCQDMCAIJAQtEZWxldGVFbnRyeQEFAW4JAMwIAgkBC0RlbGV0ZUVudHJ5AQUBbwUDbmlsBgMJAAECBQJiWQIGU3RyaW5nBAJhRwUCYlkJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFuBQJhRwkAzAgCCQELRGVsZXRlRW50cnkBBQFvBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IDCQABAgUCYlICBlN0cmluZwQCYloFAmJSCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbwUCYloFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECC01hdGNoIGVycm9yAwkAAAIFAmJoBQFlBAJiUAkAoggBBQFuBAFPBQJiUAMJAAECBQFPAgRVbml0BAJiUgkAoggBCQECYW8BBQJhbAMJAAECBQJiUgIEVW5pdAQCYkUDBQJiRgkAzAgCCQELRGVsZXRlRW50cnkBBQFtCQDMCAIJAQtEZWxldGVFbnRyeQEFAXMFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQFtCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBdgEFAmJOBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcQUBdQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcgUCYmYFA25pbAkAlAoCBQJiRQYDCQABAgUCYlICBlN0cmluZwQCY2EFAmJSCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbgUCY2EFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQFPAgZTdHJpbmcEAmJ2BQFPBAJiWAkAoggBCQECYXUCBQJhbAUCYnYDCQAAAgUCYlgFAmJYBAJiSgoAAVMJAPwHBAUEdGhpcwITcHJvY2Vzc1Bvb2xJTlRFUk5BTAkAzAgCBQJidgkAzAgCBQJiRgUDbmlsBQNuaWwDCQABAgUBUwIHQm9vbGVhbgUBUwkAAgEJAKwCAgkAAwEFAVMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCYkoFAmJKAwUCYkoJAJQKAgUDbmlsBgQCYlIFAmJYAwkAAQIFAmJSAgRVbml0BAJiRQMFAmJGCQDMCAIJAQtEZWxldGVFbnRyeQEFAW0JAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcwkAzAgCCQELRGVsZXRlRW50cnkBBQFuBQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBbQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAXYBBQJiTgYJAMwIAgkBDEludGVnZXJFbnRyeQIFAXEFAXUJAMwIAgkBDEludGVnZXJFbnRyeQIFAXIFAmJmCQDMCAIJAQtEZWxldGVFbnRyeQEFAW4FA25pbAkAlAoCBQJiRQYDCQABAgUCYlICBlN0cmluZwQCY2EFAmJSCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbgUCY2EFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yCQACAQIWZmluYWxpemF0aW9uIGlzIGJyb2tlbgJhSwEPZmluYWxpemVXcmFwcGVyAQJjYgQCY2MKAAFTCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAMJAAECBQFTAgdCb29sZWFuBQFTCQACAQkArAICCQADAQUBUwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJjYwUCY2MDCQEBIQEFAmNjAwkAAAIFAmNiAAAJAAIBAh5DdXJyZW50IHZvdGluZyBpcyBub3Qgb3ZlciB5ZXQJAJQKAgUDbmlsBQR1bml0BAJjZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFoBQFjAwkAZgIFAmNkBQJjYgQCY2UJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGQCBQJjYgABBQNuaWwFA25pbAMJAAACBQJjZQUCY2UJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSwEIZmluYWxpemUABAJjZQkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQJjZQUCY2UJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFLARRjb250YWluc05vZGVSRUFET05MWQICYXACYXQJAJQKAgUDbmlsCQECYXYCBQJhcAUCYXQCYUsBCmluc2VydE5vZGUCAmFwAmF0BAJhTwkBAmFMAQUCYUsDCQAAAgUCYU8FAmFPCQCUCgIJAQJhegIFAmFwBQJhdAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhSwEKZGVsZXRlTm9kZQICYXACYXQEAmFPCQECYUwBBQJhSwMJAAACBQJhTwUCYU8JAJQKAgkBAmFDAgUCYXAFAmF0BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJjZgECY2cABAJjaAQBTwkBAmFGAAMJAAECBQFPAgpCeXRlVmVjdG9yBAJhTQUBTwUCYU0DCQABAgUBTwIEVW5pdAgFAmNmD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJjZglib2R5Qnl0ZXMJAJEDAggFAmNmBnByb29mcwAABQJjaE88kmM=", "chainId": 84, "height": 2467950, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: J5xk3tv5ZG3ejqi8Nb7LUtAzqNrUxLQh2U7ek9ud6Pa3 Next: 4qKned36cZMoopm7yQHvuynhorFRvzBGRvGv4zeBX7sR Diff:
OldNewDifferences
1212 let finalizationStageShares = 1
1313
1414 let keyEpochLength = makeString(["%s", "epochLength"], separator)
15-
16-let keyEpochLengthNew = makeString(["%s%s", "epochLength__new"], separator)
17-
18-func keyEpochLengthByEpoch (epoch) = makeString(["%s%d", "epochLength", toString(epoch)], separator)
19-
2015
2116 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
2217
5146
5247
5348 func keyInList (pool) = {
54- let $t016931733 = pool
55- let amountAssetId = $t016931733._1
56- let priceAssetId = $t016931733._2
49+ let $t015111551 = pool
50+ let amountAssetId = $t015111551._1
51+ let priceAssetId = $t015111551._2
5752 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
5853 }
5954
6257
6358
6459 func keyVote (pool,address,epoch) = {
65- let $t020072047 = pool
66- let amountAssetId = $t020072047._1
67- let priceAssetId = $t020072047._2
60+ let $t018251865 = pool
61+ let amountAssetId = $t018251865._1
62+ let priceAssetId = $t018251865._2
6863 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
6964 }
7065
7166
7267 func keyVotingResult (pool,epoch) = {
73- let $t022292269 = pool
74- let amountAssetId = $t022292269._1
75- let priceAssetId = $t022292269._2
68+ let $t020472087 = pool
69+ let amountAssetId = $t020472087._1
70+ let priceAssetId = $t020472087._2
7671 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7772 }
7873
7974
8075 func keyPoolShare (pool,epoch) = {
81- let $t024342474 = pool
82- let amountAssetId = $t024342474._1
83- let priceAssetId = $t024342474._2
76+ let $t022522292 = pool
77+ let amountAssetId = $t022522292._1
78+ let priceAssetId = $t022522292._2
8479 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
8580 }
8681
145140
146141
147142 func checkWxEmissionPoolLabel (pool) = {
148- let $t047164756 = pool
149- let amountAssetId = $t047164756._1
150- let priceAssetId = $t047164756._2
143+ let $t045344574 = pool
144+ let amountAssetId = $t045344574._1
145+ let priceAssetId = $t045344574._2
151146 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
152147 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
153148 if ($isInstanceOf(@, "Boolean"))
159154 let poolsListName = "pools"
160155
161156 func getVotesListName (pool) = {
162- let $t050575097 = pool
163- let amountAssetId = $t050575097._1
164- let priceAssetId = $t050575097._2
157+ let $t048754915 = pool
158+ let amountAssetId = $t048754915._1
159+ let priceAssetId = $t048754915._2
165160 makeString(["votes", amountAssetId, priceAssetId], separator)
166161 }
167162
467462 then true
468463 else throw("invalid epoch length")]
469464 if ((checks == checks))
470- then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
465+ then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
471466 else throw("Strict value is not equal to itself.")
472467 }
473468
497492 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
498493 let endHeight = (startHeight + epochLength)
499494 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
500- let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
501- let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
495+ let endHeightPrevious = (startHeightPrevious + epochLength)
502496 let checkTargetEpoch = if ((epochPrevious >= 0))
503497 then true
504498 else throw("processVoteINTERNAL: invalid previous epoch")
505499 if ((checkTargetEpoch == checkTargetEpoch))
506500 then {
507501 let pool = stringToPool(poolStr)
508- let $t01754817588 = pool
509- let amountAssetId = $t01754817588._1
510- let priceAssetId = $t01754817588._2
502+ let $t01727017310 = pool
503+ let amountAssetId = $t01727017310._1
504+ let priceAssetId = $t01727017310._2
511505 let wxEmission = checkWxEmissionPoolLabel(pool)
512506 let gwxAmountAtEndTotal = {
513507 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
559553 if ((checkTargetEpoch == checkTargetEpoch))
560554 then {
561555 let pool = stringToPool(poolStr)
562- let $t01931419354 = pool
563- let amountAssetId = $t01931419354._1
564- let priceAssetId = $t01931419354._2
556+ let $t01903619076 = pool
557+ let amountAssetId = $t01903619076._1
558+ let priceAssetId = $t01903619076._2
565559 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
566560 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
567561 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
620614 else false)
621615 then {
622616 let newEpoch = (epoch + 1)
623- let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
624- let newEpochLengthActions = match newEpochLengthOption {
625- case newEpochLength: Int =>
626-[IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
627- case _: Unit =>
628- nil
629- case _ =>
630- throw("Match error")
631- }
632- $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
617+ $Tuple2([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal)], true)
633618 }
634619 else if (if (force)
635620 then (finalizationStageOrUnit == unit)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let poolWeightMult = 100000000
77
88 let maxDepthDefault = 10
99
1010 let finalizationStageTotal = 0
1111
1212 let finalizationStageShares = 1
1313
1414 let keyEpochLength = makeString(["%s", "epochLength"], separator)
15-
16-let keyEpochLengthNew = makeString(["%s%s", "epochLength__new"], separator)
17-
18-func keyEpochLengthByEpoch (epoch) = makeString(["%s%d", "epochLength", toString(epoch)], separator)
19-
2015
2116 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
2217
2318 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
2419
2520 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
2621
2722 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
2823
2924 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3025
3126 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
3227
3328 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
3429
3530 let keyNextPool = makeString(["%s", "nextPool"], separator)
3631
3732 let keyNextUser = makeString(["%s", "nextUser"], separator)
3833
3934 let keyStartHeight = makeString(["%s", "startHeight"], separator)
4035
4136 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
4237
4338 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
4439
4540 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
4641
4742 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
4843
4944
5045 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
5146
5247
5348 func keyInList (pool) = {
54- let $t016931733 = pool
55- let amountAssetId = $t016931733._1
56- let priceAssetId = $t016931733._2
49+ let $t015111551 = pool
50+ let amountAssetId = $t015111551._1
51+ let priceAssetId = $t015111551._2
5752 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
5853 }
5954
6055
6156 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
6257
6358
6459 func keyVote (pool,address,epoch) = {
65- let $t020072047 = pool
66- let amountAssetId = $t020072047._1
67- let priceAssetId = $t020072047._2
60+ let $t018251865 = pool
61+ let amountAssetId = $t018251865._1
62+ let priceAssetId = $t018251865._2
6863 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
6964 }
7065
7166
7267 func keyVotingResult (pool,epoch) = {
73- let $t022292269 = pool
74- let amountAssetId = $t022292269._1
75- let priceAssetId = $t022292269._2
68+ let $t020472087 = pool
69+ let amountAssetId = $t020472087._1
70+ let priceAssetId = $t020472087._2
7671 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7772 }
7873
7974
8075 func keyPoolShare (pool,epoch) = {
81- let $t024342474 = pool
82- let amountAssetId = $t024342474._1
83- let priceAssetId = $t024342474._2
76+ let $t022522292 = pool
77+ let amountAssetId = $t022522292._1
78+ let priceAssetId = $t022522292._2
8479 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
8580 }
8681
8782
8883 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
8984
9085
9186 func getValueOrFail (address,key,type) = {
9287 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
9388 valueOrErrorMessage( match type {
9489 case str: String =>
9590 getString(address, key)
9691 case int: Int =>
9792 getInteger(address, key)
9893 case _ =>
9994 throw("invalid entry type")
10095 }, error)
10196 }
10297
10398
10499 func getStrOrFail (address,key) = {
105100 let @ = getValueOrFail(address, key, "")
106101 if ($isInstanceOf(@, "String"))
107102 then @
108103 else throw(($getType(@) + " couldn't be cast to String"))
109104 }
110105
111106
112107 func getIntOrFail (address,key) = {
113108 let @ = getValueOrFail(address, key, 0)
114109 if ($isInstanceOf(@, "Int"))
115110 then @
116111 else throw(($getType(@) + " couldn't be cast to Int"))
117112 }
118113
119114
120115 func poolToString (pool) = ((pool._1 + separator) + pool._2)
121116
122117
123118 func stringToPool (str) = {
124119 let parts = split(str, separator)
125120 if ((size(parts) == 2))
126121 then $Tuple2(parts[0], parts[1])
127122 else throw("invalid pool string")
128123 }
129124
130125
131126 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
132127 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
133128
134129 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
135130
136131 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
137132
138133 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
139134 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
140135 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
141136 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
142137 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
143138 lpAssetId
144139 }
145140
146141
147142 func checkWxEmissionPoolLabel (pool) = {
148- let $t047164756 = pool
149- let amountAssetId = $t047164756._1
150- let priceAssetId = $t047164756._2
143+ let $t045344574 = pool
144+ let amountAssetId = $t045344574._1
145+ let priceAssetId = $t045344574._2
151146 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
152147 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
153148 if ($isInstanceOf(@, "Boolean"))
154149 then @
155150 else throw(($getType(@) + " couldn't be cast to Boolean"))
156151 }
157152
158153
159154 let poolsListName = "pools"
160155
161156 func getVotesListName (pool) = {
162- let $t050575097 = pool
163- let amountAssetId = $t050575097._1
164- let priceAssetId = $t050575097._2
157+ let $t048754915 = pool
158+ let amountAssetId = $t048754915._1
159+ let priceAssetId = $t048754915._2
165160 makeString(["votes", amountAssetId, priceAssetId], separator)
166161 }
167162
168163
169164 func keyListHead (listName) = {
170165 let meta = if ((listName == poolsListName))
171166 then "%s%s"
172167 else "%s%s%s%s"
173168 makeString([meta, listName, "head"], separator)
174169 }
175170
176171
177172 func keyListSize (listName) = {
178173 let meta = if ((listName == poolsListName))
179174 then "%s%s"
180175 else "%s%s%s%s"
181176 makeString([meta, listName, "size"], separator)
182177 }
183178
184179
185180 func keyListPrev (listName,id) = {
186181 let meta = if ((listName == poolsListName))
187182 then "%s%s%s%s"
188183 else "%s%s%s%s%s"
189184 makeString([meta, listName, id, "prev"], separator)
190185 }
191186
192187
193188 func keyListNext (listName,id) = {
194189 let meta = if ((listName == poolsListName))
195190 then "%s%s%s%s"
196191 else "%s%s%s%s%s"
197192 makeString([meta, listName, id, "next"], separator)
198193 }
199194
200195
201196 func containsNode (listName,id) = {
202197 let headOrUnit = getString(this, keyListHead(listName))
203198 let prevOrUnit = getString(this, keyListPrev(listName, id))
204199 let nextOrUnit = getString(this, keyListNext(listName, id))
205200 if (if ((id == valueOrElse(headOrUnit, "")))
206201 then true
207202 else (prevOrUnit != unit))
208203 then true
209204 else (nextOrUnit != unit)
210205 }
211206
212207
213208 func insertNodeActions (listName,id) = {
214209 let headOrUnit = getString(this, keyListHead(listName))
215210 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
216211 let checkNode = if (!(containsNode(listName, id)))
217212 then true
218213 else throw("Node exists")
219214 if ((checkNode == checkNode))
220215 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
221216 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
222217 else nil)) ++ [StringEntry(keyListHead(listName), id)])
223218 else throw("Strict value is not equal to itself.")
224219 }
225220
226221
227222 func deleteNodeActions (listName,id) = {
228223 let headOrUnit = getString(this, keyListHead(listName))
229224 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
230225 let prevOrUnit = getString(this, keyListPrev(listName, id))
231226 let nextOrUnit = getString(this, keyListNext(listName, id))
232227 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
233228 then (nextOrUnit != unit)
234229 else false)
235230 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
236231 else if ((nextOrUnit != unit))
237232 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
238233 else if ((prevOrUnit != unit))
239234 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
240235 else if ((id == valueOrElse(headOrUnit, "")))
241236 then [DeleteEntry(keyListHead(listName))]
242237 else throw(((("invalid node: " + listName) + ".") + id))))
243238 }
244239
245240
246241 func keyManagerPublicKey () = "%s__managerPublicKey"
247242
248243
249244 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
250245
251246
252247 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
253248 case s: String =>
254249 fromBase58String(s)
255250 case _: Unit =>
256251 unit
257252 case _ =>
258253 throw("Match error")
259254 }
260255
261256
262257 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
263258 case s: String =>
264259 fromBase58String(s)
265260 case _: Unit =>
266261 unit
267262 case _ =>
268263 throw("Match error")
269264 }
270265
271266
272267 let permissionDeniedError = throw("Permission denied")
273268
274269 func mustThis (i) = if ((i.caller == this))
275270 then true
276271 else permissionDeniedError
277272
278273
279274 func mustManager (i) = match managerPublicKeyOrUnit() {
280275 case pk: ByteVector =>
281276 if ((i.callerPublicKey == pk))
282277 then true
283278 else permissionDeniedError
284279 case _: Unit =>
285280 mustThis(i)
286281 case _ =>
287282 throw("Match error")
288283 }
289284
290285
291286 @Callable(i)
292287 func setManager (pendingManagerPublicKey) = {
293288 let checkCaller = mustManager(i)
294289 if ((checkCaller == checkCaller))
295290 then {
296291 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
297292 if ((checkManagerPublicKey == checkManagerPublicKey))
298293 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
299294 else throw("Strict value is not equal to itself.")
300295 }
301296 else throw("Strict value is not equal to itself.")
302297 }
303298
304299
305300
306301 @Callable(i)
307302 func confirmManager () = {
308303 let pm = pendingManagerPublicKeyOrUnit()
309304 let hasPM = if (isDefined(pm))
310305 then true
311306 else throw("No pending manager")
312307 if ((hasPM == hasPM))
313308 then {
314309 let checkPM = if ((i.callerPublicKey == value(pm)))
315310 then true
316311 else throw("You are not pending manager")
317312 if ((checkPM == checkPM))
318313 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
319314 else throw("Strict value is not equal to itself.")
320315 }
321316 else throw("Strict value is not equal to itself.")
322317 }
323318
324319
325320
326321 @Callable(i)
327322 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
328323 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
329324 $Tuple2(nil, {
330325 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
331326 if ($isInstanceOf(@, "Int"))
332327 then @
333328 else throw(($getType(@) + " couldn't be cast to Int"))
334329 })
335330 }
336331
337332
338333
339334 @Callable(i)
340335 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
341336 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
342337 then true
343338 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
344339 then true
345340 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
346341 then true
347342 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
348343 then true
349344 else "invalid staking contract address", if ((epochLength > 0))
350345 then true
351346 else throw("invalid epoch length")]
352347 if ((checks == checks))
353348 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
354349 else throw("Strict value is not equal to itself.")
355350 }
356351
357352
358353
359354 @Callable(i)
360355 func create (amountAssetId,priceAssetId) = {
361356 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
362357 then true
363358 else mustManager(i)]
364359 if ((checks == checks))
365360 then {
366361 let pool = $Tuple2(amountAssetId, priceAssetId)
367362 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
368363 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
369364 let startHeightActions = if (currentEpochIsNotDefined)
370365 then {
371366 let epoch = 0
372367 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
373368 }
374369 else nil
375370 $Tuple2((inListActions ++ startHeightActions), unit)
376371 }
377372 else throw("Strict value is not equal to itself.")
378373 }
379374
380375
381376
382377 @Callable(i)
383378 func vote (amountAssetId,priceAssetId,amount) = {
384379 let pool = $Tuple2(amountAssetId, priceAssetId)
385380 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
386381 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
387382 let epochLength = getIntOrFail(this, keyEpochLength)
388383 let endHeight = (startHeight + epochLength)
389384 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
390385 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
391386 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
392387 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
393388 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
394389 let gwxAmountAtEndTotal = {
395390 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
396391 if ($isInstanceOf(@, "Int"))
397392 then @
398393 else throw(($getType(@) + " couldn't be cast to Int"))
399394 }
400395 let available = (gwxAmountAtEndTotal - used)
401396 let newVote = (vote + amount)
402397 let wxEmission = checkWxEmissionPoolLabel(pool)
403398 let checks = [if ((getBoolean(keyInList(pool)) != unit))
404399 then true
405400 else throw("invalid assets"), if ((endHeight > height))
406401 then true
407402 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
408403 then true
409404 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
410405 then true
411406 else throw("you do not have gWX"), if (if ((amount > 0))
412407 then (available >= amount)
413408 else false)
414409 then true
415410 else throw("invalid amount"), if (wxEmission)
416411 then true
417412 else throw("pool hasn't WX_EMISSION label")]
418413 if ((checks == checks))
419414 then {
420415 let votesListName = getVotesListName(pool)
421416 let userAddressStr = toString(i.caller)
422417 let votesListActions = if (containsNode(votesListName, userAddressStr))
423418 then nil
424419 else insertNodeActions(votesListName, userAddressStr)
425420 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), (used + amount)), IntegerEntry(keyVote(pool, i.caller, epoch), newVote), IntegerEntry(keyVotingResult(pool, epoch), (poolResult + amount)), IntegerEntry(keyTotalVotes(epoch), (totalVotes + amount))] ++ votesListActions), unit)
426421 }
427422 else throw("Strict value is not equal to itself.")
428423 }
429424
430425
431426
432427 @Callable(i)
433428 func cancelVote (amountAssetId,priceAssetId) = {
434429 let pool = $Tuple2(amountAssetId, priceAssetId)
435430 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
436431 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
437432 let epochLength = getIntOrFail(this, keyEpochLength)
438433 let endHeight = (startHeight + epochLength)
439434 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
440435 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
441436 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
442437 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
443438 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
444439 let checks = [if ((getBoolean(keyInList(pool)) != unit))
445440 then true
446441 else throw("invalid assets"), if ((endHeight > height))
447442 then true
448443 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
449444 then true
450445 else throw("finalization in progress"), if ((vote > 0))
451446 then true
452447 else throw("no vote")]
453448 if ((checks == checks))
454449 then {
455450 let votesListName = getVotesListName(pool)
456451 let userAddressStr = toString(i.caller)
457452 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), max([(used - vote), 0])), DeleteEntry(keyVote(pool, i.caller, epoch)), IntegerEntry(keyVotingResult(pool, epoch), (poolResult - vote)), IntegerEntry(keyTotalVotes(epoch), (totalVotes - vote))] ++ deleteNodeActions(votesListName, userAddressStr)), unit)
458453 }
459454 else throw("Strict value is not equal to itself.")
460455 }
461456
462457
463458
464459 @Callable(i)
465460 func setEpochLength (newEpochLength) = {
466461 let checks = [mustManager(i), if ((newEpochLength > 0))
467462 then true
468463 else throw("invalid epoch length")]
469464 if ((checks == checks))
470- then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
465+ then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
471466 else throw("Strict value is not equal to itself.")
472467 }
473468
474469
475470
476471 @Callable(i)
477472 func setMaxDepth (newMaxDepth) = {
478473 let checks = [mustManager(i), if ((newMaxDepth > 0))
479474 then true
480475 else throw("invalid max depth")]
481476 if ((checks == checks))
482477 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
483478 else throw("Strict value is not equal to itself.")
484479 }
485480
486481
487482
488483 @Callable(i)
489484 func processVoteINTERNAL (poolStr,userAddressStr) = {
490485 let checkCaller = mustThis(i)
491486 if ((checkCaller == checkCaller))
492487 then {
493488 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
494489 let epoch = getIntOrFail(this, keyCurrentEpoch)
495490 let epochPrevious = (epoch - 1)
496491 let epochLength = getIntOrFail(this, keyEpochLength)
497492 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
498493 let endHeight = (startHeight + epochLength)
499494 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
500- let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
501- let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
495+ let endHeightPrevious = (startHeightPrevious + epochLength)
502496 let checkTargetEpoch = if ((epochPrevious >= 0))
503497 then true
504498 else throw("processVoteINTERNAL: invalid previous epoch")
505499 if ((checkTargetEpoch == checkTargetEpoch))
506500 then {
507501 let pool = stringToPool(poolStr)
508- let $t01754817588 = pool
509- let amountAssetId = $t01754817588._1
510- let priceAssetId = $t01754817588._2
502+ let $t01727017310 = pool
503+ let amountAssetId = $t01727017310._1
504+ let priceAssetId = $t01727017310._2
511505 let wxEmission = checkWxEmissionPoolLabel(pool)
512506 let gwxAmountAtEndTotal = {
513507 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
514508 if ($isInstanceOf(@, "Int"))
515509 then @
516510 else throw(($getType(@) + " couldn't be cast to Int"))
517511 }
518512 let gwxAmountAtEndTotalPrevious = {
519513 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
520514 if ($isInstanceOf(@, "Int"))
521515 then @
522516 else throw(($getType(@) + " couldn't be cast to Int"))
523517 }
524518 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
525519 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
526520 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
527521 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
528522 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
529523 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
530524 else 0
531525 let actions = if (if ((newVote > 0))
532526 then wxEmission
533527 else false)
534528 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
535529 else deleteNodeActions(getVotesListName(pool), userAddressStr)
536530 $Tuple2(actions, unit)
537531 }
538532 else throw("Strict value is not equal to itself.")
539533 }
540534 else throw("Strict value is not equal to itself.")
541535 }
542536
543537
544538
545539 @Callable(i)
546540 func processPoolINTERNAL (poolStr,force) = {
547541 let checkCaller = mustThis(i)
548542 if ((checkCaller == checkCaller))
549543 then {
550544 let targetEpoch = {
551545 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
552546 if (force)
553547 then currentEpoch
554548 else (currentEpoch - 1)
555549 }
556550 let checkTargetEpoch = if ((targetEpoch >= 0))
557551 then true
558552 else throw("processPoolINTERNAL: invalid target epoch")
559553 if ((checkTargetEpoch == checkTargetEpoch))
560554 then {
561555 let pool = stringToPool(poolStr)
562- let $t01931419354 = pool
563- let amountAssetId = $t01931419354._1
564- let priceAssetId = $t01931419354._2
556+ let $t01903619076 = pool
557+ let amountAssetId = $t01903619076._1
558+ let priceAssetId = $t01903619076._2
565559 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
566560 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
567561 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
568562 let r = {
569563 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
570564 if ($isInstanceOf(@, "Boolean"))
571565 then @
572566 else throw(($getType(@) + " couldn't be cast to Boolean"))
573567 }
574568 if ((r == r))
575569 then if (r)
576570 then $Tuple2(nil, true)
577571 else {
578572 let wxEmission = checkWxEmissionPoolLabel(pool)
579573 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
580574 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
581575 let share = if (if ((totalVotes == 0))
582576 then true
583577 else !(wxEmission))
584578 then 0
585579 else fraction(votingResult, poolWeightMult, totalVotes)
586580 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
587581 if ((modifyWeightInv == modifyWeightInv))
588582 then {
589583 let poolsListActions = if (if (wxEmission)
590584 then true
591585 else force)
592586 then nil
593587 else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
594588 $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
595589 }
596590 else throw("Strict value is not equal to itself.")
597591 }
598592 else throw("Strict value is not equal to itself.")
599593 }
600594 else throw("Strict value is not equal to itself.")
601595 }
602596 else throw("Strict value is not equal to itself.")
603597 }
604598
605599
606600
607601 @Callable(i)
608602 func finalizeHelper () = {
609603 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
610604 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
611605 let previousEpoch = (epoch - 1)
612606 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
613607 let epochLength = getIntOrFail(this, keyEpochLength)
614608 let endHeight = (startHeight + epochLength)
615609 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
616610 if (if (if ((height >= endHeight))
617611 then (finalizationStageOrUnit == unit)
618612 else false)
619613 then !(force)
620614 else false)
621615 then {
622616 let newEpoch = (epoch + 1)
623- let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
624- let newEpochLengthActions = match newEpochLengthOption {
625- case newEpochLength: Int =>
626-[IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
627- case _: Unit =>
628- nil
629- case _ =>
630- throw("Match error")
631- }
632- $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
617+ $Tuple2([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal)], true)
633618 }
634619 else if (if (force)
635620 then (finalizationStageOrUnit == unit)
636621 else false)
637622 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
638623 else if ((finalizationStageOrUnit == unit))
639624 then $Tuple2(nil, false)
640625 else if ((finalizationStageOrUnit == finalizationStageTotal))
641626 then {
642627 let poolOrUnit = getString(keyNextPool)
643628 let userOrUnit = getString(keyNextUser)
644629 match poolOrUnit {
645630 case _: Unit =>
646631 match getString(keyListHead(poolsListName)) {
647632 case _: Unit =>
648633 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
649634 case poolsHeadStr: String =>
650635 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
651636 case _ =>
652637 throw("Match error")
653638 }
654639 case poolStr: String =>
655640 let pool = stringToPool(poolStr)
656641 let nextUserOrUnit = match userOrUnit {
657642 case _: Unit =>
658643 getString(keyListHead(getVotesListName(pool)))
659644 case user: String =>
660645 let next = getString(keyListNext(getVotesListName(pool), user))
661646 if ((next == next))
662647 then {
663648 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
664649 if ((processVoteInv == processVoteInv))
665650 then next
666651 else throw("Strict value is not equal to itself.")
667652 }
668653 else throw("Strict value is not equal to itself.")
669654 case _ =>
670655 throw("Match error")
671656 }
672657 match nextUserOrUnit {
673658 case _: Unit =>
674659 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
675660 match nextPoolOrUnit {
676661 case _: Unit =>
677662 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
678663 case s: String =>
679664 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
680665 case _ =>
681666 throw("Match error")
682667 }
683668 case nextUser: String =>
684669 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
685670 case _ =>
686671 throw("Match error")
687672 }
688673 case _ =>
689674 throw("Match error")
690675 }
691676 }
692677 else if ((finalizationStageOrUnit == finalizationStageShares))
693678 then {
694679 let poolOrUnit = getString(keyNextPool)
695680 match poolOrUnit {
696681 case _: Unit =>
697682 match getString(keyListHead(poolsListName)) {
698683 case _: Unit =>
699684 let actions = if (force)
700685 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
701686 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
702687 $Tuple2(actions, true)
703688 case nextPoolStr: String =>
704689 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
705690 case _ =>
706691 throw("Match error")
707692 }
708693 case poolStr: String =>
709694 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
710695 if ((nextPoolOrUnit == nextPoolOrUnit))
711696 then {
712697 let r = {
713698 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
714699 if ($isInstanceOf(@, "Boolean"))
715700 then @
716701 else throw(($getType(@) + " couldn't be cast to Boolean"))
717702 }
718703 if ((r == r))
719704 then if (r)
720705 then $Tuple2(nil, true)
721706 else match nextPoolOrUnit {
722707 case _: Unit =>
723708 let actions = if (force)
724709 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
725710 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
726711 $Tuple2(actions, true)
727712 case nextPoolStr: String =>
728713 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
729714 case _ =>
730715 throw("Match error")
731716 }
732717 else throw("Strict value is not equal to itself.")
733718 }
734719 else throw("Strict value is not equal to itself.")
735720 case _ =>
736721 throw("Match error")
737722 }
738723 }
739724 else throw("finalization is broken")
740725 }
741726
742727
743728
744729 @Callable(i)
745730 func finalizeWrapper (counter) = {
746731 let result = {
747732 let @ = invoke(this, "finalizeHelper", nil, nil)
748733 if ($isInstanceOf(@, "Boolean"))
749734 then @
750735 else throw(($getType(@) + " couldn't be cast to Boolean"))
751736 }
752737 if ((result == result))
753738 then if (!(result))
754739 then if ((counter == 0))
755740 then throw("Current voting is not over yet")
756741 else $Tuple2(nil, unit)
757742 else {
758743 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
759744 if ((maxDepth > counter))
760745 then {
761746 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
762747 if ((inv == inv))
763748 then $Tuple2(nil, unit)
764749 else throw("Strict value is not equal to itself.")
765750 }
766751 else $Tuple2(nil, unit)
767752 }
768753 else throw("Strict value is not equal to itself.")
769754 }
770755
771756
772757
773758 @Callable(i)
774759 func finalize () = {
775760 let inv = invoke(this, "finalizeWrapper", [0], nil)
776761 if ((inv == inv))
777762 then $Tuple2(nil, unit)
778763 else throw("Strict value is not equal to itself.")
779764 }
780765
781766
782767
783768 @Callable(i)
784769 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
785770
786771
787772
788773 @Callable(i)
789774 func insertNode (listName,id) = {
790775 let checkCaller = mustManager(i)
791776 if ((checkCaller == checkCaller))
792777 then $Tuple2(insertNodeActions(listName, id), unit)
793778 else throw("Strict value is not equal to itself.")
794779 }
795780
796781
797782
798783 @Callable(i)
799784 func deleteNode (listName,id) = {
800785 let checkCaller = mustManager(i)
801786 if ((checkCaller == checkCaller))
802787 then $Tuple2(deleteNodeActions(listName, id), unit)
803788 else throw("Strict value is not equal to itself.")
804789 }
805790
806791
807792 @Verifier(tx)
808793 func verify () = {
809794 let targetPublicKey = match managerPublicKeyOrUnit() {
810795 case pk: ByteVector =>
811796 pk
812797 case _: Unit =>
813798 tx.senderPublicKey
814799 case _ =>
815800 throw("Match error")
816801 }
817802 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
818803 }
819804

github/deemru/w8io/fabc49c 
75.28 ms