tx · J5xk3tv5ZG3ejqi8Nb7LUtAzqNrUxLQh2U7ek9ud6Pa3

3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA:  -0.02200000 Waves

2023.02.22 16:30 [2460915] smart account 3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA > SELF 0.00000000 Waves

{ "type": 13, "id": "J5xk3tv5ZG3ejqi8Nb7LUtAzqNrUxLQh2U7ek9ud6Pa3", "fee": 2200000, "feeAssetId": null, "timestamp": 1677072632295, "version": 2, "chainId": 84, "sender": "3Mp3nG9T5fKGziHW8mcCqx3jMFx3towh3WA", "senderPublicKey": "D46gQxzmdzdCTYRg6dMcwFoUrc6ZmxF6GKd5ZoTkvzp1", "proofs": [ "28UzqVpKVegKE7BLExznp5BaifouUrggNrfy17pYJj5PZRQ6bwJ1ncGzq1WfD1f9EfDaQ5zita8JdBNzWvzaD7Db" ], "script": "base64:BgKxFAgCEgMKAQgSABIECgIIARIHCgUICAgIARIECgIICBIFCgMICAESBAoCCAgSAwoBARIDCgEBEgQKAggIEgQKAggEEgASAwoBARIAEgQKAggIEgQKAggIEgQKAggIIglzZXBhcmF0b3IiDnBvb2xXZWlnaHRNdWx0Ig9tYXhEZXB0aERlZmF1bHQiFmZpbmFsaXphdGlvblN0YWdlVG90YWwiF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzIg5rZXlFcG9jaExlbmd0aCIRa2V5RXBvY2hMZW5ndGhOZXciFWtleUVwb2NoTGVuZ3RoQnlFcG9jaCIFZXBvY2giD2tleUN1cnJlbnRFcG9jaCILa2V5TWF4RGVwdGgiImtleVZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiEmtleUZhY3RvcnlDb250cmFjdCITa2V5Qm9vc3RpbmdDb250cmFjdCISa2V5U3Rha2luZ0NvbnRyYWN0IhRrZXlGaW5hbGl6YXRpb25TdGFnZSILa2V5TmV4dFBvb2wiC2tleU5leHRVc2VyIg5rZXlTdGFydEhlaWdodCIRa2V5Q3VycmVudEVwb2NoVWkiEGtleVN0YXJ0SGVpZ2h0VWkiHWtleUZpbmFsaXphdGlvblNob3VsZEJlRm9yY2VkIhVrZXlTdGFydEhlaWdodEJ5RXBvY2giDGtleUZpbmFsaXplZCIJa2V5SW5MaXN0IgRwb29sIgskdDAxNjkzMTczMyINYW1vdW50QXNzZXRJZCIMcHJpY2VBc3NldElkIgdrZXlVc2VkIgdhZGRyZXNzIgdrZXlWb3RlIgskdDAyMDA3MjA0NyIPa2V5Vm90aW5nUmVzdWx0IgskdDAyMjI5MjI2OSIMa2V5UG9vbFNoYXJlIgskdDAyNDM0MjQ3NCINa2V5VG90YWxWb3RlcyIOZ2V0VmFsdWVPckZhaWwiA2tleSIEdHlwZSIFZXJyb3IiByRtYXRjaDAiA3N0ciIDaW50IgxnZXRTdHJPckZhaWwiAUAiDGdldEludE9yRmFpbCIMcG9vbFRvU3RyaW5nIgxzdHJpbmdUb1Bvb2wiBXBhcnRzIhZnZXRMcEFzc2V0QnlQb29sQXNzZXRzIh9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkIgxiYXNlQXNzZXRTdHIiKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzIhhpbnRlcm5hbEFtb3VudEFzc2V0SWRTdHIiF2ludGVybmFsUHJpY2VBc3NldElkU3RyIh9rZXlNYXBwaW5nUG9vbENvbnRyYWN0VG9MUEFzc2V0IhNwb29sQ29udHJhY3RBZGRyZXNzIg9mYWN0b3J5Q29udHJhY3QiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiCWxwQXNzZXRJZCIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsIgskdDA0NzE2NDc1NiINcG9vbHNMaXN0TmFtZSIQZ2V0Vm90ZXNMaXN0TmFtZSILJHQwNTA1NzUwOTciC2tleUxpc3RIZWFkIghsaXN0TmFtZSIEbWV0YSILa2V5TGlzdFNpemUiC2tleUxpc3RQcmV2IgJpZCILa2V5TGlzdE5leHQiDGNvbnRhaW5zTm9kZSIKaGVhZE9yVW5pdCIKcHJldk9yVW5pdCIKbmV4dE9yVW5pdCIRaW5zZXJ0Tm9kZUFjdGlvbnMiCGxpc3RTaXplIgljaGVja05vZGUiEWRlbGV0ZU5vZGVBY3Rpb25zIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCIBcyIdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQiFXBlcm1pc3Npb25EZW5pZWRFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiC2NoZWNrQ2FsbGVyIhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSILdXNlckFkZHJlc3MiDHRhcmdldEhlaWdodCIXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MiH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiD3N0YWtpbmdDb250cmFjdCILZXBvY2hMZW5ndGgiBmNoZWNrcyINaW5MaXN0QWN0aW9ucyIYY3VycmVudEVwb2NoSXNOb3REZWZpbmVkIhJzdGFydEhlaWdodEFjdGlvbnMiBmFtb3VudCILc3RhcnRIZWlnaHQiCWVuZEhlaWdodCIXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQiBHVzZWQiBHZvdGUiCnBvb2xSZXN1bHQiCnRvdGFsVm90ZXMiE2d3eEFtb3VudEF0RW5kVG90YWwiCWF2YWlsYWJsZSIHbmV3Vm90ZSIKd3hFbWlzc2lvbiINdm90ZXNMaXN0TmFtZSIOdXNlckFkZHJlc3NTdHIiEHZvdGVzTGlzdEFjdGlvbnMiDm5ld0Vwb2NoTGVuZ3RoIgtuZXdNYXhEZXB0aCIHcG9vbFN0ciINZXBvY2hQcmV2aW91cyITc3RhcnRIZWlnaHRQcmV2aW91cyITZXBvY2hMZW5ndGhQcmV2aW91cyIRZW5kSGVpZ2h0UHJldmlvdXMiEGNoZWNrVGFyZ2V0RXBvY2giDSR0MDE3NTQ4MTc1ODgiG2d3eEFtb3VudEF0RW5kVG90YWxQcmV2aW91cyIMdm90aW5nUmVzdWx0Igx2b3RlUHJldmlvdXMiB2FjdGlvbnMiBWZvcmNlIgt0YXJnZXRFcG9jaCIMY3VycmVudEVwb2NoIg0kdDAxOTMxNDE5MzU0IgFyIgVzaGFyZSIPbW9kaWZ5V2VpZ2h0SW52IhBwb29sc0xpc3RBY3Rpb25zIg1wcmV2aW91c0Vwb2NoIghuZXdFcG9jaCIUbmV3RXBvY2hMZW5ndGhPcHRpb24iFW5ld0Vwb2NoTGVuZ3RoQWN0aW9ucyIKcG9vbE9yVW5pdCIKdXNlck9yVW5pdCIHJG1hdGNoMSIMcG9vbHNIZWFkU3RyIg5uZXh0VXNlck9yVW5pdCIEdXNlciIEbmV4dCIOcHJvY2Vzc1ZvdGVJbnYiDm5leHRQb29sT3JVbml0IgckbWF0Y2gyIghuZXh0VXNlciILbmV4dFBvb2xTdHIiB2NvdW50ZXIiBnJlc3VsdCIIbWF4RGVwdGgiA2ludiICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5NAABYQICX18AAWIAgMLXLwABYwAKAAFkAAAAAWUAAQABZgkAuQkCCQDMCAICAiVzCQDMCAICC2Vwb2NoTGVuZ3RoBQNuaWwFAWEAAWcJALkJAgkAzAgCAgQlcyVzCQDMCAICEGVwb2NoTGVuZ3RoX19uZXcFA25pbAUBYQEBaAEBaQkAuQkCCQDMCAICBCVzJWQJAMwIAgILZXBvY2hMZW5ndGgJAMwIAgkApAMBBQFpBQNuaWwFAWEAAWoJALkJAgkAzAgCAgIlcwkAzAgCAgxjdXJyZW50RXBvY2gFA25pbAUBYQABawkAuQkCCQDMCAICAiVzCQDMCAICCG1heERlcHRoBQNuaWwFAWEAAWwJALkJAgkAzAgCAgIlcwkAzAgCAh92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQNuaWwFAWEAAW0JALkJAgkAzAgCAgIlcwkAzAgCAg9mYWN0b3J5Q29udHJhY3QFA25pbAUBYQABbgkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUBYQABbwkAuQkCCQDMCAICAiVzCQDMCAICD3N0YWtpbmdDb250cmFjdAUDbmlsBQFhAAFwCQC5CQIJAMwIAgICJXMJAMwIAgIRZmluYWxpemF0aW9uU3RhZ2UFA25pbAUBYQABcQkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRQb29sBQNuaWwFAWEAAXIJALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0VXNlcgUDbmlsBQFhAAFzCQC5CQIJAMwIAgICJXMJAMwIAgILc3RhcnRIZWlnaHQFA25pbAUBYQABdAkAuQkCCQDMCAICAiVzCQDMCAICDmN1cnJlbnRFcG9jaFVpBQNuaWwFAWEAAXUJALkJAgkAzAgCAgIlcwkAzAgCAg1zdGFydEhlaWdodFVpBQNuaWwFAWEAAXYJALkJAgkAzAgCAgIlcwkAzAgCAgVmb3JjZQUDbmlsBQFhAQF3AQFpCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFAWkFA25pbAUBYQEBeAEBaQkAuQkCCQDMCAICBCVzJWQJAMwIAgIJZmluYWxpemVkCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQF5AQF6BAFBBQF6BAFCCAUBQQJfMQQBQwgFAUECXzIJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGaW5MaXN0CQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFhAQFEAgFFAWkJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIEdXNlZAkAzAgCCQClCAEFAUUJAMwIAgkApAMBBQFpBQNuaWwFAWEBAUYDAXoBRQFpBAFHBQF6BAFCCAUBRwJfMQQBQwgFAUcCXzIJALkJAgkAzAgCAgolcyVzJXMlcyVkCQDMCAICBHZvdGUJAMwIAgUBQgkAzAgCBQFDCQDMCAIJAKUIAQUBRQkAzAgCCQCkAwEFAWkFA25pbAUBYQEBSAIBegFpBAFJBQF6BAFCCAUBSQJfMQQBQwgFAUkCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAgx2b3RpbmdSZXN1bHQJAMwIAgUBQgkAzAgCBQFDCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFKAgF6AWkEAUsFAXoEAUIIBQFLAl8xBAFDCAUBSwJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICCXBvb2xTaGFyZQkAzAgCBQFCCQDMCAIFAUMJAMwIAgkApAMBBQFpBQNuaWwFAWEBAUwBAWkJALkJAgkAzAgCAgQlcyVkCQDMCAICCnRvdGFsVm90ZXMJAMwIAgkApAMBBQFpBQNuaWwFAWEBAU0DAUUBTgFPBAFQCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAUUJAMwIAgIBLgkAzAgCBQFOCQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgQBUQUBTwMJAAECBQFRAgZTdHJpbmcEAVIFAVEJAJ0IAgUBRQUBTgMJAAECBQFRAgNJbnQEAVMFAVEJAJoIAgUBRQUBTgkAAgECEmludmFsaWQgZW50cnkgdHlwZQUBUAEBVAIBRQFOCgABVQkBAU0DBQFFBQFOAgADCQABAgUBVQIGU3RyaW5nBQFVCQACAQkArAICCQADAQUBVQIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAQFWAgFFAU4KAAFVCQEBTQMFAUUFAU4AAAMJAAECBQFVAgNJbnQFAVUJAAIBCQCsAgIJAAMBBQFVAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBAVcBAXoJAKwCAgkArAICCAUBegJfMQUBYQgFAXoCXzIBAVgBAVIEAVkJALUJAgUBUgUBYQMJAAACCQCQAwEFAVkAAgkAlAoCCQCRAwIFAVkAAAkAkQMCBQFZAAEJAAIBAhNpbnZhbGlkIHBvb2wgc3RyaW5nAQFaAgFCAUMKAQJhYQECYWIJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWIKAQJhYwICYWQCYWUJAKwCAgkArAICCQCsAgIJAKwCAgIKJWQlZCVzJXNfXwkApAMBBQJhZAICX18JAKQDAQUCYWUCI19fbWFwcGluZ3NfX3Bvb2xBc3NldHMyUG9vbENvbnRyYWN0CgECYWYBAmFnCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFnAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAQCYWgJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFUAgUEdGhpcwUBbQQCYWkJAQFWAgUCYWgJAQJhYQEFAUIEAmFqCQEBVgIFAmFoCQECYWEBBQFDBAJhZwkBAVQCBQJhaAkBAmFjAgUCYWkFAmFqBAJhawkBAVQCBQJhaAkBAmFmAQUCYWcFAmFrAQJhbAEBegQCYW0FAXoEAUIIBQJhbQJfMQQBQwgFAmFtAl8yBAJhaAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAVQCBQR0aGlzBQFtCgABVQkA/AcEBQJhaAIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQNuaWwDCQABAgUBVQIHQm9vbGVhbgUBVQkAAgEJAKwCAgkAAwEFAVUCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4AAmFuAgVwb29scwECYW8BAXoEAmFwBQF6BAFCCAUCYXACXzEEAUMIBQJhcAJfMgkAuQkCCQDMCAICBXZvdGVzCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFhAQJhcQECYXIEAmFzAwkAAAIFAmFyBQJhbgIEJXMlcwIIJXMlcyVzJXMJALkJAgkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCAgRoZWFkBQNuaWwFAWEBAmF0AQJhcgQCYXMDCQAAAgUCYXIFAmFuAgQlcyVzAgglcyVzJXMlcwkAuQkCCQDMCAIFAmFzCQDMCAIFAmFyCQDMCAICBHNpemUFA25pbAUBYQECYXUCAmFyAmF2BAJhcwMJAAACBQJhcgUCYW4CCCVzJXMlcyVzAgolcyVzJXMlcyVzCQC5CQIJAMwIAgUCYXMJAMwIAgUCYXIJAMwIAgUCYXYJAMwIAgIEcHJldgUDbmlsBQFhAQJhdwICYXICYXYEAmFzAwkAAAIFAmFyBQJhbgIIJXMlcyVzJXMCCiVzJXMlcyVzJXMJALkJAgkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCBQJhdgkAzAgCAgRuZXh0BQNuaWwFAWEBAmF4AgJhcgJhdgQCYXkJAJ0IAgUEdGhpcwkBAmFxAQUCYXIEAmF6CQCdCAIFBHRoaXMJAQJhdQIFAmFyBQJhdgQCYUEJAJ0IAgUEdGhpcwkBAmF3AgUCYXIFAmF2AwMJAAACBQJhdgkBC3ZhbHVlT3JFbHNlAgUCYXkCAAYJAQIhPQIFAmF6BQR1bml0BgkBAiE9AgUCYUEFBHVuaXQBAmFCAgJhcgJhdgQCYXkJAJ0IAgUEdGhpcwkBAmFxAQUCYXIEAmFDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJhdAEFAmFyAAAEAmFEAwkBASEBCQECYXgCBQJhcgUCYXYGCQACAQILTm9kZSBleGlzdHMDCQAAAgUCYUQFAmFECQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF0AQUCYXIJAGQCBQJhQwABBQNuaWwDCQECIT0CBQJheQUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXcCBQJhcgUCYXYJAQV2YWx1ZQEFAmF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdQIFAmFyCQEFdmFsdWUBBQJheQUCYXYFA25pbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcQEFAmFyBQJhdgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJhRQICYXICYXYEAmF5CQCdCAIFBHRoaXMJAQJhcQEFAmFyBAJhQwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYXQBBQJhcgAABAJhegkAnQgCBQR0aGlzCQECYXUCBQJhcgUCYXYEAmFBCQCdCAIFBHRoaXMJAQJhdwIFAmFyBQJhdgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQBBQJhcgkAZQIFAmFDAAEFA25pbAMDCQECIT0CBQJhegUEdW5pdAkBAiE9AgUCYUEFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdwIFAmFyCQEFdmFsdWUBBQJhegkBBXZhbHVlAQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AgUCYXIJAQV2YWx1ZQEFAmFBCQEFdmFsdWUBBQJhegkAzAgCCQELRGVsZXRlRW50cnkBCQECYXUCBQJhcgUCYXYJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF3AgUCYXIFAmF2BQNuaWwDCQECIT0CBQJhQQUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXEBBQJhcgkBBXZhbHVlAQUCYUEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF3AgUCYXIFAmF2CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAmFyCQEFdmFsdWUBBQJhQQUDbmlsAwkBAiE9AgUCYXoFBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF1AgUCYXIFAmF2CQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdwIFAmFyCQEFdmFsdWUBBQJhegUDbmlsAwkAAAIFAmF2CQELdmFsdWVPckVsc2UCBQJheQIACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcQEFAmFyBQNuaWwJAAIBCQCsAgIJAKwCAgkArAICAg5pbnZhbGlkIG5vZGU6IAUCYXICAS4FAmF2AQJhRgACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJhRwACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQECYUgABAFRCQCiCAEJAQJhRgADCQABAgUBUQIGU3RyaW5nBAJhSQUBUQkA2QQBBQJhSQMJAAECBQFRAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFKAAQBUQkAoggBCQECYUcAAwkAAQIFAVECBlN0cmluZwQCYUkFAVEJANkEAQUCYUkDCQABAgUBUQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJhSwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJhTAECYU0DCQAAAggFAmFNBmNhbGxlcgUEdGhpcwYFAmFLAQJhTgECYU0EAVEJAQJhSAADCQABAgUBUQIKQnl0ZVZlY3RvcgQCYU8FAVEDCQAAAggFAmFND2NhbGxlclB1YmxpY0tleQUCYU8GBQJhSwMJAAECBQFRAgRVbml0CQECYUwBBQJhTQkAAgECC01hdGNoIGVycm9yEQJhTQEKc2V0TWFuYWdlcgECYVAEAmFRCQECYU4BBQJhTQMJAAACBQJhUQUCYVEEAmFSCQDZBAEFAmFQAwkAAAIFAmFSBQJhUgkAzAgCCQELU3RyaW5nRW50cnkCCQECYUcABQJhUAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQ5jb25maXJtTWFuYWdlcgAEAmFTCQECYUoABAJhVAMJAQlpc0RlZmluZWQBBQJhUwYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCYVQFAmFUBAJhVQMJAAACCAUCYU0PY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJhUwYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCYVUFAmFVCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhRgAJANgEAQkBBXZhbHVlAQUCYVMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFHAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNARhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQCAmFWAmFXBAJhWAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQFUAgUEdGhpcwUBbgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQCUCgIFA25pbAoAAVUJAPwHBAUCYVgCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFAmFWCQDMCAIFAmFXBQNuaWwFA25pbAMJAAECBQFVAgNJbnQFAVUJAAIBCQCsAgIJAAMBBQFVAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQCYU0BC2NvbnN0cnVjdG9yBQJhaAJhWQJhWgJiYQJiYgQCYmMJAMwIAgkBAmFOAQUCYU0JAMwIAgMJAQIhPQIJAKYIAQUCYWgFBHVuaXQGAiBpbnZhbGlkIGZhY3RvcnkgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJhWQUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmFaBQR1bml0BgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJhBQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQJiYgAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUCYmMFAmJjCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbQUCYWgJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbAUCYVkJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbgUCYVoJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbwUCYmEJAMwIAgkBDEludGVnZXJFbnRyeQIFAWYFAmJiBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BBmNyZWF0ZQIBQgFDBAJiYwkAzAgCAwkAAAIJANgEAQgIBQJhTQZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBbAIABgkBAmFOAQUCYU0FA25pbAMJAAACBQJiYwUCYmMEAXoJAJQKAgUBQgUBQwQCYmQJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAXkBBQF6BgUDbmlsCQECYUICBQJhbgkBAVcBBQF6BAJiZQkAAAIJAJoIAgUEdGhpcwUBagUEdW5pdAQCYmYDBQJiZQQBaQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFqBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdwEFAWkFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcwUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQZoZWlnaHQFA25pbAUDbmlsCQCUCgIJAM4IAgUCYmQFAmJmBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQR2b3RlAwFCAUMCYmcEAXoJAJQKAgUBQgUBQwQBaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFqAAAEAmJoCQEBVgIFBHRoaXMJAQF3AQUBaQQCYmIJAQFWAgUEdGhpcwUBZgQCYmkJAGQCBQJiaAUCYmIEAmJqCQCaCAIFBHRoaXMFAXAEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFEAggFAmFNBmNhbGxlcgUBaQAABAJibAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRgMFAXoIBQJhTQZjYWxsZXIFAWkAAAQCYm0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUgCBQF6BQFpAAAEAmJuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFMAQUBaQAABAJibwoAAVUJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIJANgEAQgIBQJhTQZjYWxsZXIFYnl0ZXMJAMwIAgUCYmkFA25pbAUDbmlsAwkAAQIFAVUCA0ludAUBVQkAAgEJAKwCAgkAAwEFAVUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYnAJAGUCBQJibwUCYmsEAmJxCQBkAgUCYmwFAmJnBAJicgkBAmFsAQUBegQCYmMJAMwIAgMJAQIhPQIJAKAIAQkBAXkBBQF6BQR1bml0BgkAAgECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYmkFBmhlaWdodAYJAAIBAg5pbnZhbGlkIGhlaWdodAkAzAgCAwkAAAIFAmJqBQR1bml0BgkAAgECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFAmJvAAAGCQACAQITeW91IGRvIG5vdCBoYXZlIGdXWAkAzAgCAwMJAGYCBQJiZwAACQBnAgUCYnAFAmJnBwYJAAIBAg5pbnZhbGlkIGFtb3VudAkAzAgCAwUCYnIGCQACAQIdcG9vbCBoYXNuJ3QgV1hfRU1JU1NJT04gbGFiZWwFA25pbAMJAAACBQJiYwUCYmMEAmJzCQECYW8BBQF6BAJidAkApQgBCAUCYU0GY2FsbGVyBAJidQMJAQJheAIFAmJzBQJidAUDbmlsCQECYUICBQJicwUCYnQJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRAIIBQJhTQZjYWxsZXIFAWkJAGQCBQJiawUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFGAwUBeggFAmFNBmNhbGxlcgUBaQUCYnEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFIAgUBegUBaQkAZAIFAmJtBQJiZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUwBBQFpCQBkAgUCYm4FAmJnBQNuaWwFAmJ1BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQpjYW5jZWxWb3RlAgFCAUMEAXoJAJQKAgUBQgUBQwQBaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFqAAAEAmJoCQEBVgIFBHRoaXMJAQF3AQUBaQQCYmIJAQFWAgUEdGhpcwUBZgQCYmkJAGQCBQJiaAUCYmIEAmJqCQCaCAIFBHRoaXMFAXAEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFEAggFAmFNBmNhbGxlcgUBaQAABAJibAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRgMFAXoIBQJhTQZjYWxsZXIFAWkAAAQCYm0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUgCBQF6BQFpAAAEAmJuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFMAQUBaQAABAJiYwkAzAgCAwkBAiE9AgkAoAgBCQEBeQEFAXoFBHVuaXQGCQACAQIOaW52YWxpZCBhc3NldHMJAMwIAgMJAGYCBQJiaQUGaGVpZ2h0BgkAAgECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUCYmoFBHVuaXQGCQACAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUCYmwAAAYJAAIBAgdubyB2b3RlBQNuaWwDCQAAAgUCYmMFAmJjBAJicwkBAmFvAQUBegQCYnQJAKUIAQgFAmFNBmNhbGxlcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAggFAmFNBmNhbGxlcgUBaQkAlgMBCQDMCAIJAGUCBQJiawUCYmwJAMwIAgAABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAUYDBQF6CAUCYU0GY2FsbGVyBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSAIFAXoFAWkJAGUCBQJibQUCYmwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFMAQUBaQkAZQIFAmJuBQJibAUDbmlsCQECYUUCBQJicwUCYnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BDnNldEVwb2NoTGVuZ3RoAQJidgQCYmMJAMwIAgkBAmFOAQUCYU0JAMwIAgMJAGYCBQJidgAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUCYmMFAmJjCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAWcFAmJ2BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BC3NldE1heERlcHRoAQJidwQCYmMJAMwIAgkBAmFOAQUCYU0JAMwIAgMJAGYCBQJidwAABgkAAgECEWludmFsaWQgbWF4IGRlcHRoBQNuaWwDCQAAAgUCYmMFAmJjCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAWsFAmJ3BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BE3Byb2Nlc3NWb3RlSU5URVJOQUwCAmJ4AmJ0BAJhUQkBAmFMAQUCYU0DCQAAAgUCYVEFAmFRBAJhVgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAmJ0CQCsAgICKnByb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzIAUCYnQEAWkJAQFWAgUEdGhpcwUBagQCYnkJAGUCBQFpAAEEAmJiCQEBVgIFBHRoaXMFAWYEAmJoCQEBVgIFBHRoaXMJAQF3AQUBaQQCYmkJAGQCBQJiaAUCYmIEAmJ6CQEBVgIFBHRoaXMJAQF3AQUCYnkEAmJBCQEBVgIFBHRoaXMJAQFoAQUCYnkEAmJCCQBkAgUCYnoFAmJBBAJiQwMJAGcCBQJieQAABgkAAgECK3Byb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgcHJldmlvdXMgZXBvY2gDCQAAAgUCYkMFAmJDBAF6CQEBWAEFAmJ4BAJiRAUBegQBQggFAmJEAl8xBAFDCAUCYkQCXzIEAmJyCQECYWwBBQF6BAJibwoAAVUJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAmJ0CQDMCAIFAmJpBQNuaWwFA25pbAMJAAECBQFVAgNJbnQFAVUJAAIBCQCsAgIJAAMBBQFVAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJFCgABVQkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgUCYnQJAMwIAgUCYkIFA25pbAUDbmlsAwkAAQIFAVUCA0ludAUBVQkAAgEJAKwCAgkAAwEFAVUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYm4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAUwBBQFpAAAEAmJGCQELdmFsdWVPckVsc2UCCQCfCAEJAQFIAgUBegUBaQAABAJiRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQFGAwUBegUCYVYFAmJ5CQCsAgIJAKwCAgkArAICCQCsAgICFHByb2Nlc3NWb3RlSU5URVJOQUwgBQJieAIBIAUCYnQCEjogbm8gcHJldmlvdXMgdm90ZQQCYmsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUQCBQJhVgUBaQAABAJicQMJAGYCBQJiRQAACQBrAwUCYkcFAmJvBQJiRQAABAJiSAMDCQBmAgUCYnEAAAUCYnIHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRgMFAXoFAmFWBQFpBQJicQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUwBBQFpCQBkAgUCYm4FAmJxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSAIFAXoFAWkJAGQCBQJiRgUCYnEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAgUCYVYFAWkJAGQCBQJiawUCYnEFA25pbAkBAmFFAgkBAmFvAQUBegUCYnQJAJQKAgUCYkgFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BE3Byb2Nlc3NQb29sSU5URVJOQUwCAmJ4AmJJBAJhUQkBAmFMAQUCYU0DCQAAAgUCYVEFAmFRBAJiSgQCYksJAQFWAgUEdGhpcwUBagMFAmJJBQJiSwkAZQIFAmJLAAEEAmJDAwkAZwIFAmJKAAAGCQACAQIpcHJvY2Vzc1Bvb2xJTlRFUk5BTDogaW52YWxpZCB0YXJnZXQgZXBvY2gDCQAAAgUCYkMFAmJDBAF6CQEBWAEFAmJ4BAJiTAUBegQBQggFAmJMAl8xBAFDCAUCYkwCXzIEAmJhCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBVAIFBHRoaXMFAW8EAmFoCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBVAIFBHRoaXMFAW0EAmFrCQEBWgIFAUIFAUMEAmJNCgABVQkA/AcEBQJiYQISdXNlcnNMaXN0VHJhdmVyc2FsCQDMCAIFAmFrBQNuaWwFA25pbAMJAAECBQFVAgdCb29sZWFuBQFVCQACAQkArAICCQADAQUBVQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJiTQUCYk0DBQJiTQkAlAoCBQNuaWwGBAJicgkBAmFsAQUBegQCYm4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUwBBQJiSgAABAJiRgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBSAIFAXoFAmJKAAAEAmJOAwMJAAACBQJibgAABgkBASEBBQJicgAACQBrAwUCYkYFAWIFAmJuBAJiTwkA/AcEBQJhaAIMbW9kaWZ5V2VpZ2h0CQDMCAIFAmFrCQDMCAIFAmJOBQNuaWwFA25pbAMJAAACBQJiTwUCYk8EAmJQAwMFAmJyBgUCYkkFA25pbAkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQF5AQUBegUDbmlsCQECYUUCBQJhbgUCYngJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSgIFAXoFAmJKBQJiTgUDbmlsBQJiUAcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BDmZpbmFsaXplSGVscGVyAAQCYkkJAQt2YWx1ZU9yRWxzZQIJAKAIAQUBdgcEAWkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBagAABAJiUQkAZQIFAWkAAQQCYmgJAQFWAgUEdGhpcwkBAXcBBQFpBAJiYgkBAVYCBQR0aGlzBQFmBAJiaQkAZAIFAmJoBQJiYgQCYmoJAJoIAgUEdGhpcwUBcAMDAwkAZwIFBmhlaWdodAUCYmkJAAACBQJiagUEdW5pdAcJAQEhAQUCYkkHBAJiUgkAZAIFAWkAAQQCYlMJAJoIAgUEdGhpcwUBZwQCYlQEAVEFAmJTAwkAAQIFAVECA0ludAQCYnYFAVEJAMwIAgkBDEludGVnZXJFbnRyeQIFAWYFAmJ2CQDMCAIJAQtEZWxldGVFbnRyeQEFAWcFA25pbAMJAAECBQFRAgRVbml0BQNuaWwJAAIBAgtNYXRjaCBlcnJvcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF3AQUCYlIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcwUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFqBQJiUgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcAUBZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAWgBBQFpBQJiYgUDbmlsBQJiVAYDAwUCYkkJAAACBQJiagUEdW5pdAcJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcAUBZQUDbmlsBgMJAAACBQJiagUEdW5pdAkAlAoCBQNuaWwHAwkAAAIFAmJqBQFkBAJiVQkAoggBBQFxBAJiVgkAoggBBQFyBAFRBQJiVQMJAAECBQFRAgRVbml0BAJiVwkAoggBCQECYXEBBQJhbgMJAAECBQJiVwIEVW5pdAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFwBQFlCQDMCAIJAQtEZWxldGVFbnRyeQEFAXEJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcgUDbmlsBgMJAAECBQJiVwIGU3RyaW5nBAJiWAUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJiWAUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAVECBlN0cmluZwQCYngFAVEEAXoJAQFYAQUCYngEAmJZBAJiVwUCYlYDCQABAgUCYlcCBFVuaXQJAKIIAQkBAmFxAQkBAmFvAQUBegMJAAECBQJiVwIGU3RyaW5nBAJiWgUCYlcEAmNhCQCiCAEJAQJhdwIJAQJhbwEFAXoFAmJaAwkAAAIFAmNhBQJjYQQCY2IJAPwHBAUEdGhpcwITcHJvY2Vzc1ZvdGVJTlRFUk5BTAkAzAgCBQJieAkAzAgCBQJiWgUDbmlsBQNuaWwDCQAAAgUCY2IFAmNiBQJjYQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yBAJiVwUCYlkDCQABAgUCYlcCBFVuaXQEAmNjCQCiCAEJAQJhdwIFAmFuBQJieAQCY2QFAmNjAwkAAQIFAmNkAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXAFAWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcQkAzAgCCQELRGVsZXRlRW50cnkBBQFyBQNuaWwGAwkAAQIFAmNkAgZTdHJpbmcEAmFJBQJjZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXEFAmFJCQDMCAIJAQtEZWxldGVFbnRyeQEFAXIFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQJiVwIGU3RyaW5nBAJjZQUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFyBQJjZQUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUCYmoFAWUEAmJVCQCiCAEFAXEEAVEFAmJVAwkAAQIFAVECBFVuaXQEAmJXCQCiCAEJAQJhcQEFAmFuAwkAAQIFAmJXAgRVbml0BAJiSAMFAmJJCQDMCAIJAQtEZWxldGVFbnRyeQEFAXAJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdgUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAXAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF4AQUCYlEGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQJiaAUDbmlsCQCUCgIFAmJIBgMJAAECBQJiVwIGU3RyaW5nBAJjZgUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJjZgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAVECBlN0cmluZwQCYngFAVEEAmNjCQCiCAEJAQJhdwIFAmFuBQJieAMJAAACBQJjYwUCY2MEAmJNCgABVQkA/AcEBQR0aGlzAhNwcm9jZXNzUG9vbElOVEVSTkFMCQDMCAIFAmJ4CQDMCAIFAmJJBQNuaWwFA25pbAMJAAECBQFVAgdCb29sZWFuBQFVCQACAQkArAICCQADAQUBVQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJiTQUCYk0DBQJiTQkAlAoCBQNuaWwGBAJiVwUCY2MDCQABAgUCYlcCBFVuaXQEAmJIAwUCYkkJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcAkAzAgCCQELRGVsZXRlRW50cnkBBQF2CQDMCAIJAQtEZWxldGVFbnRyeQEFAXEFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQFwCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBeAEFAmJRBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdAUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdQUCYmgJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcQUDbmlsCQCUCgIFAmJIBgMJAAECBQJiVwIGU3RyaW5nBAJjZgUCYlcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJjZgUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQILTWF0Y2ggZXJyb3IJAAIBAhZmaW5hbGl6YXRpb24gaXMgYnJva2VuAmFNAQ9maW5hbGl6ZVdyYXBwZXIBAmNnBAJjaAoAAVUJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAVUCB0Jvb2xlYW4FAVUJAAIBCQCsAgIJAAMBBQFVAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmNoBQJjaAMJAQEhAQUCY2gDCQAAAgUCY2cAAAkAAgECHkN1cnJlbnQgdm90aW5nIGlzIG5vdCBvdmVyIHlldAkAlAoCBQNuaWwFBHVuaXQEAmNpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWsFAWMDCQBmAgUCY2kFAmNnBAJjagkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgkAZAIFAmNnAAEFA25pbAUDbmlsAwkAAAIFAmNqBQJjagkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQhmaW5hbGl6ZQAEAmNqCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAmNqBQJjagkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BFGNvbnRhaW5zTm9kZVJFQURPTkxZAgJhcgJhdgkAlAoCBQNuaWwJAQJheAIFAmFyBQJhdgJhTQEKaW5zZXJ0Tm9kZQICYXICYXYEAmFRCQECYU4BBQJhTQMJAAACBQJhUQUCYVEJAJQKAgkBAmFCAgUCYXIFAmF2BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQpkZWxldGVOb2RlAgJhcgJhdgQCYVEJAQJhTgEFAmFNAwkAAAIFAmFRBQJhUQkAlAoCCQECYUUCBQJhcgUCYXYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNrAQJjbAAEAmNtBAFRCQECYUgAAwkAAQIFAVECCkJ5dGVWZWN0b3IEAmFPBQFRBQJhTwMJAAECBQFRAgRVbml0CAUCY2sPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmNrCWJvZHlCeXRlcwkAkQMCCAUCY2sGcHJvb2ZzAAAFAmNtgymnFQ==", "height": 2460915, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9wNALryRHbvVdvYgPVX7w4vGaoXZQLuQt8cmdKQu1BjK Next: G69cBD6mnqUvtQv7x1MefQPAEzUQs1WqVk9UUc5gCHkd Diff:
OldNewDifferences
8888 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
8989
9090
91-func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
92-
93-
94-func throwErr (msg) = throw(wrapErr(msg))
95-
96-
9791 func getValueOrFail (address,key,type) = {
9892 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
9993 valueOrErrorMessage( match type {
151145
152146
153147 func checkWxEmissionPoolLabel (pool) = {
154- let $t048434883 = pool
155- let amountAssetId = $t048434883._1
156- let priceAssetId = $t048434883._2
148+ let $t047164756 = pool
149+ let amountAssetId = $t047164756._1
150+ let priceAssetId = $t047164756._2
157151 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
158152 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
159153 if ($isInstanceOf(@, "Boolean"))
165159 let poolsListName = "pools"
166160
167161 func getVotesListName (pool) = {
168- let $t051845224 = pool
169- let amountAssetId = $t051845224._1
170- let priceAssetId = $t051845224._2
162+ let $t050575097 = pool
163+ let amountAssetId = $t050575097._1
164+ let priceAssetId = $t050575097._2
171165 makeString(["votes", amountAssetId, priceAssetId], separator)
172166 }
173167
511505 if ((checkTargetEpoch == checkTargetEpoch))
512506 then {
513507 let pool = stringToPool(poolStr)
514- let $t01767517715 = pool
515- let amountAssetId = $t01767517715._1
516- let priceAssetId = $t01767517715._2
508+ let $t01754817588 = pool
509+ let amountAssetId = $t01754817588._1
510+ let priceAssetId = $t01754817588._2
517511 let wxEmission = checkWxEmissionPoolLabel(pool)
518512 let gwxAmountAtEndTotal = {
519513 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
565559 if ((checkTargetEpoch == checkTargetEpoch))
566560 then {
567561 let pool = stringToPool(poolStr)
568- let $t01944119481 = pool
569- let amountAssetId = $t01944119481._1
570- let priceAssetId = $t01944119481._2
562+ let $t01931419354 = pool
563+ let amountAssetId = $t01931419354._1
564+ let priceAssetId = $t01931419354._2
571565 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
572566 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
573567 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
8080 func keyPoolShare (pool,epoch) = {
8181 let $t024342474 = pool
8282 let amountAssetId = $t024342474._1
8383 let priceAssetId = $t024342474._2
8484 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
8585 }
8686
8787
8888 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
8989
9090
91-func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
92-
93-
94-func throwErr (msg) = throw(wrapErr(msg))
95-
96-
9791 func getValueOrFail (address,key,type) = {
9892 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
9993 valueOrErrorMessage( match type {
10094 case str: String =>
10195 getString(address, key)
10296 case int: Int =>
10397 getInteger(address, key)
10498 case _ =>
10599 throw("invalid entry type")
106100 }, error)
107101 }
108102
109103
110104 func getStrOrFail (address,key) = {
111105 let @ = getValueOrFail(address, key, "")
112106 if ($isInstanceOf(@, "String"))
113107 then @
114108 else throw(($getType(@) + " couldn't be cast to String"))
115109 }
116110
117111
118112 func getIntOrFail (address,key) = {
119113 let @ = getValueOrFail(address, key, 0)
120114 if ($isInstanceOf(@, "Int"))
121115 then @
122116 else throw(($getType(@) + " couldn't be cast to Int"))
123117 }
124118
125119
126120 func poolToString (pool) = ((pool._1 + separator) + pool._2)
127121
128122
129123 func stringToPool (str) = {
130124 let parts = split(str, separator)
131125 if ((size(parts) == 2))
132126 then $Tuple2(parts[0], parts[1])
133127 else throw("invalid pool string")
134128 }
135129
136130
137131 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
138132 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
139133
140134 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
141135
142136 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
143137
144138 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
145139 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
146140 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
147141 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
148142 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
149143 lpAssetId
150144 }
151145
152146
153147 func checkWxEmissionPoolLabel (pool) = {
154- let $t048434883 = pool
155- let amountAssetId = $t048434883._1
156- let priceAssetId = $t048434883._2
148+ let $t047164756 = pool
149+ let amountAssetId = $t047164756._1
150+ let priceAssetId = $t047164756._2
157151 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
158152 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
159153 if ($isInstanceOf(@, "Boolean"))
160154 then @
161155 else throw(($getType(@) + " couldn't be cast to Boolean"))
162156 }
163157
164158
165159 let poolsListName = "pools"
166160
167161 func getVotesListName (pool) = {
168- let $t051845224 = pool
169- let amountAssetId = $t051845224._1
170- let priceAssetId = $t051845224._2
162+ let $t050575097 = pool
163+ let amountAssetId = $t050575097._1
164+ let priceAssetId = $t050575097._2
171165 makeString(["votes", amountAssetId, priceAssetId], separator)
172166 }
173167
174168
175169 func keyListHead (listName) = {
176170 let meta = if ((listName == poolsListName))
177171 then "%s%s"
178172 else "%s%s%s%s"
179173 makeString([meta, listName, "head"], separator)
180174 }
181175
182176
183177 func keyListSize (listName) = {
184178 let meta = if ((listName == poolsListName))
185179 then "%s%s"
186180 else "%s%s%s%s"
187181 makeString([meta, listName, "size"], separator)
188182 }
189183
190184
191185 func keyListPrev (listName,id) = {
192186 let meta = if ((listName == poolsListName))
193187 then "%s%s%s%s"
194188 else "%s%s%s%s%s"
195189 makeString([meta, listName, id, "prev"], separator)
196190 }
197191
198192
199193 func keyListNext (listName,id) = {
200194 let meta = if ((listName == poolsListName))
201195 then "%s%s%s%s"
202196 else "%s%s%s%s%s"
203197 makeString([meta, listName, id, "next"], separator)
204198 }
205199
206200
207201 func containsNode (listName,id) = {
208202 let headOrUnit = getString(this, keyListHead(listName))
209203 let prevOrUnit = getString(this, keyListPrev(listName, id))
210204 let nextOrUnit = getString(this, keyListNext(listName, id))
211205 if (if ((id == valueOrElse(headOrUnit, "")))
212206 then true
213207 else (prevOrUnit != unit))
214208 then true
215209 else (nextOrUnit != unit)
216210 }
217211
218212
219213 func insertNodeActions (listName,id) = {
220214 let headOrUnit = getString(this, keyListHead(listName))
221215 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
222216 let checkNode = if (!(containsNode(listName, id)))
223217 then true
224218 else throw("Node exists")
225219 if ((checkNode == checkNode))
226220 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
227221 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
228222 else nil)) ++ [StringEntry(keyListHead(listName), id)])
229223 else throw("Strict value is not equal to itself.")
230224 }
231225
232226
233227 func deleteNodeActions (listName,id) = {
234228 let headOrUnit = getString(this, keyListHead(listName))
235229 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
236230 let prevOrUnit = getString(this, keyListPrev(listName, id))
237231 let nextOrUnit = getString(this, keyListNext(listName, id))
238232 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
239233 then (nextOrUnit != unit)
240234 else false)
241235 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
242236 else if ((nextOrUnit != unit))
243237 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
244238 else if ((prevOrUnit != unit))
245239 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
246240 else if ((id == valueOrElse(headOrUnit, "")))
247241 then [DeleteEntry(keyListHead(listName))]
248242 else throw(((("invalid node: " + listName) + ".") + id))))
249243 }
250244
251245
252246 func keyManagerPublicKey () = "%s__managerPublicKey"
253247
254248
255249 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
256250
257251
258252 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
259253 case s: String =>
260254 fromBase58String(s)
261255 case _: Unit =>
262256 unit
263257 case _ =>
264258 throw("Match error")
265259 }
266260
267261
268262 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
269263 case s: String =>
270264 fromBase58String(s)
271265 case _: Unit =>
272266 unit
273267 case _ =>
274268 throw("Match error")
275269 }
276270
277271
278272 let permissionDeniedError = throw("Permission denied")
279273
280274 func mustThis (i) = if ((i.caller == this))
281275 then true
282276 else permissionDeniedError
283277
284278
285279 func mustManager (i) = match managerPublicKeyOrUnit() {
286280 case pk: ByteVector =>
287281 if ((i.callerPublicKey == pk))
288282 then true
289283 else permissionDeniedError
290284 case _: Unit =>
291285 mustThis(i)
292286 case _ =>
293287 throw("Match error")
294288 }
295289
296290
297291 @Callable(i)
298292 func setManager (pendingManagerPublicKey) = {
299293 let checkCaller = mustManager(i)
300294 if ((checkCaller == checkCaller))
301295 then {
302296 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
303297 if ((checkManagerPublicKey == checkManagerPublicKey))
304298 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
305299 else throw("Strict value is not equal to itself.")
306300 }
307301 else throw("Strict value is not equal to itself.")
308302 }
309303
310304
311305
312306 @Callable(i)
313307 func confirmManager () = {
314308 let pm = pendingManagerPublicKeyOrUnit()
315309 let hasPM = if (isDefined(pm))
316310 then true
317311 else throw("No pending manager")
318312 if ((hasPM == hasPM))
319313 then {
320314 let checkPM = if ((i.callerPublicKey == value(pm)))
321315 then true
322316 else throw("You are not pending manager")
323317 if ((checkPM == checkPM))
324318 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
325319 else throw("Strict value is not equal to itself.")
326320 }
327321 else throw("Strict value is not equal to itself.")
328322 }
329323
330324
331325
332326 @Callable(i)
333327 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
334328 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
335329 $Tuple2(nil, {
336330 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
337331 if ($isInstanceOf(@, "Int"))
338332 then @
339333 else throw(($getType(@) + " couldn't be cast to Int"))
340334 })
341335 }
342336
343337
344338
345339 @Callable(i)
346340 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
347341 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
348342 then true
349343 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
350344 then true
351345 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
352346 then true
353347 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
354348 then true
355349 else "invalid staking contract address", if ((epochLength > 0))
356350 then true
357351 else throw("invalid epoch length")]
358352 if ((checks == checks))
359353 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
360354 else throw("Strict value is not equal to itself.")
361355 }
362356
363357
364358
365359 @Callable(i)
366360 func create (amountAssetId,priceAssetId) = {
367361 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
368362 then true
369363 else mustManager(i)]
370364 if ((checks == checks))
371365 then {
372366 let pool = $Tuple2(amountAssetId, priceAssetId)
373367 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
374368 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
375369 let startHeightActions = if (currentEpochIsNotDefined)
376370 then {
377371 let epoch = 0
378372 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
379373 }
380374 else nil
381375 $Tuple2((inListActions ++ startHeightActions), unit)
382376 }
383377 else throw("Strict value is not equal to itself.")
384378 }
385379
386380
387381
388382 @Callable(i)
389383 func vote (amountAssetId,priceAssetId,amount) = {
390384 let pool = $Tuple2(amountAssetId, priceAssetId)
391385 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
392386 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
393387 let epochLength = getIntOrFail(this, keyEpochLength)
394388 let endHeight = (startHeight + epochLength)
395389 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
396390 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
397391 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
398392 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
399393 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
400394 let gwxAmountAtEndTotal = {
401395 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
402396 if ($isInstanceOf(@, "Int"))
403397 then @
404398 else throw(($getType(@) + " couldn't be cast to Int"))
405399 }
406400 let available = (gwxAmountAtEndTotal - used)
407401 let newVote = (vote + amount)
408402 let wxEmission = checkWxEmissionPoolLabel(pool)
409403 let checks = [if ((getBoolean(keyInList(pool)) != unit))
410404 then true
411405 else throw("invalid assets"), if ((endHeight > height))
412406 then true
413407 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
414408 then true
415409 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
416410 then true
417411 else throw("you do not have gWX"), if (if ((amount > 0))
418412 then (available >= amount)
419413 else false)
420414 then true
421415 else throw("invalid amount"), if (wxEmission)
422416 then true
423417 else throw("pool hasn't WX_EMISSION label")]
424418 if ((checks == checks))
425419 then {
426420 let votesListName = getVotesListName(pool)
427421 let userAddressStr = toString(i.caller)
428422 let votesListActions = if (containsNode(votesListName, userAddressStr))
429423 then nil
430424 else insertNodeActions(votesListName, userAddressStr)
431425 $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)
432426 }
433427 else throw("Strict value is not equal to itself.")
434428 }
435429
436430
437431
438432 @Callable(i)
439433 func cancelVote (amountAssetId,priceAssetId) = {
440434 let pool = $Tuple2(amountAssetId, priceAssetId)
441435 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
442436 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
443437 let epochLength = getIntOrFail(this, keyEpochLength)
444438 let endHeight = (startHeight + epochLength)
445439 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
446440 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
447441 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
448442 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
449443 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
450444 let checks = [if ((getBoolean(keyInList(pool)) != unit))
451445 then true
452446 else throw("invalid assets"), if ((endHeight > height))
453447 then true
454448 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
455449 then true
456450 else throw("finalization in progress"), if ((vote > 0))
457451 then true
458452 else throw("no vote")]
459453 if ((checks == checks))
460454 then {
461455 let votesListName = getVotesListName(pool)
462456 let userAddressStr = toString(i.caller)
463457 $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)
464458 }
465459 else throw("Strict value is not equal to itself.")
466460 }
467461
468462
469463
470464 @Callable(i)
471465 func setEpochLength (newEpochLength) = {
472466 let checks = [mustManager(i), if ((newEpochLength > 0))
473467 then true
474468 else throw("invalid epoch length")]
475469 if ((checks == checks))
476470 then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
477471 else throw("Strict value is not equal to itself.")
478472 }
479473
480474
481475
482476 @Callable(i)
483477 func setMaxDepth (newMaxDepth) = {
484478 let checks = [mustManager(i), if ((newMaxDepth > 0))
485479 then true
486480 else throw("invalid max depth")]
487481 if ((checks == checks))
488482 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
489483 else throw("Strict value is not equal to itself.")
490484 }
491485
492486
493487
494488 @Callable(i)
495489 func processVoteINTERNAL (poolStr,userAddressStr) = {
496490 let checkCaller = mustThis(i)
497491 if ((checkCaller == checkCaller))
498492 then {
499493 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
500494 let epoch = getIntOrFail(this, keyCurrentEpoch)
501495 let epochPrevious = (epoch - 1)
502496 let epochLength = getIntOrFail(this, keyEpochLength)
503497 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
504498 let endHeight = (startHeight + epochLength)
505499 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
506500 let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
507501 let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
508502 let checkTargetEpoch = if ((epochPrevious >= 0))
509503 then true
510504 else throw("processVoteINTERNAL: invalid previous epoch")
511505 if ((checkTargetEpoch == checkTargetEpoch))
512506 then {
513507 let pool = stringToPool(poolStr)
514- let $t01767517715 = pool
515- let amountAssetId = $t01767517715._1
516- let priceAssetId = $t01767517715._2
508+ let $t01754817588 = pool
509+ let amountAssetId = $t01754817588._1
510+ let priceAssetId = $t01754817588._2
517511 let wxEmission = checkWxEmissionPoolLabel(pool)
518512 let gwxAmountAtEndTotal = {
519513 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
520514 if ($isInstanceOf(@, "Int"))
521515 then @
522516 else throw(($getType(@) + " couldn't be cast to Int"))
523517 }
524518 let gwxAmountAtEndTotalPrevious = {
525519 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
526520 if ($isInstanceOf(@, "Int"))
527521 then @
528522 else throw(($getType(@) + " couldn't be cast to Int"))
529523 }
530524 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
531525 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
532526 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
533527 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
534528 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
535529 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
536530 else 0
537531 let actions = if (if ((newVote > 0))
538532 then wxEmission
539533 else false)
540534 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
541535 else deleteNodeActions(getVotesListName(pool), userAddressStr)
542536 $Tuple2(actions, unit)
543537 }
544538 else throw("Strict value is not equal to itself.")
545539 }
546540 else throw("Strict value is not equal to itself.")
547541 }
548542
549543
550544
551545 @Callable(i)
552546 func processPoolINTERNAL (poolStr,force) = {
553547 let checkCaller = mustThis(i)
554548 if ((checkCaller == checkCaller))
555549 then {
556550 let targetEpoch = {
557551 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
558552 if (force)
559553 then currentEpoch
560554 else (currentEpoch - 1)
561555 }
562556 let checkTargetEpoch = if ((targetEpoch >= 0))
563557 then true
564558 else throw("processPoolINTERNAL: invalid target epoch")
565559 if ((checkTargetEpoch == checkTargetEpoch))
566560 then {
567561 let pool = stringToPool(poolStr)
568- let $t01944119481 = pool
569- let amountAssetId = $t01944119481._1
570- let priceAssetId = $t01944119481._2
562+ let $t01931419354 = pool
563+ let amountAssetId = $t01931419354._1
564+ let priceAssetId = $t01931419354._2
571565 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
572566 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
573567 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
574568 let r = {
575569 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
576570 if ($isInstanceOf(@, "Boolean"))
577571 then @
578572 else throw(($getType(@) + " couldn't be cast to Boolean"))
579573 }
580574 if ((r == r))
581575 then if (r)
582576 then $Tuple2(nil, true)
583577 else {
584578 let wxEmission = checkWxEmissionPoolLabel(pool)
585579 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
586580 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
587581 let share = if (if ((totalVotes == 0))
588582 then true
589583 else !(wxEmission))
590584 then 0
591585 else fraction(votingResult, poolWeightMult, totalVotes)
592586 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
593587 if ((modifyWeightInv == modifyWeightInv))
594588 then {
595589 let poolsListActions = if (if (wxEmission)
596590 then true
597591 else force)
598592 then nil
599593 else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
600594 $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
601595 }
602596 else throw("Strict value is not equal to itself.")
603597 }
604598 else throw("Strict value is not equal to itself.")
605599 }
606600 else throw("Strict value is not equal to itself.")
607601 }
608602 else throw("Strict value is not equal to itself.")
609603 }
610604
611605
612606
613607 @Callable(i)
614608 func finalizeHelper () = {
615609 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
616610 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
617611 let previousEpoch = (epoch - 1)
618612 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
619613 let epochLength = getIntOrFail(this, keyEpochLength)
620614 let endHeight = (startHeight + epochLength)
621615 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
622616 if (if (if ((height >= endHeight))
623617 then (finalizationStageOrUnit == unit)
624618 else false)
625619 then !(force)
626620 else false)
627621 then {
628622 let newEpoch = (epoch + 1)
629623 let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
630624 let newEpochLengthActions = match newEpochLengthOption {
631625 case newEpochLength: Int =>
632626 [IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
633627 case _: Unit =>
634628 nil
635629 case _ =>
636630 throw("Match error")
637631 }
638632 $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
639633 }
640634 else if (if (force)
641635 then (finalizationStageOrUnit == unit)
642636 else false)
643637 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
644638 else if ((finalizationStageOrUnit == unit))
645639 then $Tuple2(nil, false)
646640 else if ((finalizationStageOrUnit == finalizationStageTotal))
647641 then {
648642 let poolOrUnit = getString(keyNextPool)
649643 let userOrUnit = getString(keyNextUser)
650644 match poolOrUnit {
651645 case _: Unit =>
652646 match getString(keyListHead(poolsListName)) {
653647 case _: Unit =>
654648 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
655649 case poolsHeadStr: String =>
656650 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
657651 case _ =>
658652 throw("Match error")
659653 }
660654 case poolStr: String =>
661655 let pool = stringToPool(poolStr)
662656 let nextUserOrUnit = match userOrUnit {
663657 case _: Unit =>
664658 getString(keyListHead(getVotesListName(pool)))
665659 case user: String =>
666660 let next = getString(keyListNext(getVotesListName(pool), user))
667661 if ((next == next))
668662 then {
669663 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
670664 if ((processVoteInv == processVoteInv))
671665 then next
672666 else throw("Strict value is not equal to itself.")
673667 }
674668 else throw("Strict value is not equal to itself.")
675669 case _ =>
676670 throw("Match error")
677671 }
678672 match nextUserOrUnit {
679673 case _: Unit =>
680674 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
681675 match nextPoolOrUnit {
682676 case _: Unit =>
683677 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
684678 case s: String =>
685679 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
686680 case _ =>
687681 throw("Match error")
688682 }
689683 case nextUser: String =>
690684 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
691685 case _ =>
692686 throw("Match error")
693687 }
694688 case _ =>
695689 throw("Match error")
696690 }
697691 }
698692 else if ((finalizationStageOrUnit == finalizationStageShares))
699693 then {
700694 let poolOrUnit = getString(keyNextPool)
701695 match poolOrUnit {
702696 case _: Unit =>
703697 match getString(keyListHead(poolsListName)) {
704698 case _: Unit =>
705699 let actions = if (force)
706700 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
707701 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
708702 $Tuple2(actions, true)
709703 case nextPoolStr: String =>
710704 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
711705 case _ =>
712706 throw("Match error")
713707 }
714708 case poolStr: String =>
715709 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
716710 if ((nextPoolOrUnit == nextPoolOrUnit))
717711 then {
718712 let r = {
719713 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
720714 if ($isInstanceOf(@, "Boolean"))
721715 then @
722716 else throw(($getType(@) + " couldn't be cast to Boolean"))
723717 }
724718 if ((r == r))
725719 then if (r)
726720 then $Tuple2(nil, true)
727721 else match nextPoolOrUnit {
728722 case _: Unit =>
729723 let actions = if (force)
730724 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
731725 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
732726 $Tuple2(actions, true)
733727 case nextPoolStr: String =>
734728 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
735729 case _ =>
736730 throw("Match error")
737731 }
738732 else throw("Strict value is not equal to itself.")
739733 }
740734 else throw("Strict value is not equal to itself.")
741735 case _ =>
742736 throw("Match error")
743737 }
744738 }
745739 else throw("finalization is broken")
746740 }
747741
748742
749743
750744 @Callable(i)
751745 func finalizeWrapper (counter) = {
752746 let result = {
753747 let @ = invoke(this, "finalizeHelper", nil, nil)
754748 if ($isInstanceOf(@, "Boolean"))
755749 then @
756750 else throw(($getType(@) + " couldn't be cast to Boolean"))
757751 }
758752 if ((result == result))
759753 then if (!(result))
760754 then if ((counter == 0))
761755 then throw("Current voting is not over yet")
762756 else $Tuple2(nil, unit)
763757 else {
764758 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
765759 if ((maxDepth > counter))
766760 then {
767761 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
768762 if ((inv == inv))
769763 then $Tuple2(nil, unit)
770764 else throw("Strict value is not equal to itself.")
771765 }
772766 else $Tuple2(nil, unit)
773767 }
774768 else throw("Strict value is not equal to itself.")
775769 }
776770
777771
778772
779773 @Callable(i)
780774 func finalize () = {
781775 let inv = invoke(this, "finalizeWrapper", [0], nil)
782776 if ((inv == inv))
783777 then $Tuple2(nil, unit)
784778 else throw("Strict value is not equal to itself.")
785779 }
786780
787781
788782
789783 @Callable(i)
790784 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
791785
792786
793787
794788 @Callable(i)
795789 func insertNode (listName,id) = {
796790 let checkCaller = mustManager(i)
797791 if ((checkCaller == checkCaller))
798792 then $Tuple2(insertNodeActions(listName, id), unit)
799793 else throw("Strict value is not equal to itself.")
800794 }
801795
802796
803797
804798 @Callable(i)
805799 func deleteNode (listName,id) = {
806800 let checkCaller = mustManager(i)
807801 if ((checkCaller == checkCaller))
808802 then $Tuple2(deleteNodeActions(listName, id), unit)
809803 else throw("Strict value is not equal to itself.")
810804 }
811805
812806
813807 @Verifier(tx)
814808 func verify () = {
815809 let targetPublicKey = match managerPublicKeyOrUnit() {
816810 case pk: ByteVector =>
817811 pk
818812 case _: Unit =>
819813 tx.senderPublicKey
820814 case _ =>
821815 throw("Match error")
822816 }
823817 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
824818 }
825819

github/deemru/w8io/fabc49c 
71.58 ms