tx · A4Y8NgoKZAi6bn8LtwQQ2u2MaLzM4gE5GEyU9V4s5CAm

3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA:  -0.02200000 Waves

2023.03.14 10:11 [2489390] smart account 3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA > SELF 0.00000000 Waves

{ "type": 13, "id": "A4Y8NgoKZAi6bn8LtwQQ2u2MaLzM4gE5GEyU9V4s5CAm", "fee": 2200000, "feeAssetId": null, "timestamp": 1678777905356, "version": 2, "chainId": 84, "sender": "3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA", "senderPublicKey": "D46gQxzmdzdCTYRg6dMcwFoUrc6ZmxF6GKd5ZoTkvzp1", "proofs": [ "5LruKQ1oTQs8b3wF34XjuCdF3tJsbX7en2F5GPj7yPyjou14autn4oiQ9W47LBHPYSuYBZsaZRo2Q3QGuBvoQiYZ" ], "script": "base64:BgKxFAgCEgMKAQgSABIECgIIARIHCgUICAgIARIECgIICBIFCgMICAESBAoCCAgSAwoBARIDCgEBEgQKAggIEgQKAggEEgASAwoBARIAEgQKAggIEgQKAggIEgQKAggIIglzZXBhcmF0b3IiDnBvb2xXZWlnaHRNdWx0Ig9tYXhEZXB0aERlZmF1bHQiFmZpbmFsaXphdGlvblN0YWdlVG90YWwiF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzIg5rZXlFcG9jaExlbmd0aCIRa2V5RXBvY2hMZW5ndGhOZXciFWtleUVwb2NoTGVuZ3RoQnlFcG9jaCIFZXBvY2giD2tleUN1cnJlbnRFcG9jaCILa2V5TWF4RGVwdGgiImtleVZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiEmtleUZhY3RvcnlDb250cmFjdCITa2V5Qm9vc3RpbmdDb250cmFjdCISa2V5U3Rha2luZ0NvbnRyYWN0IhRrZXlGaW5hbGl6YXRpb25TdGFnZSILa2V5TmV4dFBvb2wiC2tleU5leHRVc2VyIg5rZXlTdGFydEhlaWdodCIRa2V5Q3VycmVudEVwb2NoVWkiEGtleVN0YXJ0SGVpZ2h0VWkiHWtleUZpbmFsaXphdGlvblNob3VsZEJlRm9yY2VkIhVrZXlTdGFydEhlaWdodEJ5RXBvY2giDGtleUZpbmFsaXplZCIJa2V5SW5MaXN0IgRwb29sIgskdDAxNjkzMTczMyINYW1vdW50QXNzZXRJZCIMcHJpY2VBc3NldElkIgdrZXlVc2VkIgdhZGRyZXNzIgdrZXlWb3RlIgskdDAyMDA3MjA0NyIPa2V5Vm90aW5nUmVzdWx0IgskdDAyMjI5MjI2OSIMa2V5UG9vbFNoYXJlIgskdDAyNDM0MjQ3NCINa2V5VG90YWxWb3RlcyIOZ2V0VmFsdWVPckZhaWwiA2tleSIEdHlwZSIFZXJyb3IiByRtYXRjaDAiA3N0ciIDaW50IgxnZXRTdHJPckZhaWwiAUAiDGdldEludE9yRmFpbCIMcG9vbFRvU3RyaW5nIgxzdHJpbmdUb1Bvb2wiBXBhcnRzIhZnZXRMcEFzc2V0QnlQb29sQXNzZXRzIh9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkIgxiYXNlQXNzZXRTdHIiKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzIhhpbnRlcm5hbEFtb3VudEFzc2V0SWRTdHIiF2ludGVybmFsUHJpY2VBc3NldElkU3RyIh9rZXlNYXBwaW5nUG9vbENvbnRyYWN0VG9MUEFzc2V0IhNwb29sQ29udHJhY3RBZGRyZXNzIg9mYWN0b3J5Q29udHJhY3QiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiCWxwQXNzZXRJZCIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsIgskdDA0NzE2NDc1NiINcG9vbHNMaXN0TmFtZSIQZ2V0Vm90ZXNMaXN0TmFtZSILJHQwNTA1NzUwOTciC2tleUxpc3RIZWFkIghsaXN0TmFtZSIEbWV0YSILa2V5TGlzdFNpemUiC2tleUxpc3RQcmV2IgJpZCILa2V5TGlzdE5leHQiDGNvbnRhaW5zTm9kZSIKaGVhZE9yVW5pdCIKcHJldk9yVW5pdCIKbmV4dE9yVW5pdCIRaW5zZXJ0Tm9kZUFjdGlvbnMiCGxpc3RTaXplIgljaGVja05vZGUiEWRlbGV0ZU5vZGVBY3Rpb25zIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCIBcyIdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQiFXBlcm1pc3Npb25EZW5pZWRFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiC2NoZWNrQ2FsbGVyIhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSILdXNlckFkZHJlc3MiDHRhcmdldEhlaWdodCIXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MiH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiD3N0YWtpbmdDb250cmFjdCILZXBvY2hMZW5ndGgiBmNoZWNrcyINaW5MaXN0QWN0aW9ucyIYY3VycmVudEVwb2NoSXNOb3REZWZpbmVkIhJzdGFydEhlaWdodEFjdGlvbnMiBmFtb3VudCILc3RhcnRIZWlnaHQiCWVuZEhlaWdodCIXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQiBHVzZWQiBHZvdGUiCnBvb2xSZXN1bHQiCnRvdGFsVm90ZXMiE2d3eEFtb3VudEF0RW5kVG90YWwiCWF2YWlsYWJsZSIHbmV3Vm90ZSIKd3hFbWlzc2lvbiINdm90ZXNMaXN0TmFtZSIOdXNlckFkZHJlc3NTdHIiEHZvdGVzTGlzdEFjdGlvbnMiDm5ld0Vwb2NoTGVuZ3RoIgtuZXdNYXhEZXB0aCIHcG9vbFN0ciINZXBvY2hQcmV2aW91cyITc3RhcnRIZWlnaHRQcmV2aW91cyITZXBvY2hMZW5ndGhQcmV2aW91cyIRZW5kSGVpZ2h0UHJldmlvdXMiEGNoZWNrVGFyZ2V0RXBvY2giDSR0MDE3NTQ4MTc1ODgiG2d3eEFtb3VudEF0RW5kVG90YWxQcmV2aW91cyIMdm90aW5nUmVzdWx0Igx2b3RlUHJldmlvdXMiB2FjdGlvbnMiBWZvcmNlIgt0YXJnZXRFcG9jaCIMY3VycmVudEVwb2NoIg0kdDAxOTMxNDE5MzU0IgFyIgVzaGFyZSIPbW9kaWZ5V2VpZ2h0SW52IhBwb29sc0xpc3RBY3Rpb25zIg1wcmV2aW91c0Vwb2NoIghuZXdFcG9jaCIUbmV3RXBvY2hMZW5ndGhPcHRpb24iFW5ld0Vwb2NoTGVuZ3RoQWN0aW9ucyIKcG9vbE9yVW5pdCIKdXNlck9yVW5pdCIHJG1hdGNoMSIMcG9vbHNIZWFkU3RyIg5uZXh0VXNlck9yVW5pdCIEdXNlciIEbmV4dCIOcHJvY2Vzc1ZvdGVJbnYiDm5leHRQb29sT3JVbml0IgckbWF0Y2gyIghuZXh0VXNlciILbmV4dFBvb2xTdHIiB2NvdW50ZXIiBnJlc3VsdCIIbWF4RGVwdGgiA2ludiICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5NAABYQICX18AAWIAgMLXLwABYwAKAAFkAAAAAWUAAQABZgkAuQkCCQDMCAICAiVzCQDMCAICC2Vwb2NoTGVuZ3RoBQNuaWwFAWEAAWcJALkJAgkAzAgCAgQlcyVzCQDMCAICEGVwb2NoTGVuZ3RoX19uZXcFA25pbAUBYQEBaAEBaQkAuQkCCQDMCAICBCVzJWQJAMwIAgILZXBvY2hMZW5ndGgJAMwIAgkApAMBBQFpBQNuaWwFAWEAAWoJALkJAgkAzAgCAgIlcwkAzAgCAgxjdXJyZW50RXBvY2gFA25pbAUBYQABawkAuQkCCQDMCAICAiVzCQDMCAICCG1heERlcHRoBQNuaWwFAWEAAWwJALkJAgkAzAgCAgIlcwkAzAgCAh92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQNuaWwFAWEAAW0JALkJAgkAzAgCAgIlcwkAzAgCAg9mYWN0b3J5Q29udHJhY3QFA25pbAUBYQABbgkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUBYQABbwkAuQkCCQDMCAICAiVzCQDMCAICD3N0YWtpbmdDb250cmFjdAUDbmlsBQFhAAFwCQC5CQIJAMwIAgICJXMJAMwIAgIRZmluYWxpemF0aW9uU3RhZ2UFA25pbAUBYQABcQkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRQb29sBQNuaWwFAWEAAXIJALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0VXNlcgUDbmlsBQFhAAFzCQC5CQIJAMwIAgICJXMJAMwIAgILc3RhcnRIZWlnaHQFA25pbAUBYQABdAkAuQkCCQDMCAICAiVzCQDMCAICDmN1cnJlbnRFcG9jaFVpBQNuaWwFAWEAAXUJALkJAgkAzAgCAgIlcwkAzAgCAg1zdGFydEhlaWdodFVpBQNuaWwFAWEAAXYJALkJAgkAzAgCAgIlcwkAzAgCAgVmb3JjZQUDbmlsBQFhAQF3AQFpCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFAWkFA25pbAUBYQEBeAEBaQkAuQkCCQDMCAICBCVzJWQJAMwIAgIJZmluYWxpemVkCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQF5AQF6BAFBBQF6BAFCCAUBQQJfMQQBQwgFAUECXzIJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGaW5MaXN0CQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFhAQFEAgFFAWkJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIEdXNlZAkAzAgCCQClCAEFAUUJAMwIAgkApAMBBQFpBQNuaWwFAWEBAUYDAXoBRQFpBAFHBQF6BAFCCAUBRwJfMQQBQwgFAUcCXzIJALkJAgkAzAgCAgolcyVzJXMlcyVkCQDMCAICBHZvdGUJAMwIAgUBQgkAzAgCBQFDCQDMCAIJAKUIAQUBRQkAzAgCCQCkAwEFAWkFA25pbAUBYQEBSAIBegFpBAFJBQF6BAFCCAUBSQJfMQQBQwgFAUkCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAgx2b3RpbmdSZXN1bHQJAMwIAgUBQgkAzAgCBQFDCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFKAgF6AWkEAUsFAXoEAUIIBQFLAl8xBAFDCAUBSwJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICCXBvb2xTaGFyZQkAzAgCBQFCCQDMCAIFAUMJAMwIAgkApAMBBQFpBQNuaWwFAWEBAUwBAWkJALkJAgkAzAgCAgQlcyVkCQDMCAICCnRvdGFsVm90ZXMJAMwIAgkApAMBBQFpBQNuaWwFAWEBAU0DAUUBTgFPBAFQCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAUUJAMwIAgIBLgkAzAgCBQFOCQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgQBUQUBTwMJAAECBQFRAgZTdHJpbmcEAVIFAVEJAJ0IAgUBRQUBTgMJAAECBQFRAgNJbnQEAVMFAVEJAJoIAgUBRQUBTgkAAgECEmludmFsaWQgZW50cnkgdHlwZQUBUAEBVAIBRQFOCgABVQkBAU0DBQFFBQFOAgADCQABAgUBVQIGU3RyaW5nBQFVCQACAQkArAICCQADAQUBVQIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAQFWAgFFAU4KAAFVCQEBTQMFAUUFAU4AAAMJAAECBQFVAgNJbnQFAVUJAAIBCQCsAgIJAAMBBQFVAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBAVcBAXoJAKwCAgkArAICCAUBegJfMQUBYQgFAXoCXzIBAVgBAVIEAVkJALUJAgUBUgUBYQMJAAACCQCQAwEFAVkAAgkAlAoCCQCRAwIFAVkAAAkAkQMCBQFZAAEJAAIBAhNpbnZhbGlkIHBvb2wgc3RyaW5nAQFaAgFCAUMKAQJhYQECYWIJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWIKAQJhYwICYWQCYWUJAKwCAgkArAICCQCsAgIJAKwCAgIKJWQlZCVzJXNfXwkApAMBBQJhZAICX18JAKQDAQUCYWUCI19fbWFwcGluZ3NfX3Bvb2xBc3NldHMyUG9vbENvbnRyYWN0CgECYWYBAmFnCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFnAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAQCYWgJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFUAgUEdGhpcwUBbQQCYWkJAQFWAgUCYWgJAQJhYQEFAUIEAmFqCQEBVgIFAmFoCQECYWEBBQFDBAJhZwkBAVQCBQJhaAkBAmFjAgUCYWkFAmFqBAJhawkBAVQCBQJhaAkBAmFmAQUCYWcFAmFrAQJhbAEBegQCYW0FAXoEAUIIBQJhbQJfMQQBQwgFAmFtAl8yBAJhaAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAVQCBQR0aGlzBQFtCgABVQkA/AcEBQJhaAIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQNuaWwDCQABAgUBVQIHQm9vbGVhbgUBVQkAAgEJAKwCAgkAAwEFAVUCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4AAmFuAgVwb29scwECYW8BAXoEAmFwBQF6BAFCCAUCYXACXzEEAUMIBQJhcAJfMgkAuQkCCQDMCAICBXZvdGVzCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFhAQJhcQECYXIEAmFzAwkAAAIFAmFyBQJhbgIEJXMlcwIIJXMlcyVzJXMJALkJAgkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCAgRoZWFkBQNuaWwFAWEBAmF0AQJhcgQCYXMDCQAAAgUCYXIFAmFuAgQlcyVzAgglcyVzJXMlcwkAuQkCCQDMCAIFAmFzCQDMCAIFAmFyCQDMCAICBHNpemUFA25pbAUBYQECYXUCAmFyAmF2BAJhcwMJAAACBQJhcgUCYW4CCCVzJXMlcyVzAgolcyVzJXMlcyVzCQC5CQIJAMwIAgUCYXMJAMwIAgUCYXIJAMwIAgUCYXYJAMwIAgIEcHJldgUDbmlsBQFhAQJhdwICYXICYXYEAmFzAwkAAAIFAmFyBQJhbgIIJXMlcyVzJXMCCiVzJXMlcyVzJXMJALkJAgkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCBQJhdgkAzAgCAgRuZXh0BQNuaWwFAWEBAmF4AgJhcgJhdgQCYXkJAJ0IAgUEdGhpcwkBAmFxAQUCYXIEAmF6CQCdCAIFBHRoaXMJAQJhdQIFAmFyBQJhdgQCYUEJAJ0IAgUEdGhpcwkBAmF3AgUCYXIFAmF2AwMJAAACBQJhdgkBC3ZhbHVlT3JFbHNlAgUCYXkCAAYJAQIhPQIFAmF6BQR1bml0BgkBAiE9AgUCYUEFBHVuaXQBAmFCAgJhcgJhdgQCYXkJAJ0IAgUEdGhpcwkBAmFxAQUCYXIEAmFDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJhdAEFAmFyAAAEAmFEAwkBASEBCQECYXgCBQJhcgUCYXYGCQACAQILTm9kZSBleGlzdHMDCQAAAgUCYUQFAmFECQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF0AQUCYXIJAGQCBQJhQwABBQNuaWwDCQECIT0CBQJheQUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXcCBQJhcgUCYXYJAQV2YWx1ZQEFAmF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdQIFAmFyCQEFdmFsdWUBBQJheQUCYXYFA25pbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcQEFAmFyBQJhdgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJhRQICYXICYXYEAmF5CQCdCAIFBHRoaXMJAQJhcQEFAmFyBAJhQwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYXQBBQJhcgAABAJhegkAnQgCBQR0aGlzCQECYXUCBQJhcgUCYXYEAmFBCQCdCAIFBHRoaXMJAQJhdwIFAmFyBQJhdgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQBBQJhcgkAZQIFAmFDAAEFA25pbAMDCQECIT0CBQJhegUEdW5pdAkBAiE9AgUCYUEFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdwIFAmFyCQEFdmFsdWUBBQJhegkBBXZhbHVlAQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AgUCYXIJAQV2YWx1ZQEFAmFBCQEFdmFsdWUBBQJhegkAzAgCCQELRGVsZXRlRW50cnkBCQECYXUCBQJhcgUCYXYJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF3AgUCYXIFAmF2BQNuaWwDCQECIT0CBQJhQQUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXEBBQJhcgkBBXZhbHVlAQUCYUEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF3AgUCYXIFAmF2CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAmFyCQEFdmFsdWUBBQJhQQUDbmlsAwkBAiE9AgUCYXoFBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF1AgUCYXIFAmF2CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdwIFAmFyCQEFdmFsdWUBBQJhegUDbmlsAwkAAAIFAmF2CQELdmFsdWVPckVsc2UCBQJheQIACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcQEFAmFyBQNuaWwJAAIBCQCsAgIJAKwCAgkArAICAg5pbnZhbGlkIG5vZGU6IAUCYXICAS4FAmF2AQJhRgACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJhRwACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQECYUgABAFRCQCiCAEJAQJhRgADCQABAgUBUQIGU3RyaW5nBAJhSQUBUQkA2QQBBQJhSQMJAAECBQFRAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFKAAQBUQkAoggBCQECYUcAAwkAAQIFAVECBlN0cmluZwQCYUkFAVEJANkEAQUCYUkDCQABAgUBUQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJhSwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJhTAECYU0DCQAAAggFAmFNBmNhbGxlcgUEdGhpcwYFAmFLAQJhTgECYU0EAVEJAQJhSAADCQABAgUBUQIKQnl0ZVZlY3RvcgQCYU8FAVEDCQAAAggFAmFND2NhbGxlclB1YmxpY0tleQUCYU8GBQJhSwMJAAECBQFRAgRVbml0CQECYUwBBQJhTQkAAgECC01hdGNoIGVycm9yEQJhTQEKc2V0TWFuYWdlcgECYVAEAmFRCQECYU4BBQJhTQMJAAACBQJhUQUCYVEEAmFSCQDZBAEFAmFQAwkAAAIFAmFSBQJhUgkAzAgCCQELU3RyaW5nRW50cnkCCQECYUcABQJhUAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQ5jb25maXJtTWFuYWdlcgAEAmFTCQECYUoABAJhVAMJAQlpc0RlZmluZWQBBQJhUwYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCYVQFAmFUBAJhVQMJAAACCAUCYU0PY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJhUwYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCYVUFAmFVCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhRgAJANgEAQkBBXZhbHVlAQUCYVMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFHAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNARhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQCAmFWAmFXBAJhWAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQFUAgUEdGhpcwUBbgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQCUCgIFA25pbAoAAVUJAPwHBAUCYVgCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFAmFWCQDMCAIFAmFXBQNuaWwFA25pbAMJAAECBQFVAgNJbnQFAVUJAAIBCQCsAgIJAAMBBQFVAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQCYU0BC2NvbnN0cnVjdG9yBQJhaAJhWQJhWgJiYQJiYgQCYmMJAMwIAgkBAmFOAQUCYU0JAMwIAgMJAQIhPQIJAKYIAQUCYWgFBHVuaXQGAiBpbnZhbGlkIGZhY3RvcnkgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJhWQUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmFaBQR1bml0BgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJhBQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQJiYgAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUCYmMFAmJjCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbQUCYWgJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbAUCYVkJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbgUCYVoJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbwUCYmEJAMwIAgkBDEludGVnZXJFbnRyeQIFAWYFAmJiBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BBmNyZWF0ZQIBQgFDBAJiYwkAzAgCAwkAAAIJANgEAQgIBQJhTQZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBbAIABgkBAmFOAQUCYU0FA25pbAMJAAACBQJiYwUCYmMEAXoJAJQKAgUBQgUBQwQCYmQJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAXkBBQF6BgUDbmlsCQECYUICBQJhbgkBAVcBBQF6BAJiZQkAAAIJAJoIAgUEdGhpcwUBagUEdW5pdAQCYmYDBQJiZQQBaQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFqBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdwEFAWkFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcwUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQZoZWlnaHQFA25pbAUDbmlsCQCUCgIJAM4IAgUCYmQFAmJmBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQR2b3RlAwFCAUMCYmcEAXoJAJQKAgUBQgUBQwQBaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFqAAAEAmJoCQEBVgIFBHRoaXMJAQF3AQUBaQQCYmIJAQFWAgUEdGhpcwUBZgQCYmkJAGQCBQJiaAUCYmIEAmJqCQCaCAIFBHRoaXMFAXAEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFEAggFAmFNBmNhbGxlcgUBaQAABAJibAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRgMFAXoIBQJhTQZjYWxsZXIFAWkAAAQCYm0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUgCBQF6BQFpAAAEAmJuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFMAQUBaQAABAJibwoAAVUJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIJANgEAQgIBQJhTQZjYWxsZXIFYnl0ZXMJAMwIAgUCYmkFA25pbAUDbmlsAwkAAQIFAVUCA0ludAUBVQkAAgEJAKwCAgkAAwEFAVUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYnAJAGUCBQJibwUCYmsEAmJxCQBkAgUCYmwFAmJnBAJicgkBAmFsAQUBegQCYmMJAMwIAgMJAQIhPQIJAKAIAQkBAXkBBQF6BQR1bml0BgkAAgECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYmkFBmhlaWdodAYJAAIBAg5pbnZhbGlkIGhlaWdodAkAzAgCAwkAAAIFAmJqBQR1bml0BgkAAgECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFAmJvAAAGCQACAQITeW91IGRvIG5vdCBoYXZlIGdXWAkAzAgCAwMJAGYCBQJiZwAACQBnAgUCYnAFAmJnBwYJAAIBAg5pbnZhbGlkIGFtb3VudAkAzAgCAwUCYnIGCQACAQIdcG9vbCBoYXNuJ3QgV1hfRU1JU1NJT04gbGFiZWwFA25pbAMJAAACBQJiYwUCYmMEAmJzCQECYW8BBQF6BAJidAkApQgBCAUCYU0GY2FsbGVyBAJidQMJAQJheAIFAmJzBQJidAUDbmlsCQECYUICBQJicwUCYnQJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRAIIBQJhTQZjYWxsZXIFAWkJAGQCBQJiawUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFGAwUBeggFAmFNBmNhbGxlcgUBaQUCYnEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFIAgUBegUBaQkAZAIFAmJtBQJiZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUwBBQFpCQBkAgUCYm4FAmJnBQNuaWwFAmJ1BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQpjYW5jZWxWb3RlAgFCAUMEAXoJAJQKAgUBQgUBQwQBaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFqAAAEAmJoCQEBVgIFBHRoaXMJAQF3AQUBaQQCYmIJAQFWAgUEdGhpcwUBZgQCYmkJAGQCBQJiaAUCYmIEAmJqCQCaCAIFBHRoaXMFAXAEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFEAggFAmFNBmNhbGxlcgUBaQAABAJibAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRgMFAXoIBQJhTQZjYWxsZXIFAWkAAAQCYm0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUgCBQF6BQFpAAAEAmJuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFMAQUBaQAABAJiYwkAzAgCAwkBAiE9AgkAoAgBCQEBeQEFAXoFBHVuaXQGCQACAQIOaW52YWxpZCBhc3NldHMJAMwIAgMJAGYCBQJiaQUGaGVpZ2h0BgkAAgECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUCYmoFBHVuaXQGCQACAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUCYmwAAAYJAAIBAgdubyB2b3RlBQNuaWwDCQAAAgUCYmMFAmJjBAJicwkBAmFvAQUBegQCYnQJAKUIAQgFAmFNBmNhbGxlcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAggFAmFNBmNhbGxlcgUBaQkAlgMBCQDMCAIJAGUCBQJiawUCYmwJAMwIAgAABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAUYDBQF6CAUCYU0GY2FsbGVyBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSAIFAXoFAWkJAGUCBQJibQUCYmwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFMAQUBaQkAZQIFAmJuBQJibAUDbmlsCQECYUUCBQJicwUCYnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BDnNldEVwb2NoTGVuZ3RoAQJidgQCYmMJAMwIAgkBAmFOAQUCYU0JAMwIAgMJAGYCBQJidgAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUCYmMFAmJjCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAWcFAmJ2BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BC3NldE1heERlcHRoAQJidwQCYmMJAMwIAgkBAmFOAQUCYU0JAMwIAgMJAGYCBQJidwAABgkAAgECEWludmFsaWQgbWF4IGRlcHRoBQNuaWwDCQAAAgUCYmMFAmJjCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAWsFAmJ3BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BE3Byb2Nlc3NWb3RlSU5URVJOQUwCAmJ4AmJ0BAJhUQkBAmFMAQUCYU0DCQAAAgUCYVEFAmFRBAJhVgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAmJ0CQCsAgICKnByb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzIAUCYnQEAWkJAQFWAgUEdGhpcwUBagQCYnkJAGUCBQFpAAEEAmJiCQEBVgIFBHRoaXMFAWYEAmJoCQEBVgIFBHRoaXMJAQF3AQUBaQQCYmkJAGQCBQJiaAUCYmIEAmJ6CQEBVgIFBHRoaXMJAQF3AQUCYnkEAmJBCQEBVgIFBHRoaXMJAQFoAQUCYnkEAmJCCQBkAgUCYnoFAmJBBAJiQwMJAGcCBQJieQAABgkAAgECK3Byb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgcHJldmlvdXMgZXBvY2gDCQAAAgUCYkMFAmJDBAF6CQEBWAEFAmJ4BAJiRAUBegQBQggFAmJEAl8xBAFDCAUCYkQCXzIEAmJyCQECYWwBBQF6BAJibwoAAVUJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAmJ0CQDMCAIFAmJpBQNuaWwFA25pbAMJAAECBQFVAgNJbnQFAVUJAAIBCQCsAgIJAAMBBQFVAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJFCgABVQkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgUCYnQJAMwIAgUCYkIFA25pbAUDbmlsAwkAAQIFAVUCA0ludAUBVQkAAgEJAKwCAgkAAwEFAVUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYm4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAUwBBQFpAAAEAmJGCQELdmFsdWVPckVsc2UCCQCfCAEJAQFIAgUBegUBaQAABAJiRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQFGAwUBegUCYVYFAmJ5CQCsAgIJAKwCAgkArAICCQCsAgICFHByb2Nlc3NWb3RlSU5URVJOQUwgBQJieAIBIAUCYnQCEjogbm8gcHJldmlvdXMgdm90ZQQCYmsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUQCBQJhVgUBaQAABAJicQMJAGYCBQJiRQAACQBrAwUCYkcFAmJvBQJiRQAABAJiSAMDCQBmAgUCYnEAAAUCYnIHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRgMFAXoFAmFWBQFpBQJicQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUwBBQFpCQBkAgUCYm4FAmJxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSAIFAXoFAWkJAGQCBQJiRgUCYnEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAgUCYVYFAWkJAGQCBQJiawUCYnEFA25pbAkBAmFFAgkBAmFvAQUBegUCYnQJAJQKAgUCYkgFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BE3Byb2Nlc3NQb29sSU5URVJOQUwCAmJ4AmJJBAJhUQkBAmFMAQUCYU0DCQAAAgUCYVEFAmFRBAJiSgQCYksJAQFWAgUEdGhpcwUBagMFAmJJBQJiSwkAZQIFAmJLAAEEAmJDAwkAZwIFAmJKAAAGCQACAQIpcHJvY2Vzc1Bvb2xJTlRFUk5BTDogaW52YWxpZCB0YXJnZXQgZXBvY2gDCQAAAgUCYkMFAmJDBAF6CQEBWAEFAmJ4BAJiTAUBegQBQggFAmJMAl8xBAFDCAUCYkwCXzIEAmJhCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBVAIFBHRoaXMFAW8EAmFoCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBVAIFBHRoaXMFAW0EAmFrCQEBWgIFAUIFAUMEAmJNCgABVQkA/AcEBQJiYQISdXNlcnNMaXN0VHJhdmVyc2FsCQDMCAIFAmFrBQNuaWwFA25pbAMJAAECBQFVAgdCb29sZWFuBQFVCQACAQkArAICCQADAQUBVQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJiTQUCYk0DBQJiTQkAlAoCBQNuaWwGBAJicgkBAmFsAQUBegQCYm4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUwBBQJiSgAABAJiRgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBSAIFAXoFAmJKAAAEAmJOAwMJAAACBQJibgAABgkBASEBBQJicgAACQBrAwUCYkYFAWIFAmJuBAJiTwkA/AcEBQJhaAIMbW9kaWZ5V2VpZ2h0CQDMCAIFAmFrCQDMCAIFAmJOBQNuaWwFA25pbAMJAAACBQJiTwUCYk8EAmJQAwMFAmJyBgUCYkkFA25pbAkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQF5AQUBegUDbmlsCQECYUUCBQJhbgUCYngJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSgIFAXoFAmJKBQJiTgUDbmlsBQJiUAcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BDmZpbmFsaXplSGVscGVyAAQCYkkJAQt2YWx1ZU9yRWxzZQIJAKAIAQUBdgcEAWkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBagAABAJiUQkAZQIFAWkAAQQCYmgJAQFWAgUEdGhpcwkBAXcBBQFpBAJiYgkBAVYCBQR0aGlzBQFmBAJiaQkAZAIFAmJoBQJiYgQCYmoJAJoIAgUEdGhpcwUBcAMDAwkAZwIFBmhlaWdodAUCYmkJAAACBQJiagUEdW5pdAcJAQEhAQUCYkkHBAJiUgkAZAIFAWkAAQQCYlMJAJoIAgUEdGhpcwUBZwQCYlQEAVEFAmJTAwkAAQIFAVECA0ludAQCYnYFAVEJAMwIAgkBDEludGVnZXJFbnRyeQIFAWYFAmJ2CQDMCAIJAQtEZWxldGVFbnRyeQEFAWcFA25pbAMJAAECBQFRAgRVbml0BQNuaWwJAAIBAgtNYXRjaCBlcnJvcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF3AQUCYlIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcwUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFqBQJiUgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcAUBZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAWgBBQFpBQJiYgUDbmlsBQJiVAYDAwUCYkkJAAACBQJiagUEdW5pdAcJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcAUBZQUDbmlsBgMJAAACBQJiagUEdW5pdAkAlAoCBQNuaWwHAwkAAAIFAmJqBQFkBAJiVQkAoggBBQFxBAJiVgkAoggBBQFyBAFRBQJiVQMJAAECBQFRAgRVbml0BAJiVwkAoggBCQECYXEBBQJhbgMJAAECBQJiVwIEVW5pdAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFwBQFlCQDMCAIJAQtEZWxldGVFbnRyeQEFAXEJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcgUDbmlsBgMJAAECBQJiVwIGU3RyaW5nBAJiWAUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJiWAUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAVECBlN0cmluZwQCYngFAVEEAXoJAQFYAQUCYngEAmJZBAJiVwUCYlYDCQABAgUCYlcCBFVuaXQJAKIIAQkBAmFxAQkBAmFvAQUBegMJAAECBQJiVwIGU3RyaW5nBAJiWgUCYlcEAmNhCQCiCAEJAQJhdwIJAQJhbwEFAXoFAmJaAwkAAAIFAmNhBQJjYQQCY2IJAPwHBAUEdGhpcwITcHJvY2Vzc1ZvdGVJTlRFUk5BTAkAzAgCBQJieAkAzAgCBQJiWgUDbmlsBQNuaWwDCQAAAgUCY2IFAmNiBQJjYQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yBAJiVwUCYlkDCQABAgUCYlcCBFVuaXQEAmNjCQCiCAEJAQJhdwIFAmFuBQJieAQCY2QFAmNjAwkAAQIFAmNkAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXAFAWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcQkAzAgCCQELRGVsZXRlRW50cnkBBQFyBQNuaWwGAwkAAQIFAmNkAgZTdHJpbmcEAmFJBQJjZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXEFAmFJCQDMCAIJAQtEZWxldGVFbnRyeQEFAXIFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQJiVwIGU3RyaW5nBAJjZQUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFyBQJjZQUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUCYmoFAWUEAmJVCQCiCAEFAXEEAVEFAmJVAwkAAQIFAVECBFVuaXQEAmJXCQCiCAEJAQJhcQEFAmFuAwkAAQIFAmJXAgRVbml0BAJiSAMFAmJJCQDMCAIJAQtEZWxldGVFbnRyeQEFAXAJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdgUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAXAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF4AQUCYlEGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQJiaAUDbmlsCQCUCgIFAmJIBgMJAAECBQJiVwIGU3RyaW5nBAJjZgUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJjZgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAVECBlN0cmluZwQCYngFAVEEAmNjCQCiCAEJAQJhdwIFAmFuBQJieAMJAAACBQJjYwUCY2MEAmJNCgABVQkA/AcEBQR0aGlzAhNwcm9jZXNzUG9vbElOVEVSTkFMCQDMCAIFAmJ4CQDMCAIFAmJJBQNuaWwFA25pbAMJAAECBQFVAgdCb29sZWFuBQFVCQACAQkArAICCQADAQUBVQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJiTQUCYk0DBQJiTQkAlAoCBQNuaWwGBAJiVwUCY2MDCQABAgUCYlcCBFVuaXQEAmJIAwUCYkkJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcAkAzAgCCQELRGVsZXRlRW50cnkBBQF2CQDMCAIJAQtEZWxldGVFbnRyeQEFAXEFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQFwCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBeAEFAmJRBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdAUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdQUCYmgJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcQUDbmlsCQCUCgIFAmJIBgMJAAECBQJiVwIGU3RyaW5nBAJjZgUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJjZgUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQILTWF0Y2ggZXJyb3IJAAIBAhZmaW5hbGl6YXRpb24gaXMgYnJva2VuAmFNAQ9maW5hbGl6ZVdyYXBwZXIBAmNnBAJjaAoAAVUJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAVUCB0Jvb2xlYW4FAVUJAAIBCQCsAgIJAAMBBQFVAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmNoBQJjaAMJAQEhAQUCY2gDCQAAAgUCY2cAAAkAAgECHkN1cnJlbnQgdm90aW5nIGlzIG5vdCBvdmVyIHlldAkAlAoCBQNuaWwFBHVuaXQEAmNpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWsFAWMDCQBmAgUCY2kFAmNnBAJjagkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgkAZAIFAmNnAAEFA25pbAUDbmlsAwkAAAIFAmNqBQJjagkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQhmaW5hbGl6ZQAEAmNqCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAmNqBQJjagkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BFGNvbnRhaW5zTm9kZVJFQURPTkxZAgJhcgJhdgkAlAoCBQNuaWwJAQJheAIFAmFyBQJhdgJhTQEKaW5zZXJ0Tm9kZQICYXICYXYEAmFRCQECYU4BBQJhTQMJAAACBQJhUQUCYVEJAJQKAgkBAmFCAgUCYXIFAmF2BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQpkZWxldGVOb2RlAgJhcgJhdgQCYVEJAQJhTgEFAmFNAwkAAAIFAmFRBQJhUQkAlAoCCQECYUUCBQJhcgUCYXYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNrAQJjbAAEAmNtBAFRCQECYUgAAwkAAQIFAVECCkJ5dGVWZWN0b3IEAmFPBQFRBQJhTwMJAAECBQFRAgRVbml0CAUCY2sPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmNrCWJvZHlCeXRlcwkAkQMCCAUCY2sGcHJvb2ZzAAAFAmNtgymnFQ==", "height": 2489390, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C6SXkLNGTKA1vfzzZVy9qK9W7MrDUyE3LgE6DEFxQS3P Next: 7dm32yV1cPE9e3ZdD3TSp1K33oSUkK7YTN4DwLjue5mU Diff:
OldNewDifferences
7777 }
7878
7979
80-func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], separator)
81-
82-
8380 func keyPoolShare (pool,epoch) = {
84- let $t025902630 = pool
85- let amountAssetId = $t025902630._1
86- let priceAssetId = $t025902630._2
81+ let $t024342474 = pool
82+ let amountAssetId = $t024342474._1
83+ let priceAssetId = $t024342474._2
8784 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
8885 }
8986
9087
9188 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
92-
93-
94-func keyStakedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], separator)
95-
96-
97-func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
98-
99-
100-func throwErr (msg) = throw(wrapErr(msg))
10189
10290
10391 func getValueOrFail (address,key,type) = {
157145
158146
159147 func checkWxEmissionPoolLabel (pool) = {
160- let $t051525192 = pool
161- let amountAssetId = $t051525192._1
162- let priceAssetId = $t051525192._2
148+ let $t047164756 = pool
149+ let amountAssetId = $t047164756._1
150+ let priceAssetId = $t047164756._2
163151 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
164152 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
165153 if ($isInstanceOf(@, "Boolean"))
171159 let poolsListName = "pools"
172160
173161 func getVotesListName (pool) = {
174- let $t054935533 = pool
175- let amountAssetId = $t054935533._1
176- let priceAssetId = $t054935533._2
162+ let $t050575097 = pool
163+ let amountAssetId = $t050575097._1
164+ let priceAssetId = $t050575097._2
177165 makeString(["votes", amountAssetId, priceAssetId], separator)
178166 }
179167
517505 if ((checkTargetEpoch == checkTargetEpoch))
518506 then {
519507 let pool = stringToPool(poolStr)
520- let $t01798418024 = pool
521- let amountAssetId = $t01798418024._1
522- let priceAssetId = $t01798418024._2
508+ let $t01754817588 = pool
509+ let amountAssetId = $t01754817588._1
510+ let priceAssetId = $t01754817588._2
523511 let wxEmission = checkWxEmissionPoolLabel(pool)
524512 let gwxAmountAtEndTotal = {
525513 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
537525 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
538526 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
539527 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
540- let lpAssetIdStr = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
541- let votingResultStakedPrevious = valueOrElse(getInteger(keyVotingResultStaked(lpAssetIdStr, epochPrevious)), 0)
542- let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
543- let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(lpAssetIdStr, userAddressStr)), 0)
544- let votingResultStakedActions = if ((stakedByUser == 0))
545- then nil
546- else [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, epochPrevious), (votingResultStakedPrevious + votePrevious))]
547528 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
548529 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
549530 else 0
552533 else false)
553534 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
554535 else deleteNodeActions(getVotesListName(pool), userAddressStr)
555- $Tuple2((actions ++ votingResultStakedActions), unit)
536+ $Tuple2(actions, unit)
556537 }
557538 else throw("Strict value is not equal to itself.")
558539 }
578559 if ((checkTargetEpoch == checkTargetEpoch))
579560 then {
580561 let pool = stringToPool(poolStr)
581- let $t02036620406 = pool
582- let amountAssetId = $t02036620406._1
583- let priceAssetId = $t02036620406._2
562+ let $t01931419354 = pool
563+ let amountAssetId = $t01931419354._1
564+ let priceAssetId = $t01931419354._2
584565 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
585566 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
586567 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
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)
1515
1616 let keyEpochLengthNew = makeString(["%s%s", "epochLength__new"], separator)
1717
1818 func keyEpochLengthByEpoch (epoch) = makeString(["%s%d", "epochLength", toString(epoch)], separator)
1919
2020
2121 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
2222
2323 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
2424
2525 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
2626
2727 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
2828
2929 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3030
3131 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
3232
3333 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
3434
3535 let keyNextPool = makeString(["%s", "nextPool"], separator)
3636
3737 let keyNextUser = makeString(["%s", "nextUser"], separator)
3838
3939 let keyStartHeight = makeString(["%s", "startHeight"], separator)
4040
4141 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
4242
4343 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
4444
4545 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
4646
4747 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
4848
4949
5050 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
5151
5252
5353 func keyInList (pool) = {
5454 let $t016931733 = pool
5555 let amountAssetId = $t016931733._1
5656 let priceAssetId = $t016931733._2
5757 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
5858 }
5959
6060
6161 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
6262
6363
6464 func keyVote (pool,address,epoch) = {
6565 let $t020072047 = pool
6666 let amountAssetId = $t020072047._1
6767 let priceAssetId = $t020072047._2
6868 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
6969 }
7070
7171
7272 func keyVotingResult (pool,epoch) = {
7373 let $t022292269 = pool
7474 let amountAssetId = $t022292269._1
7575 let priceAssetId = $t022292269._2
7676 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7777 }
7878
7979
80-func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], separator)
81-
82-
8380 func keyPoolShare (pool,epoch) = {
84- let $t025902630 = pool
85- let amountAssetId = $t025902630._1
86- let priceAssetId = $t025902630._2
81+ let $t024342474 = pool
82+ let amountAssetId = $t024342474._1
83+ let priceAssetId = $t024342474._2
8784 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
8885 }
8986
9087
9188 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
92-
93-
94-func keyStakedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], separator)
95-
96-
97-func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
98-
99-
100-func throwErr (msg) = throw(wrapErr(msg))
10189
10290
10391 func getValueOrFail (address,key,type) = {
10492 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
10593 valueOrErrorMessage( match type {
10694 case str: String =>
10795 getString(address, key)
10896 case int: Int =>
10997 getInteger(address, key)
11098 case _ =>
11199 throw("invalid entry type")
112100 }, error)
113101 }
114102
115103
116104 func getStrOrFail (address,key) = {
117105 let @ = getValueOrFail(address, key, "")
118106 if ($isInstanceOf(@, "String"))
119107 then @
120108 else throw(($getType(@) + " couldn't be cast to String"))
121109 }
122110
123111
124112 func getIntOrFail (address,key) = {
125113 let @ = getValueOrFail(address, key, 0)
126114 if ($isInstanceOf(@, "Int"))
127115 then @
128116 else throw(($getType(@) + " couldn't be cast to Int"))
129117 }
130118
131119
132120 func poolToString (pool) = ((pool._1 + separator) + pool._2)
133121
134122
135123 func stringToPool (str) = {
136124 let parts = split(str, separator)
137125 if ((size(parts) == 2))
138126 then $Tuple2(parts[0], parts[1])
139127 else throw("invalid pool string")
140128 }
141129
142130
143131 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
144132 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
145133
146134 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
147135
148136 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
149137
150138 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
151139 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
152140 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
153141 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
154142 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
155143 lpAssetId
156144 }
157145
158146
159147 func checkWxEmissionPoolLabel (pool) = {
160- let $t051525192 = pool
161- let amountAssetId = $t051525192._1
162- let priceAssetId = $t051525192._2
148+ let $t047164756 = pool
149+ let amountAssetId = $t047164756._1
150+ let priceAssetId = $t047164756._2
163151 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
164152 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
165153 if ($isInstanceOf(@, "Boolean"))
166154 then @
167155 else throw(($getType(@) + " couldn't be cast to Boolean"))
168156 }
169157
170158
171159 let poolsListName = "pools"
172160
173161 func getVotesListName (pool) = {
174- let $t054935533 = pool
175- let amountAssetId = $t054935533._1
176- let priceAssetId = $t054935533._2
162+ let $t050575097 = pool
163+ let amountAssetId = $t050575097._1
164+ let priceAssetId = $t050575097._2
177165 makeString(["votes", amountAssetId, priceAssetId], separator)
178166 }
179167
180168
181169 func keyListHead (listName) = {
182170 let meta = if ((listName == poolsListName))
183171 then "%s%s"
184172 else "%s%s%s%s"
185173 makeString([meta, listName, "head"], separator)
186174 }
187175
188176
189177 func keyListSize (listName) = {
190178 let meta = if ((listName == poolsListName))
191179 then "%s%s"
192180 else "%s%s%s%s"
193181 makeString([meta, listName, "size"], separator)
194182 }
195183
196184
197185 func keyListPrev (listName,id) = {
198186 let meta = if ((listName == poolsListName))
199187 then "%s%s%s%s"
200188 else "%s%s%s%s%s"
201189 makeString([meta, listName, id, "prev"], separator)
202190 }
203191
204192
205193 func keyListNext (listName,id) = {
206194 let meta = if ((listName == poolsListName))
207195 then "%s%s%s%s"
208196 else "%s%s%s%s%s"
209197 makeString([meta, listName, id, "next"], separator)
210198 }
211199
212200
213201 func containsNode (listName,id) = {
214202 let headOrUnit = getString(this, keyListHead(listName))
215203 let prevOrUnit = getString(this, keyListPrev(listName, id))
216204 let nextOrUnit = getString(this, keyListNext(listName, id))
217205 if (if ((id == valueOrElse(headOrUnit, "")))
218206 then true
219207 else (prevOrUnit != unit))
220208 then true
221209 else (nextOrUnit != unit)
222210 }
223211
224212
225213 func insertNodeActions (listName,id) = {
226214 let headOrUnit = getString(this, keyListHead(listName))
227215 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
228216 let checkNode = if (!(containsNode(listName, id)))
229217 then true
230218 else throw("Node exists")
231219 if ((checkNode == checkNode))
232220 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
233221 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
234222 else nil)) ++ [StringEntry(keyListHead(listName), id)])
235223 else throw("Strict value is not equal to itself.")
236224 }
237225
238226
239227 func deleteNodeActions (listName,id) = {
240228 let headOrUnit = getString(this, keyListHead(listName))
241229 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
242230 let prevOrUnit = getString(this, keyListPrev(listName, id))
243231 let nextOrUnit = getString(this, keyListNext(listName, id))
244232 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
245233 then (nextOrUnit != unit)
246234 else false)
247235 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
248236 else if ((nextOrUnit != unit))
249237 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
250238 else if ((prevOrUnit != unit))
251239 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
252240 else if ((id == valueOrElse(headOrUnit, "")))
253241 then [DeleteEntry(keyListHead(listName))]
254242 else throw(((("invalid node: " + listName) + ".") + id))))
255243 }
256244
257245
258246 func keyManagerPublicKey () = "%s__managerPublicKey"
259247
260248
261249 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
262250
263251
264252 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
265253 case s: String =>
266254 fromBase58String(s)
267255 case _: Unit =>
268256 unit
269257 case _ =>
270258 throw("Match error")
271259 }
272260
273261
274262 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
275263 case s: String =>
276264 fromBase58String(s)
277265 case _: Unit =>
278266 unit
279267 case _ =>
280268 throw("Match error")
281269 }
282270
283271
284272 let permissionDeniedError = throw("Permission denied")
285273
286274 func mustThis (i) = if ((i.caller == this))
287275 then true
288276 else permissionDeniedError
289277
290278
291279 func mustManager (i) = match managerPublicKeyOrUnit() {
292280 case pk: ByteVector =>
293281 if ((i.callerPublicKey == pk))
294282 then true
295283 else permissionDeniedError
296284 case _: Unit =>
297285 mustThis(i)
298286 case _ =>
299287 throw("Match error")
300288 }
301289
302290
303291 @Callable(i)
304292 func setManager (pendingManagerPublicKey) = {
305293 let checkCaller = mustManager(i)
306294 if ((checkCaller == checkCaller))
307295 then {
308296 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
309297 if ((checkManagerPublicKey == checkManagerPublicKey))
310298 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
311299 else throw("Strict value is not equal to itself.")
312300 }
313301 else throw("Strict value is not equal to itself.")
314302 }
315303
316304
317305
318306 @Callable(i)
319307 func confirmManager () = {
320308 let pm = pendingManagerPublicKeyOrUnit()
321309 let hasPM = if (isDefined(pm))
322310 then true
323311 else throw("No pending manager")
324312 if ((hasPM == hasPM))
325313 then {
326314 let checkPM = if ((i.callerPublicKey == value(pm)))
327315 then true
328316 else throw("You are not pending manager")
329317 if ((checkPM == checkPM))
330318 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
331319 else throw("Strict value is not equal to itself.")
332320 }
333321 else throw("Strict value is not equal to itself.")
334322 }
335323
336324
337325
338326 @Callable(i)
339327 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
340328 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
341329 $Tuple2(nil, {
342330 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
343331 if ($isInstanceOf(@, "Int"))
344332 then @
345333 else throw(($getType(@) + " couldn't be cast to Int"))
346334 })
347335 }
348336
349337
350338
351339 @Callable(i)
352340 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
353341 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
354342 then true
355343 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
356344 then true
357345 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
358346 then true
359347 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
360348 then true
361349 else "invalid staking contract address", if ((epochLength > 0))
362350 then true
363351 else throw("invalid epoch length")]
364352 if ((checks == checks))
365353 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
366354 else throw("Strict value is not equal to itself.")
367355 }
368356
369357
370358
371359 @Callable(i)
372360 func create (amountAssetId,priceAssetId) = {
373361 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
374362 then true
375363 else mustManager(i)]
376364 if ((checks == checks))
377365 then {
378366 let pool = $Tuple2(amountAssetId, priceAssetId)
379367 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
380368 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
381369 let startHeightActions = if (currentEpochIsNotDefined)
382370 then {
383371 let epoch = 0
384372 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
385373 }
386374 else nil
387375 $Tuple2((inListActions ++ startHeightActions), unit)
388376 }
389377 else throw("Strict value is not equal to itself.")
390378 }
391379
392380
393381
394382 @Callable(i)
395383 func vote (amountAssetId,priceAssetId,amount) = {
396384 let pool = $Tuple2(amountAssetId, priceAssetId)
397385 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
398386 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
399387 let epochLength = getIntOrFail(this, keyEpochLength)
400388 let endHeight = (startHeight + epochLength)
401389 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
402390 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
403391 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
404392 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
405393 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
406394 let gwxAmountAtEndTotal = {
407395 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
408396 if ($isInstanceOf(@, "Int"))
409397 then @
410398 else throw(($getType(@) + " couldn't be cast to Int"))
411399 }
412400 let available = (gwxAmountAtEndTotal - used)
413401 let newVote = (vote + amount)
414402 let wxEmission = checkWxEmissionPoolLabel(pool)
415403 let checks = [if ((getBoolean(keyInList(pool)) != unit))
416404 then true
417405 else throw("invalid assets"), if ((endHeight > height))
418406 then true
419407 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
420408 then true
421409 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
422410 then true
423411 else throw("you do not have gWX"), if (if ((amount > 0))
424412 then (available >= amount)
425413 else false)
426414 then true
427415 else throw("invalid amount"), if (wxEmission)
428416 then true
429417 else throw("pool hasn't WX_EMISSION label")]
430418 if ((checks == checks))
431419 then {
432420 let votesListName = getVotesListName(pool)
433421 let userAddressStr = toString(i.caller)
434422 let votesListActions = if (containsNode(votesListName, userAddressStr))
435423 then nil
436424 else insertNodeActions(votesListName, userAddressStr)
437425 $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)
438426 }
439427 else throw("Strict value is not equal to itself.")
440428 }
441429
442430
443431
444432 @Callable(i)
445433 func cancelVote (amountAssetId,priceAssetId) = {
446434 let pool = $Tuple2(amountAssetId, priceAssetId)
447435 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
448436 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
449437 let epochLength = getIntOrFail(this, keyEpochLength)
450438 let endHeight = (startHeight + epochLength)
451439 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
452440 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
453441 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
454442 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
455443 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
456444 let checks = [if ((getBoolean(keyInList(pool)) != unit))
457445 then true
458446 else throw("invalid assets"), if ((endHeight > height))
459447 then true
460448 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
461449 then true
462450 else throw("finalization in progress"), if ((vote > 0))
463451 then true
464452 else throw("no vote")]
465453 if ((checks == checks))
466454 then {
467455 let votesListName = getVotesListName(pool)
468456 let userAddressStr = toString(i.caller)
469457 $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)
470458 }
471459 else throw("Strict value is not equal to itself.")
472460 }
473461
474462
475463
476464 @Callable(i)
477465 func setEpochLength (newEpochLength) = {
478466 let checks = [mustManager(i), if ((newEpochLength > 0))
479467 then true
480468 else throw("invalid epoch length")]
481469 if ((checks == checks))
482470 then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
483471 else throw("Strict value is not equal to itself.")
484472 }
485473
486474
487475
488476 @Callable(i)
489477 func setMaxDepth (newMaxDepth) = {
490478 let checks = [mustManager(i), if ((newMaxDepth > 0))
491479 then true
492480 else throw("invalid max depth")]
493481 if ((checks == checks))
494482 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
495483 else throw("Strict value is not equal to itself.")
496484 }
497485
498486
499487
500488 @Callable(i)
501489 func processVoteINTERNAL (poolStr,userAddressStr) = {
502490 let checkCaller = mustThis(i)
503491 if ((checkCaller == checkCaller))
504492 then {
505493 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
506494 let epoch = getIntOrFail(this, keyCurrentEpoch)
507495 let epochPrevious = (epoch - 1)
508496 let epochLength = getIntOrFail(this, keyEpochLength)
509497 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
510498 let endHeight = (startHeight + epochLength)
511499 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
512500 let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
513501 let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
514502 let checkTargetEpoch = if ((epochPrevious >= 0))
515503 then true
516504 else throw("processVoteINTERNAL: invalid previous epoch")
517505 if ((checkTargetEpoch == checkTargetEpoch))
518506 then {
519507 let pool = stringToPool(poolStr)
520- let $t01798418024 = pool
521- let amountAssetId = $t01798418024._1
522- let priceAssetId = $t01798418024._2
508+ let $t01754817588 = pool
509+ let amountAssetId = $t01754817588._1
510+ let priceAssetId = $t01754817588._2
523511 let wxEmission = checkWxEmissionPoolLabel(pool)
524512 let gwxAmountAtEndTotal = {
525513 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
526514 if ($isInstanceOf(@, "Int"))
527515 then @
528516 else throw(($getType(@) + " couldn't be cast to Int"))
529517 }
530518 let gwxAmountAtEndTotalPrevious = {
531519 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
532520 if ($isInstanceOf(@, "Int"))
533521 then @
534522 else throw(($getType(@) + " couldn't be cast to Int"))
535523 }
536524 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
537525 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
538526 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
539527 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
540- let lpAssetIdStr = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
541- let votingResultStakedPrevious = valueOrElse(getInteger(keyVotingResultStaked(lpAssetIdStr, epochPrevious)), 0)
542- let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
543- let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(lpAssetIdStr, userAddressStr)), 0)
544- let votingResultStakedActions = if ((stakedByUser == 0))
545- then nil
546- else [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, epochPrevious), (votingResultStakedPrevious + votePrevious))]
547528 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
548529 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
549530 else 0
550531 let actions = if (if ((newVote > 0))
551532 then wxEmission
552533 else false)
553534 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
554535 else deleteNodeActions(getVotesListName(pool), userAddressStr)
555- $Tuple2((actions ++ votingResultStakedActions), unit)
536+ $Tuple2(actions, unit)
556537 }
557538 else throw("Strict value is not equal to itself.")
558539 }
559540 else throw("Strict value is not equal to itself.")
560541 }
561542
562543
563544
564545 @Callable(i)
565546 func processPoolINTERNAL (poolStr,force) = {
566547 let checkCaller = mustThis(i)
567548 if ((checkCaller == checkCaller))
568549 then {
569550 let targetEpoch = {
570551 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
571552 if (force)
572553 then currentEpoch
573554 else (currentEpoch - 1)
574555 }
575556 let checkTargetEpoch = if ((targetEpoch >= 0))
576557 then true
577558 else throw("processPoolINTERNAL: invalid target epoch")
578559 if ((checkTargetEpoch == checkTargetEpoch))
579560 then {
580561 let pool = stringToPool(poolStr)
581- let $t02036620406 = pool
582- let amountAssetId = $t02036620406._1
583- let priceAssetId = $t02036620406._2
562+ let $t01931419354 = pool
563+ let amountAssetId = $t01931419354._1
564+ let priceAssetId = $t01931419354._2
584565 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
585566 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
586567 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
587568 let r = {
588569 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
589570 if ($isInstanceOf(@, "Boolean"))
590571 then @
591572 else throw(($getType(@) + " couldn't be cast to Boolean"))
592573 }
593574 if ((r == r))
594575 then if (r)
595576 then $Tuple2(nil, true)
596577 else {
597578 let wxEmission = checkWxEmissionPoolLabel(pool)
598579 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
599580 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
600581 let share = if (if ((totalVotes == 0))
601582 then true
602583 else !(wxEmission))
603584 then 0
604585 else fraction(votingResult, poolWeightMult, totalVotes)
605586 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
606587 if ((modifyWeightInv == modifyWeightInv))
607588 then {
608589 let poolsListActions = if (if (wxEmission)
609590 then true
610591 else force)
611592 then nil
612593 else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
613594 $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
614595 }
615596 else throw("Strict value is not equal to itself.")
616597 }
617598 else throw("Strict value is not equal to itself.")
618599 }
619600 else throw("Strict value is not equal to itself.")
620601 }
621602 else throw("Strict value is not equal to itself.")
622603 }
623604
624605
625606
626607 @Callable(i)
627608 func finalizeHelper () = {
628609 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
629610 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
630611 let previousEpoch = (epoch - 1)
631612 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
632613 let epochLength = getIntOrFail(this, keyEpochLength)
633614 let endHeight = (startHeight + epochLength)
634615 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
635616 if (if (if ((height >= endHeight))
636617 then (finalizationStageOrUnit == unit)
637618 else false)
638619 then !(force)
639620 else false)
640621 then {
641622 let newEpoch = (epoch + 1)
642623 let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
643624 let newEpochLengthActions = match newEpochLengthOption {
644625 case newEpochLength: Int =>
645626 [IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
646627 case _: Unit =>
647628 nil
648629 case _ =>
649630 throw("Match error")
650631 }
651632 $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
652633 }
653634 else if (if (force)
654635 then (finalizationStageOrUnit == unit)
655636 else false)
656637 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
657638 else if ((finalizationStageOrUnit == unit))
658639 then $Tuple2(nil, false)
659640 else if ((finalizationStageOrUnit == finalizationStageTotal))
660641 then {
661642 let poolOrUnit = getString(keyNextPool)
662643 let userOrUnit = getString(keyNextUser)
663644 match poolOrUnit {
664645 case _: Unit =>
665646 match getString(keyListHead(poolsListName)) {
666647 case _: Unit =>
667648 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
668649 case poolsHeadStr: String =>
669650 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
670651 case _ =>
671652 throw("Match error")
672653 }
673654 case poolStr: String =>
674655 let pool = stringToPool(poolStr)
675656 let nextUserOrUnit = match userOrUnit {
676657 case _: Unit =>
677658 getString(keyListHead(getVotesListName(pool)))
678659 case user: String =>
679660 let next = getString(keyListNext(getVotesListName(pool), user))
680661 if ((next == next))
681662 then {
682663 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
683664 if ((processVoteInv == processVoteInv))
684665 then next
685666 else throw("Strict value is not equal to itself.")
686667 }
687668 else throw("Strict value is not equal to itself.")
688669 case _ =>
689670 throw("Match error")
690671 }
691672 match nextUserOrUnit {
692673 case _: Unit =>
693674 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
694675 match nextPoolOrUnit {
695676 case _: Unit =>
696677 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
697678 case s: String =>
698679 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
699680 case _ =>
700681 throw("Match error")
701682 }
702683 case nextUser: String =>
703684 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
704685 case _ =>
705686 throw("Match error")
706687 }
707688 case _ =>
708689 throw("Match error")
709690 }
710691 }
711692 else if ((finalizationStageOrUnit == finalizationStageShares))
712693 then {
713694 let poolOrUnit = getString(keyNextPool)
714695 match poolOrUnit {
715696 case _: Unit =>
716697 match getString(keyListHead(poolsListName)) {
717698 case _: Unit =>
718699 let actions = if (force)
719700 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
720701 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
721702 $Tuple2(actions, true)
722703 case nextPoolStr: String =>
723704 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
724705 case _ =>
725706 throw("Match error")
726707 }
727708 case poolStr: String =>
728709 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
729710 if ((nextPoolOrUnit == nextPoolOrUnit))
730711 then {
731712 let r = {
732713 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
733714 if ($isInstanceOf(@, "Boolean"))
734715 then @
735716 else throw(($getType(@) + " couldn't be cast to Boolean"))
736717 }
737718 if ((r == r))
738719 then if (r)
739720 then $Tuple2(nil, true)
740721 else match nextPoolOrUnit {
741722 case _: Unit =>
742723 let actions = if (force)
743724 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
744725 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
745726 $Tuple2(actions, true)
746727 case nextPoolStr: String =>
747728 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
748729 case _ =>
749730 throw("Match error")
750731 }
751732 else throw("Strict value is not equal to itself.")
752733 }
753734 else throw("Strict value is not equal to itself.")
754735 case _ =>
755736 throw("Match error")
756737 }
757738 }
758739 else throw("finalization is broken")
759740 }
760741
761742
762743
763744 @Callable(i)
764745 func finalizeWrapper (counter) = {
765746 let result = {
766747 let @ = invoke(this, "finalizeHelper", nil, nil)
767748 if ($isInstanceOf(@, "Boolean"))
768749 then @
769750 else throw(($getType(@) + " couldn't be cast to Boolean"))
770751 }
771752 if ((result == result))
772753 then if (!(result))
773754 then if ((counter == 0))
774755 then throw("Current voting is not over yet")
775756 else $Tuple2(nil, unit)
776757 else {
777758 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
778759 if ((maxDepth > counter))
779760 then {
780761 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
781762 if ((inv == inv))
782763 then $Tuple2(nil, unit)
783764 else throw("Strict value is not equal to itself.")
784765 }
785766 else $Tuple2(nil, unit)
786767 }
787768 else throw("Strict value is not equal to itself.")
788769 }
789770
790771
791772
792773 @Callable(i)
793774 func finalize () = {
794775 let inv = invoke(this, "finalizeWrapper", [0], nil)
795776 if ((inv == inv))
796777 then $Tuple2(nil, unit)
797778 else throw("Strict value is not equal to itself.")
798779 }
799780
800781
801782
802783 @Callable(i)
803784 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
804785
805786
806787
807788 @Callable(i)
808789 func insertNode (listName,id) = {
809790 let checkCaller = mustManager(i)
810791 if ((checkCaller == checkCaller))
811792 then $Tuple2(insertNodeActions(listName, id), unit)
812793 else throw("Strict value is not equal to itself.")
813794 }
814795
815796
816797
817798 @Callable(i)
818799 func deleteNode (listName,id) = {
819800 let checkCaller = mustManager(i)
820801 if ((checkCaller == checkCaller))
821802 then $Tuple2(deleteNodeActions(listName, id), unit)
822803 else throw("Strict value is not equal to itself.")
823804 }
824805
825806
826807 @Verifier(tx)
827808 func verify () = {
828809 let targetPublicKey = match managerPublicKeyOrUnit() {
829810 case pk: ByteVector =>
830811 pk
831812 case _: Unit =>
832813 tx.senderPublicKey
833814 case _ =>
834815 throw("Match error")
835816 }
836817 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
837818 }
838819

github/deemru/w8io/169f3d6 
168.89 ms