tx · FrvySwXJMQWNj9ZAWpHPbmBU6PDj8giXrApxEzReJxhq

3MtBQhYqSeVLpBSMB2jTkb6vs8TrNFFBva3:  -0.01000000 Waves

2022.03.24 16:10 [1978053] smart account 3MtBQhYqSeVLpBSMB2jTkb6vs8TrNFFBva3 > SELF 0.00000000 Waves

{ "type": 13, "id": "FrvySwXJMQWNj9ZAWpHPbmBU6PDj8giXrApxEzReJxhq", "fee": 1000000, "feeAssetId": null, "timestamp": 1648127446114, "version": 2, "chainId": 84, "sender": "3MtBQhYqSeVLpBSMB2jTkb6vs8TrNFFBva3", "senderPublicKey": "3whQBfM1pK9m4zvyAiVKJ1MwGjWb8kqF6CqW4GtFgZxn", "proofs": [ "4t3yfG8G2M3tcYvwVMoXKzewJdBcTtnx4LnZbMS8b5N9Jc6hWpeErrhPURAvfhV6NG5GajmZd53LxNwY4N988ugW" ], "script": "base64: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AAAJd3hBc3NldElkCQACWQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABBQAAAAxrZXlXeEFzc2V0SWQAAAAAD3ZvdGluZ1RocmVzaG9sZAkBAAAAEGdldEludGVnZXJPckZhaWwAAAABBQAAABJrZXlWb3RpbmdUaHJlc2hvbGQAAAAADnZvdGluZ0R1cmF0aW9uCQEAAAAQZ2V0SW50ZWdlck9yRmFpbAAAAAEFAAAAEWtleVZvdGluZ0R1cmF0aW9uAAAAABV2b3RlQmVmb3JlRWxpbWluYXRpb24JAQAAABBnZXRJbnRlZ2VyT3JGYWlsAAAAAQUAAAAYa2V5Vm90ZUJlZm9yZUVsaW1pbmF0aW9uAAAAAAtzdGFydEhlaWdodAkBAAAAEGdldEludGVnZXJPckZhaWwAAAABBQAAAA5rZXlTdGFydEhlaWdodAAAAAANY3VycmVudFBlcmlvZAkBAAAAEGdldEludGVnZXJPckZhaWwAAAABBQAAABBrZXlDdXJyZW50UGVyaW9kAAAAABBib29zdGluZ0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQUAAAATa2V5Qm9vc3RpbmdDb250cmFjdAAAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEFAAAAE2tleUVtaXNzaW9uQ29udHJhY3QAAAAAE2Fzc2V0c1N0b3JlQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABBQAAABZrZXlBc3NldHNTdG9yZUNvbnRyYWN0AAAAAAhtYXhEZXB0aAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABBQAAAAtrZXlNYXhEZXB0aAUAAAAPbWF4RGVwdGhEZWZhdWx0AQAAABhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQAAAACAAAAC3VzZXJBZGRyZXNzAAAADHRhcmdldEhlaWdodAQAAAAJZ3d4QW1vdW50CQAD/AAAAAQFAAAAEGJvb3N0aW5nQ29udHJhY3QCAAAAIGdldFVzZXJH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CQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAEbmV4dAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5TGlzdEhlYWQAAAABBQAAAAhsaXN0TmFtZQkBAAAABXZhbHVlAAAAAQUAAAAEbmV4dAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5TGlzdE5leHQAAAACBQAAAAhsaXN0TmFtZQUAAAACaWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAC2tleUxpc3RQcmV2AAAAAgUAAAAIbGlzdE5hbWUJAQAAAAV2YWx1ZQAAAAEFAAAABG5leHQFAAAAA25pbAMJAQAAAAlpc0RlZmluZWQAAAABBQAAAARwcmV2CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAtrZXlMaXN0UHJldgAAAAIFAAAACGxpc3ROYW1lBQAAAAJpZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5TGlzdE5leHQAAAACBQAAAAhsaXN0TmFtZQkBAAAABXZhbHVlAAAAAQUAAAAEcHJldgUAAAADbmlsAwkAAAAAAAACBQAAAAJpZAUAAAAEaGVhZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5TGlzdEhlYWQAAAABBQAAAAhsaXN0TmFtZQUAAAADbmlsCQAAAgAAAAECAAAADEludmFsaWQgbm9kZQEAAAALcHJvY2Vzc1ZvdGUAAAAEAAAAB2Fzc2V0SWQAAAARdXNlckFkZHJlc3NPclVuaXQAAAAXbGF0ZXN0UHJvY2Vzc2VkQXNzZXRLZXkAAAAWbGF0ZXN0UHJvY2Vzc2VkVXNlcktleQQAAAAgdXBkYXRlTGF0ZXN0UHJvY2Vzc2VkQXNzZXRBY3Rpb24JAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAF2xhdGVzdFByb2Nlc3NlZEFzc2V0S2V5BQAAAAdhc3NldElkBAAAAB9kZWxldGVMYXRlc3RQcm9jZXNzZWRVc2VyQWN0aW9uCQEAAAALRGVsZXRlRW50cnkAAAABBQAAABZsYXRlc3RQcm9jZXNzZWRVc2VyS2V5AwkAAAAAAAACBQAAABF1c2VyQWRkcmVzc09yVW5pdAUAAAAEdW5pdAkABEwAAAACBQAAACB1cGRhdGVMYXRlc3RQcm9jZXNzZWRBc3NldEFjdGlvbgkABEwAAAACBQAAAB9kZWxldGVMYXRlc3RQcm9jZXNzZWRVc2VyQWN0aW9uBQAAAANuaWwEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAUAAAAOdm90aW5nRHVyYXRpb24EAAAAC3VzZXJBZGRyZXNzCQEAAAAFdmFsdWUAAAABBQAAABF1c2VyQWRkcmVzc09yVW5pdAQAAAAfdXBkYXRlTGF0ZXN0UHJvY2Vzc2VkVXNlckFjdGlvbgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAWbGF0ZXN0UHJvY2Vzc2VkVXNlcktleQUAAAALdXNlckFkZHJlc3MEAAAAC3VzZXJWb3RlS2V5CQEAAAATa2V5VXNlclZvdGVCeVBlcmlvZAAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAdhc3NldElkBQAAAA1jdXJyZW50UGVyaW9kBAAAAA51c2VyVm90ZU9yVW5pdAkABCIAAAABBQAAAAt1c2VyVm90ZUtleQQAAAAYdXNlckd3eEFtb3VudEF0RW5kSGVpZ2h0CQEAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0AAAAAgUAAAALdXNlckFkZHJlc3MFAAAACWVuZEhlaWdodAQAAAALdm90ZUFjdGlvbnMDCQAAAAAAAAIFAAAAGHVzZXJHd3hBbW91bnRBdEVuZEhlaWdodAAAAAAAAAAAAAQAAAANdm90ZXNMaXN0TmFtZQkBAAAAEGdldFZvdGVzTGlzdE5hbWUAAAABBQAAAAdhc3NldElkCQEAAAAKZGVsZXRlTm9kZQAAAAIFAAAADXZvdGVzTGlzdE5hbWUFAAAAC3VzZXJBZGRyZXNzAwkAAAAAAAACBQAAAA51c2VyVm90ZU9yVW5pdAUAAAAEdW5pdAQAAAAWdXNlclByZXZpb3VzVm90ZU9yVW5pdAkABCIAAAABCQEAAAATa2V5VXNlclZvdGVCeVBlcmlvZAAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAdhc3NldElkCQAAZQAAAAIFAAAADWN1cnJlbnRQZXJpb2QAAAAAAAAAAAEDCQAAAAAAAAIFAAAAFnVzZXJQcmV2aW91c1ZvdGVPclVuaXQFAAAABHVuaXQFAAAAA25pbAQAAAALJHQwOTM4NTk0NTgJAQAAAA1wYXJzZVVzZXJWb3RlAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAWdXNlclByZXZpb3VzVm90ZU9yVW5pdAQAAAAJcHJldlRvdGFsCAUAAAALJHQwOTM4NTk0NTgAAAACXzEEAAAAB2luRmF2b3IIBQAAAAskdDA5Mzg1OTQ1OAAAAAJfMgQAAAAFdG90YWwJAAGXAAAAAQkABEwAAAACBQAAAAlwcmV2VG90YWwJAARMAAAAAgUAAAAYdXNlckd3eEFtb3VudEF0RW5kSGVpZ2h0BQAAAANuaWwJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAALdXNlclZvdGVLZXkJAQAAAA5mb3JtYXRVc2VyVm90ZQAAAAIFAAAABXRvdGFsBQAAAAdpbkZhdm9yCQAETAAAAAIJAQAAABNnZXRWb3RlUmVzdWx0QWN0aW9uAAAABAUAAAAHYXNzZXRJZAUAAAAFdG90YWwFAAAAB2luRmF2b3IFAAAADWN1cnJlbnRQZXJpb2QFAAAAA25pbAUAAAADbmlsCQAETQAAAAIJAARNAAAAAgUAAAALdm90ZUFjdGlvbnMFAAAAIHVwZGF0ZUxhdGVzdFByb2Nlc3NlZEFzc2V0QWN0aW9uBQAAAB91cGRhdGVMYXRlc3RQcm9jZXNzZWRVc2VyQWN0aW9uAQAAABdhc3NldFNob3VsZEJlRWxpbWluYXRlZAAAAAIAAAAHYXNzZXRJZAAAAAZwZXJpb2QJAQAAAAEhAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABCAAAAABCQEAAAAYa2V5QXNzZXRWZXJpZmllZEJ5UGVyaW9kAAAAAgUAAAAHYXNzZXRJZAUAAAAGcGVyaW9kBgEAAAAQZWxpbWluYXRpb25DaGVjawAAAAEAAAAHYXNzZXRJZAMDAwkBAAAAF2Fzc2V0U2hvdWxkQmVFbGltaW5hdGVkAAAAAgUAAAAHYXNzZXRJZAUAAAANY3VycmVudFBlcmlvZAkBAAAAF2Fzc2V0U2hvdWxkQmVFbGltaW5hdGVkAAAAAgUAAAAHYXNzZXRJZAkAAGUAAAACBQAAAA1jdXJyZW50UGVyaW9kAAAAAAAAAAABBwkBAAAAF2Fzc2V0U2hvdWxkQmVFbGltaW5hdGVkAAAAAgUAAAAHYXNzZXRJZAkAAGUAAAACBQAAAA1jdXJyZW50UGVyaW9kAAAAAAAAAAACBwkBAAAAF2Fzc2V0U2hvdWxkQmVFbGltaW5hdGVkAAAAAgUAAAAHYXNzZXRJZAkAAGUAAAACBQAAAA1jdXJyZW50UGVyaW9kAAAAAAAAAAADBwAAAA4AAAABaQEAAAALY29uc3RydWN0b3IAAAAKAAAAE2Jvb3N0aW5nQ29udHJhY3RQcm0AAAATZW1pc3Npb25Db250cmFjdFBybQAAABZhc3NldHNTdG9yZUNvbnRyYWN0UHJtAAAADGZlZUFtb3VudFBybQAAAAx3eEFzc2V0SWRQcm0AAAASdm90aW5nVGhyZXNob2xkUHJtAAAAEXZvdGluZ0R1cmF0aW9uUHJtAAAAGHZvdGVCZWZvcmVFbGltaW5hdGlvblBybQAAAA5zdGFydEhlaWdodFBybQAAAAttYXhEZXB0aFBybQQAAAAGY2hlY2tzCQAETAAAAAIJAQAAAAh0aGlzT25seQAAAAEFAAAAAWkJAARMAAAAAgMJAQAAAAlpc0RlZmluZWQAAAABCQAEJgAAAAEFAAAAE2Jvb3N0aW5nQ29udHJhY3RQcm0GCQAAAgAAAAECAAAAIUludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkABEwAAAACAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQmAAAAAQUAAAATZW1pc3Npb25Db250cmFjdFBybQYJAAACAAAAAQIAAAAhSW52YWxpZCBlbWlzc2lvbiBjb250cmFjdCBhZGRyZXNzCQAETAAAAAIDCQEAAAAJaXNEZWZpbmVkAAAAAQkABCYAAAABBQAAABZhc3NldHNTdG9yZUNvbnRyYWN0UHJtBgkAAAIAAAABAgAAACRJbnZhbGlkIGFzc2V0X3N0b3JlIGNvbnRyYWN0IGFkZHJlc3MJAARMAAAAAgMJAABnAAAAAgUAAAAMZmVlQW1vdW50UHJtAAAAAAAAAAAABgkAAAIAAAABAgAAABJJbnZhbGlkIGZlZSBhbW91bnQJAARMAAAAAgMJAQAAAAlpc0RlZmluZWQAAAABCQAD7AAAAAEJAAJZAAAAAQUAAAAMd3hBc3NldElkUHJtBgkAAAIAAAABAgAAABNJbnZhbGlkIFdYIGFzc2V0IElECQAETAAAAAIDCQAAZwAAAAIFAAAAEnZvdGluZ1RocmVzaG9sZFBybQAAAAAAAAAAAAYJAAACAAAAAQIAAAAYSW52YWxpZCB2b3RpbmcgdGhyZXNob2xkCQAETAAAAAIDCQAAZgAAAAIFAAAAEXZvdGluZ0R1cmF0aW9uUHJtAAAAAAAAAAAABgkAAAIAAAABAgAAABdJbnZhbGlkIHZvdGluZyBkdXJhdGlvbgkABEwAAAACAwkAAGYAAAACCQAAZAAAAAIFAAAADnN0YXJ0SGVpZ2h0UHJtBQAAABF2b3RpbmdEdXJhdGlvblBybQUAAAAGaGVpZ2h0BgkAAAIAAAABAgAAABRJbnZhbGlkIHN0YXJ0IGhlaWdodAUAAAADbmlsAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAE2tleUJvb3N0aW5nQ29udHJhY3QFAAAAE2Jvb3N0aW5nQ29udHJhY3RQcm0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAATa2V5RW1pc3Npb25Db250cmFjdAUAAAATZW1pc3Npb25Db250cmFjdFBybQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABZrZXlBc3NldHNTdG9yZUNvbnRyYWN0BQAAABZhc3NldHNTdG9yZUNvbnRyYWN0UHJtCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrZXlGZWVBbW91bnQFAAAADGZlZUFtb3VudFBybQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAxrZXlXeEFzc2V0SWQFAAAADHd4QXNzZXRJZFBybQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa2V5Vm90aW5nVGhyZXNob2xkBQAAABJ2b3RpbmdUaHJlc2hvbGRQcm0JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtleVZvdGluZ0R1cmF0aW9uBQAAABF2b3RpbmdEdXJhdGlvblBybQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAYa2V5Vm90ZUJlZm9yZUVsaW1pbmF0aW9uBQAAABh2b3RlQmVmb3JlRWxpbWluYXRpb25Qcm0JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAA5zdGFydEhlaWdodFBybQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQa2V5Q3VycmVudFBlcmlvZAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5TWF4RGVwdGgFAAAAC21heERlcHRoUHJtBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAB3N1Z2dlc3QAAAACAAAAB2Fzc2V0SWQAAAAKYXNzZXRJbWFnZQQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEJAAJZAAAAAQUAAAAHYXNzZXRJZAIAAAAQSW52YWxpZCBhc3NldCBJRAQAAAAHcGF5bWVudAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAGY2hlY2tzCQAETAAAAAIDCQAAAAAAAAIIBQAAAARpbmZvAAAABmlzc3VlcggFAAAAAWkAAAAGY2FsbGVyBgkAAAIAAAABAgAAAClBc3NldCBjYW4gb25seSBiZSBzdWdnZXN0ZWQgYnkgaXRzIGlzc3VlcgkABEwAAAACAwkAAAAAAAACCQEAAAAFdmFsdWUAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAl3eEFzc2V0SWQGCQAAAgAAAAECAAAAEUludmFsaWQgZmVlIGFzc2V0CQAETAAAAAIDCQAAAAAAAAIIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAJZmVlQW1vdW50BgkAAAIAAAABAgAAABJJbnZhbGlkIGZlZSBhbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAAHGFzc2V0c1N0b3JlQ3JlYXRlT3JVcGRhdGVJbnYJAAP8AAAABAUAAAATYXNzZXRzU3RvcmVDb250cmFjdAIAAAAOY3JlYXRlT3JVcGRhdGUJAARMAAAAAgUAAAAHYXNzZXRJZAkABEwAAAACAgAAAAAJAARMAAAAAgUAAAAKYXNzZXRJbWFnZQkABEwAAAACBwUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAHGFzc2V0c1N0b3JlQ3JlYXRlT3JVcGRhdGVJbnYFAAAAHGFzc2V0c1N0b3JlQ3JlYXRlT3JVcGRhdGVJbnYEAAAACmJ1cm5GZWVJbnYJAAP8AAAABAUAAAAQZW1pc3Npb25Db250cmFjdAIAAAAEYnVybgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAKYnVybkZlZUludgUAAAAKYnVybkZlZUludgQAAAAPYWRkQXNzZXRBY3Rpb25zCQEAAAAKaW5zZXJ0Tm9kZQAAAAIFAAAADmFzc2V0c0xpc3ROYW1lBQAAAAdhc3NldElkCQAFFAAAAAIJAARNAAAAAgUAAAAPYWRkQXNzZXRBY3Rpb25zCQEAAAATZ2V0Vm90ZVJlc3VsdEFjdGlvbgAAAAQFAAAAB2Fzc2V0SWQAAAAAAAAAAAAGBQAAAA1jdXJyZW50UGVyaW9kBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABHZvdGUAAAACAAAAB2Fzc2V0SWQAAAAHaW5GYXZvcgQAAAAJZW5kSGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAA52b3RpbmdEdXJhdGlvbgQAAAAKY2hlY2tBc3NldAMJAQAAAAxjb250YWluc05vZGUAAAACBQAAAA5hc3NldHNMaXN0TmFtZQUAAAAHYXNzZXRJZAYJAAACAAAAAQIAAAANSW52YWxpZCBhc3NldAMJAAAAAAAAAgUAAAAKY2hlY2tBc3NldAUAAAAKY2hlY2tBc3NldAQAAAALY2hlY2tIZWlnaHQDCQAAZgAAAAIFAAAACWVuZEhlaWdodAUAAAAGaGVpZ2h0BgkAAAIAAAABAgAAADRDdXJyZW50IHZvdGluZyBpcyBvdmVyIGJ1dCByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwkAAAAAAAACBQAAAAtjaGVja0hlaWdodAUAAAALY2hlY2tIZWlnaHQEAAAAC3VzZXJBZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAOZ3d4QW1vdW50QXRFbmQJAQAAABhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAAJZW5kSGVpZ2h0BAAAABNjaGVja0d3eEFtb3VudEF0RW5kAwkAAGYAAAACBQAAAA5nd3hBbW91bnRBdEVuZAAAAAAAAAAAAAYJAAACAAAAAQIAAAAoWW91J2xsIG5vdCBoYXZlIGdXWCBhdCB0aGUgZW5kIG9mIHZvdGluZwMJAAAAAAAAAgUAAAATY2hlY2tHd3hBbW91bnRBdEVuZAUAAAATY2hlY2tHd3hBbW91bnRBdEVuZAQAAAANdm90ZXNMaXN0TmFtZQkBAAAAEGdldFZvdGVzTGlzdE5hbWUAAAABBQAAAAdhc3NldElkBAAAAAt1c2VyVm90ZUtleQkBAAAAE2tleVVzZXJWb3RlQnlQZXJpb2QAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAHYXNzZXRJZAUAAAANY3VycmVudFBlcmlvZAQAAAAPdXNlclZvdGVBY3Rpb25zCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAC3VzZXJWb3RlS2V5CQEAAAAOZm9ybWF0VXNlclZvdGUAAAACBQAAAA5nd3hBbW91bnRBdEVuZAUAAAAHaW5GYXZvcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5VXNlclZvdGVIaXN0b3J5AAAABQIAAAAEdm90ZQUAAAALdXNlckFkZHJlc3MFAAAAB2Fzc2V0SWQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAANY3VycmVudFBlcmlvZAkBAAAADmZvcm1hdFVzZXJWb3RlAAAAAgUAAAAOZ3d4QW1vdW50QXRFbmQFAAAAB2luRmF2b3IJAARMAAAAAgkBAAAAE2dldFZvdGVSZXN1bHRBY3Rpb24AAAAEBQAAAAdhc3NldElkBQAAAA5nd3hBbW91bnRBdEVuZAUAAAAHaW5GYXZvcgUAAAANY3VycmVudFBlcmlvZAUAAAADbmlsBAAAABB2b3Rlc0xpc3RBY3Rpb25zAwkBAAAADGNvbnRhaW5zTm9kZQAAAAIFAAAADXZvdGVzTGlzdE5hbWUFAAAAC3VzZXJBZGRyZXNzBQAAAANuaWwJAQAAAAppbnNlcnROb2RlAAAAAgUAAAANdm90ZXNMaXN0TmFtZQUAAAALdXNlckFkZHJlc3MJAAUUAAAAAgkABE4AAAACBQAAABB2b3Rlc0xpc3RBY3Rpb25zBQAAAA91c2VyVm90ZUFjdGlvbnMFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKY2FuY2VsVm90ZQAAAAEAAAAHYXNzZXRJZAQAAAALdXNlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA12b3Rlc0xpc3ROYW1lCQEAAAAQZ2V0Vm90ZXNMaXN0TmFtZQAAAAEFAAAAB2Fzc2V0SWQEAAAAC3VzZXJWb3RlS2V5CQEAAAATa2V5VXNlclZvdGVCeVBlcmlvZAAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAdhc3NldElkBQAAAA1jdXJyZW50UGVyaW9kBAAAAA51c2VyVm90ZU9yVW5pdAkABCIAAAABBQAAAAt1c2VyVm90ZUtleQQAAAAJY2hlY2tWb3RlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEIgAAAAEFAAAAC3VzZXJWb3RlS2V5AgAAABFOb3RoaW5nIHRvIGNhbmNlbAMJAAAAAAAAAgUAAAAJY2hlY2tWb3RlBQAAAAljaGVja1ZvdGUEAAAADSR0MDE0NjA5MTQ2NzAJAQAAAA1wYXJzZVVzZXJWb3RlAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAOdXNlclZvdGVPclVuaXQEAAAABXRvdGFsCAUAAAANJHQwMTQ2MDkxNDY3MAAAAAJfMQQAAAAHaW5GYXZvcggFAAAADSR0MDE0NjA5MTQ2NzAAAAACXzIEAAAAEHZvdGVzTGlzdEFjdGlvbnMJAQAAAApkZWxldGVOb2RlAAAAAgUAAAANdm90ZXNMaXN0TmFtZQUAAAALdXNlckFkZHJlc3MEAAAAD3VzZXJWb3RlQWN0aW9ucwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAt1c2VyVm90ZUtleQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5VXNlclZvdGVIaXN0b3J5AAAABQIAAAAKY2FuY2VsVm90ZQUAAAALdXNlckFkZHJlc3MFAAAAB2Fzc2V0SWQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAANY3VycmVudFBlcmlvZAkBAAAADmZvcm1hdFVzZXJWb3RlAAAAAgAAAAAAAAAAAAYJAARMAAAAAgkBAAAAE2dldFZvdGVSZXN1bHRBY3Rpb24AAAAEBQAAAAdhc3NldElkCQEAAAABLQAAAAEFAAAABXRvdGFsBQAAAAdpbkZhdm9yBQAAAA1jdXJyZW50UGVyaW9kBQAAAANuaWwJAAUUAAAAAgkABE4AAAACBQAAABB2b3Rlc0xpc3RBY3Rpb25zBQAAAA91c2VyVm90ZUFjdGlvbnMFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFWZpbmFsaXplQXNzZXRJTlRFUk5BTAAAAAIAAAAHYXNzZXRJZAAAAAZwZXJpb2QEAAAAC2NoZWNrQ2FsbGVyCQEAAAAIdGhpc09ubHkAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAADXZvdGVSZXN1bHRLZXkJAQAAABVrZXlWb3RlUmVzdWx0QnlQZXJpb2QAAAACBQAAAAdhc3NldElkBQAAAAZwZXJpb2QEAAAADSR0MDE1MzI0MTU0NTYEAAAAByRtYXRjaDAJAAQiAAAAAQUAAAANdm90ZVJlc3VsdEtleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQEAAAAPcGFyc2VWb3RlUmVzdWx0AAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAkABRQAAAACAAAAAAAAAAAAAAAAAAAAAAAACQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAAh0b3RhbFllcwgFAAAADSR0MDE1MzI0MTU0NTYAAAACXzEEAAAAB3RvdGFsTm8IBQAAAA0kdDAxNTMyNDE1NDU2AAAAAl8yBAAAAAV0b3RhbAkAAGQAAAACBQAAAAh0b3RhbFllcwUAAAAHdG90YWxObwQAAAAIdmVyaWZpZWQDCQAAZwAAAAIFAAAABXRvdGFsBQAAAA92b3RpbmdUaHJlc2hvbGQJAABmAAAAAgUAAAAIdG90YWxZZXMFAAAAB3RvdGFsTm8HBAAAABNhc3NldFZlcmlmaWVkQWN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAYa2V5QXNzZXRWZXJpZmllZEJ5UGVyaW9kAAAAAgUAAAAHYXNzZXRJZAUAAAAGcGVyaW9kBQAAAAh2ZXJpZmllZAUAAAADbmlsBAAAABlhc3NldHNTdG9yZVNldFZlcmlmaWVkSW52CQAD/AAAAAQFAAAAE2Fzc2V0c1N0b3JlQ29udHJhY3QCAAAAC3NldFZlcmlmaWVkCQAETAAAAAIFAAAAB2Fzc2V0SWQJAARMAAAAAgUAAAAIdmVyaWZpZWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABlhc3NldHNTdG9yZVNldFZlcmlmaWVkSW52BQAAABlhc3NldHNTdG9yZVNldFZlcmlmaWVkSW52BAAAAAllbGltaW5hdGUJAQAAABBlbGltaW5hdGlvbkNoZWNrAAAAAQUAAAAHYXNzZXRJZAQAAAARdm90ZVJlc3VsdEFjdGlvbnMDBQAAAAllbGltaW5hdGUFAAAAA25pbAkABEwAAAACCQEAAAATZ2V0Vm90ZVJlc3VsdEFjdGlvbgAAAAQFAAAAB2Fzc2V0SWQAAAAAAAAAAAAGCQAAZAAAAAIFAAAADWN1cnJlbnRQZXJpb2QAAAAAAAAAAAEFAAAAA25pbAQAAAAQdm90ZXNMaXN0QWN0aW9ucwMFAAAACWVsaW1pbmF0ZQkBAAAACmRlbGV0ZU5vZGUAAAACBQAAAA5hc3NldHNMaXN0TmFtZQUAAAAHYXNzZXRJZAUAAAADbmlsCQAFFAAAAAIJAAROAAAAAgkABE4AAAACBQAAABB2b3Rlc0xpc3RBY3Rpb25zBQAAABF2b3RlUmVzdWx0QWN0aW9ucwUAAAATYXNzZXRWZXJpZmllZEFjdGlvbgUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFGZpbmFsaXplVm90aW5nSGVscGVyAAAAAAQAAAAJZW5kSGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAA52b3RpbmdEdXJhdGlvbgMJAABmAAAAAgUAAAAJZW5kSGVpZ2h0BQAAAAZoZWlnaHQJAAUUAAAAAgUAAAADbmlsBwQAAAAabGF0ZXN0UHJvY2Vzc2VkQXNzZXRPclVuaXQJAAQiAAAAAQUAAAAXa2V5TGF0ZXN0UHJvY2Vzc2VkQXNzZXQEAAAAGWxhdGVzdFByb2Nlc3NlZFVzZXJPclVuaXQJAAQiAAAAAQUAAAAWa2V5TGF0ZXN0UHJvY2Vzc2VkVXNlcgQAAAAPbmV4dFBlcmlvZERlbGF5AAAAAAAAAAAABAAAAAZmaW5pc2gJAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOa2V5U3RhcnRIZWlnaHQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAA9uZXh0UGVyaW9kRGVsYXkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEGtleUN1cnJlbnRQZXJpb2QJAABkAAAAAgUAAAANY3VycmVudFBlcmlvZAAAAAAAAAAAAQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAABdrZXlMYXRlc3RQcm9jZXNzZWRBc3NldAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAABZrZXlMYXRlc3RQcm9jZXNzZWRVc2VyCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAH2tleUxhdGVzdFByb2Nlc3NlZEFzc2V0VHJhbnNmZXIJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAea2V5TGF0ZXN0UHJvY2Vzc2VkVXNlclRyYW5zZmVyBQAAAANuaWwGAwkAAAAAAAACBQAAABpsYXRlc3RQcm9jZXNzZWRBc3NldE9yVW5pdAUAAAAEdW5pdAQAAAAQYXNzZXRzSGVhZE9yVW5pdAkABCIAAAABCQEAAAALa2V5TGlzdEhlYWQAAAABBQAAAA5hc3NldHNMaXN0TmFtZQMJAAAAAAAAAgUAAAAQYXNzZXRzSGVhZE9yVW5pdAUAAAAEdW5pdAUAAAAGZmluaXNoBAAAAAVhc3NldAkBAAAABXZhbHVlAAAAAQUAAAAQYXNzZXRzSGVhZE9yVW5pdAQAAAARdXNlckFkZHJlc3NPclVuaXQJAAQiAAAAAQkBAAAAC2tleUxpc3RIZWFkAAAAAQkBAAAAEGdldFZvdGVzTGlzdE5hbWUAAAABBQAAAAVhc3NldAQAAAAScHJvY2Vzc1ZvdGVBY3Rpb25zCQEAAAALcHJvY2Vzc1ZvdGUAAAAEBQAAAAVhc3NldAUAAAARdXNlckFkZHJlc3NPclVuaXQFAAAAF2tleUxhdGVzdFByb2Nlc3NlZEFzc2V0BQAAABZrZXlMYXRlc3RQcm9jZXNzZWRVc2VyCQAFFAAAAAIFAAAAEnByb2Nlc3NWb3RlQWN0aW9ucwYEAAAAFGxhdGVzdFByb2Nlc3NlZEFzc2V0CQEAAAAFdmFsdWUAAAABBQAAABpsYXRlc3RQcm9jZXNzZWRBc3NldE9yVW5pdAMJAAAAAAAAAgUAAAAZbGF0ZXN0UHJvY2Vzc2VkVXNlck9yVW5pdAUAAAAEdW5pdAQAAAALYXNzZXRPclVuaXQJAAQiAAAAAQkBAAAAC2tleUxpc3ROZXh0AAAAAgUAAAAOYXNzZXRzTGlzdE5hbWUFAAAAFGxhdGVzdFByb2Nlc3NlZEFzc2V0AwkAAAAAAAACBQAAAAthc3NldE9yVW5pdAUAAAALYXNzZXRPclVuaXQEAAAAEGZpbmFsaXplQXNzZXRJbnYJAAP8AAAABAUAAAAEdGhpcwIAAAAVZmluYWxpemVBc3NldElOVEVSTkFMCQAETAAAAAIFAAAAFGxhdGVzdFByb2Nlc3NlZEFzc2V0CQAETAAAAAIFAAAADWN1cnJlbnRQZXJpb2QFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABBmaW5hbGl6ZUFzc2V0SW52BQAAABBmaW5hbGl6ZUFzc2V0SW52AwkAAAAAAAACBQAAAAthc3NldE9yVW5pdAUAAAAEdW5pdAUAAAAGZmluaXNoBAAAAAVhc3NldAkBAAAABXZhbHVlAAAAAQUAAAALYXNzZXRPclVuaXQEAAAAEXVzZXJBZGRyZXNzT3JVbml0CQAEIgAAAAEJAQAAAAtrZXlMaXN0SGVhZAAAAAEJAQAAABBnZXRWb3Rlc0xpc3ROYW1lAAAAAQUAAAAFYXNzZXQEAAAAEnByb2Nlc3NWb3RlQWN0aW9ucwkBAAAAC3Byb2Nlc3NWb3RlAAAABAUAAAAFYXNzZXQFAAAAEXVzZXJBZGRyZXNzT3JVbml0BQAAABdrZXlMYXRlc3RQcm9jZXNzZWRBc3NldAUAAAAWa2V5TGF0ZXN0UHJvY2Vzc2VkVXNlcgkABRQAAAACBQAAABJwcm9jZXNzVm90ZUFjdGlvbnMGCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAAAAE2xhdGVzdFByb2Nlc3NlZFVzZXIJAQAAAAV2YWx1ZQAAAAEFAAAAGWxhdGVzdFByb2Nlc3NlZFVzZXJPclVuaXQEAAAAEXVzZXJBZGRyZXNzT3JVbml0CQAEIgAAAAEJAQAAAAtrZXlMaXN0TmV4dAAAAAIJAQAAABBnZXRWb3Rlc0xpc3ROYW1lAAAAAQUAAAAUbGF0ZXN0UHJvY2Vzc2VkQXNzZXQFAAAAE2xhdGVzdFByb2Nlc3NlZFVzZXIEAAAAEnByb2Nlc3NWb3RlQWN0aW9ucwkBAAAAC3Byb2Nlc3NWb3RlAAAABAUAAAAUbGF0ZXN0UHJvY2Vzc2VkQXNzZXQFAAAAEXVzZXJBZGRyZXNzT3JVbml0BQAAABdrZXlMYXRlc3RQcm9jZXNzZWRBc3NldAUAAAAWa2V5TGF0ZXN0UHJvY2Vzc2VkVXNlcgkABRQAAAACBQAAABJwcm9jZXNzVm90ZUFjdGlvbnMGAAAAAWkBAAAAFWZpbmFsaXplVm90aW5nV3JhcHBlcgAAAAEAAAAHY291bnRlcgQAAAAGcmVzdWx0CQEAAAAGYXNCb29sAAAAAQkAA/wAAAAEBQAAAAR0aGlzAgAAABRmaW5hbGl6ZVZvdGluZ0hlbHBlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0AwkBAAAAASEAAAABBQAAAAZyZXN1bHQDCQAAAAAAAAIFAAAAB2NvdW50ZXIAAAAAAAAAAAAJAAACAAAAAQIAAAAeQ3VycmVudCB2b3RpbmcgaXMgbm90IG92ZXIgeWV0CQAFFAAAAAIFAAAAA25pbAUAAAAEdW5pdAMJAABmAAAAAgUAAAAIbWF4RGVwdGgFAAAAB2NvdW50ZXIEAAAAA2ludgkAA/wAAAAEBQAAAAR0aGlzAgAAABVmaW5hbGl6ZVZvdGluZ1dyYXBwZXIJAARMAAAAAgkAAGQAAAACBQAAAAdjb3VudGVyAAAAAAAAAAABBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAADaW52BQAAAANpbnYJAAUUAAAAAgUAAAADbmlsBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkABRQAAAACBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmZpbmFsaXplVm90aW5nAAAAAAQAAAADaW52CQAD/AAAAAQFAAAABHRoaXMCAAAAFWZpbmFsaXplVm90aW5nV3JhcHBlcgkABEwAAAACAAAAAAAAAAAABQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAADaW52BQAAAANpbnYJAAUUAAAAAgUAAAADbmlsBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABN0cmFuc2ZlclZvdGVzSGVscGVyAAAAAAQAAAAYdm90ZXNUcmFuc2ZlckZpbmlzaGVkS2V5CQEAAAAga2V5Vm90ZXNUcmFuc2ZlckZpbmlzaGVkQnlQZXJpb2QAAAABBQAAAA1jdXJyZW50UGVyaW9kBAAAABV2b3Rlc1RyYW5zZmVyRmluaXNoZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQgAAAAAQUAAAAYdm90ZXNUcmFuc2ZlckZpbmlzaGVkS2V5BwQAAAAJZW5kSGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAA52b3RpbmdEdXJhdGlvbgMDAwkAAGYAAAACBQAAAAtzdGFydEhlaWdodAUAAAAGaGVpZ2h0BgkAAGcAAAACBQAAAAZoZWlnaHQFAAAACWVuZEhlaWdodAYFAAAAFXZvdGVzVHJhbnNmZXJGaW5pc2hlZAkABRQAAAACBQAAAANuaWwHBAAAABpsYXRlc3RQcm9jZXNzZWRBc3NldE9yVW5pdAkABCIAAAABBQAAAB9rZXlMYXRlc3RQcm9jZXNzZWRBc3NldFRyYW5zZmVyBAAAABlsYXRlc3RQcm9jZXNzZWRVc2VyT3JVbml0CQAEIgAAAAEFAAAAHmtleUxhdGVzdFByb2Nlc3NlZFVzZXJUcmFuc2ZlcgQAAAAGZmluaXNoCQAFFAAAAAIJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAGHZvdGVzVHJhbnNmZXJGaW5pc2hlZEtleQYJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAfa2V5TGF0ZXN0UHJvY2Vzc2VkQXNzZXRUcmFuc2ZlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAB5rZXlMYXRlc3RQcm9jZXNzZWRVc2VyVHJhbnNmZXIFAAAAA25pbAYDCQAAAAAAAAIFAAAAGmxhdGVzdFByb2Nlc3NlZEFzc2V0T3JVbml0BQAAAAR1bml0BAAAABBhc3NldHNIZWFkT3JVbml0CQAEIgAAAAEJAQAAAAtrZXlMaXN0SGVhZAAAAAEFAAAADmFzc2V0c0xpc3ROYW1lAwkAAAAAAAACBQAAABBhc3NldHNIZWFkT3JVbml0BQAAAAR1bml0BQAAAAZmaW5pc2gEAAAABWFzc2V0CQEAAAAFdmFsdWUAAAABBQAAABBhc3NldHNIZWFkT3JVbml0BAAAABF1c2VyQWRkcmVzc09yVW5pdAkABCIAAAABCQEAAAALa2V5TGlzdEhlYWQAAAABCQEAAAAQZ2V0Vm90ZXNMaXN0TmFtZQAAAAEFAAAABWFzc2V0BAAAABJwcm9jZXNzVm90ZUFjdGlvbnMJAQAAAAtwcm9jZXNzVm90ZQAAAAQFAAAABWFzc2V0BQAAABF1c2VyQWRkcmVzc09yVW5pdAUAAAAfa2V5TGF0ZXN0UHJvY2Vzc2VkQXNzZXRUcmFuc2ZlcgUAAAAea2V5TGF0ZXN0UHJvY2Vzc2VkVXNlclRyYW5zZmVyCQAFFAAAAAIFAAAAEnByb2Nlc3NWb3RlQWN0aW9ucwYEAAAAFGxhdGVzdFByb2Nlc3NlZEFzc2V0CQEAAAAFdmFsdWUAAAABBQAAABpsYXRlc3RQcm9jZXNzZWRBc3NldE9yVW5pdAMJAAAAAAAAAgUAAAAZbGF0ZXN0UHJvY2Vzc2VkVXNlck9yVW5pdAUAAAAEdW5pdAQAAAALYXNzZXRPclVuaXQJAAQiAAAAAQkBAAAAC2tleUxpc3ROZXh0AAAAAgUAAAAOYXNzZXRzTGlzdE5hbWUFAAAAFGxhdGVzdFByb2Nlc3NlZEFzc2V0AwkAAAAAAAACBQAAAAthc3NldE9yVW5pdAUAAAAEdW5pdAUAAAAGZmluaXNoBAAAAAVhc3NldAkBAAAABXZhbHVlAAAAAQUAAAALYXNzZXRPclVuaXQEAAAAEXVzZXJBZGRyZXNzT3JVbml0CQAEIgAAAAEJAQAAAAtrZXlMaXN0SGVhZAAAAAEJAQAAABBnZXRWb3Rlc0xpc3ROYW1lAAAAAQUAAAAFYXNzZXQEAAAAEnByb2Nlc3NWb3RlQWN0aW9ucwkBAAAAC3Byb2Nlc3NWb3RlAAAABAUAAAAFYXNzZXQFAAAAEXVzZXJBZGRyZXNzT3JVbml0BQAAAB9rZXlMYXRlc3RQcm9jZXNzZWRBc3NldFRyYW5zZmVyBQAAAB5rZXlMYXRlc3RQcm9jZXNzZWRVc2VyVHJhbnNmZXIJAAUUAAAAAgUAAAAScHJvY2Vzc1ZvdGVBY3Rpb25zBgQAAAATbGF0ZXN0UHJvY2Vzc2VkVXNlcgkBAAAABXZhbHVlAAAAAQUAAAAZbGF0ZXN0UHJvY2Vzc2VkVXNlck9yVW5pdAQAAAARdXNlckFkZHJlc3NPclVuaXQJAAQiAAAAAQkBAAAAC2tleUxpc3ROZXh0AAAAAgkBAAAAEGdldFZvdGVzTGlzdE5hbWUAAAABBQAAABRsYXRlc3RQcm9jZXNzZWRBc3NldAUAAAATbGF0ZXN0UHJvY2Vzc2VkVXNlcgQAAAAScHJvY2Vzc1ZvdGVBY3Rpb25zCQEAAAALcHJvY2Vzc1ZvdGUAAAAEBQAAABRsYXRlc3RQcm9jZXNzZWRBc3NldAUAAAARdXNlckFkZHJlc3NPclVuaXQFAAAAH2tleUxhdGVzdFByb2Nlc3NlZEFzc2V0VHJhbnNmZXIFAAAAHmtleUxhdGVzdFByb2Nlc3NlZFVzZXJUcmFuc2ZlcgkABRQAAAACBQAAABJwcm9jZXNzVm90ZUFjdGlvbnMGAAAAAWkBAAAAFHRyYW5zZmVyVm90ZXNXcmFwcGVyAAAAAQAAAAdjb3VudGVyBAAAAAZyZXN1bHQJAQAAAAZhc0Jvb2wAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAE3RyYW5zZmVyVm90ZXNIZWxwZXIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAMJAQAAAAEhAAAAAQUAAAAGcmVzdWx0AwkAAAAAAAACBQAAAAdjb3VudGVyAAAAAAAAAAAACQAAAgAAAAECAAAAGVZvdGluZyBpcyBub3Qgc3RhcnRlZCB5ZXQJAAUUAAAAAgUAAAADbmlsBQAAAAR1bml0AwkAAGYAAAACBQAAAAhtYXhEZXB0aAUAAAAHY291bnRlcgQAAAADaW52CQAD/AAAAAQFAAAABHRoaXMCAAAAFHRyYW5zZmVyVm90ZXNXcmFwcGVyCQAETAAAAAIJAABkAAAAAgUAAAAHY291bnRlcgAAAAAAAAAAAQUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAA2ludgUAAAADaW52CQAFFAAAAAIFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAUUAAAAAgUAAAADbmlsBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA10cmFuc2ZlclZvdGVzAAAAAAQAAAADaW52CQAD/AAAAAQFAAAABHRoaXMCAAAAFHRyYW5zZmVyVm90ZXNXcmFwcGVyCQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAANpbnYFAAAAA2ludgkABRQAAAACBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAEnNldFZvdGluZ1RocmVzaG9sZAAAAAEAAAAMbmV3VGhyZXNob2xkBAAAAAtjaGVja0NhbGxlcgkBAAAACHRoaXNPbmx5AAAAAQUAAAABaQMJAAAAAAAAAgUAAAALY2hlY2tDYWxsZXIFAAAAC2NoZWNrQ2FsbGVyCQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmtleVZvdGluZ1RocmVzaG9sZAUAAAAMbmV3VGhyZXNob2xkBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABnNldEZlZQAAAAEAAAAGbmV3RmVlBAAAAAtjaGVja0NhbGxlcgkBAAAACHRoaXNPbmx5AAAAAQUAAAABaQMJAAAAAAAAAgUAAAALY2hlY2tDYWxsZXIFAAAAC2NoZWNrQ2FsbGVyCQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADGtleUZlZUFtb3VudAUAAAAGbmV3RmVlBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAG2d3eEF2YWlsYWJsZUZvclZvdGVSRUFET05MWQAAAAEAAAALdXNlckFkZHJlc3MEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAUAAAAOdm90aW5nRHVyYXRpb24EAAAADmd3eEFtb3VudEF0RW5kCQEAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0AAAAAgUAAAALdXNlckFkZHJlc3MFAAAACWVuZEhlaWdodAkABRQAAAACBQAAAANuaWwFAAAADmd3eEFtb3VudEF0RW5kAAAAAElnTDo=", "height": 1978053, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G53hwAsYeEd5aiGMMXBcq4dvR8xhtazecMRpuDPzi2eq Next: 8C4bE8NSsHBNKcssh9YKc2fjwPxBJyaSQMpQ4GvzdJyN Diff:
OldNewDifferences
281281 }
282282
283283
284+func assetShouldBeEliminated (assetId,period) = !(valueOrElse(getBoolean(keyAssetVerifiedByPeriod(assetId, period)), true))
285+
286+
287+func eliminationCheck (assetId) = if (if (if (assetShouldBeEliminated(assetId, currentPeriod))
288+ then assetShouldBeEliminated(assetId, (currentPeriod - 1))
289+ else false)
290+ then assetShouldBeEliminated(assetId, (currentPeriod - 2))
291+ else false)
292+ then assetShouldBeEliminated(assetId, (currentPeriod - 3))
293+ else false
294+
295+
284296 @Callable(i)
285297 func constructor (boostingContractPrm,emissionContractPrm,assetsStoreContractPrm,feeAmountPrm,wxAssetIdPrm,votingThresholdPrm,votingDurationPrm,voteBeforeEliminationPrm,startHeightPrm,maxDepthPrm) = {
286298 let checks = [thisOnly(i), if (isDefined(addressFromString(boostingContractPrm)))
384396 let checkVote = valueOrElse(getString(userVoteKey), "Nothing to cancel")
385397 if ((checkVote == checkVote))
386398 then {
387- let $t01419914260 = parseUserVote(value(userVoteOrUnit))
388- let total = $t01419914260._1
389- let inFavor = $t01419914260._2
399+ let $t01460914670 = parseUserVote(value(userVoteOrUnit))
400+ let total = $t01460914670._1
401+ let inFavor = $t01460914670._2
390402 let votesListActions = deleteNode(votesListName, userAddress)
391403 let userVoteActions = [DeleteEntry(userVoteKey), StringEntry(keyUserVoteHistory("cancelVote", userAddress, assetId, toBase58String(i.transactionId), currentPeriod), formatUserVote(0, true)), getVoteResultAction(assetId, -(total), inFavor, currentPeriod)]
392404 $Tuple2((votesListActions ++ userVoteActions), unit)
397409
398410
399411 @Callable(i)
400-func eliminationCheck (assetId,delta,result) = {
401- let assetVerifiedByPeriod = getBoolean(keyAssetVerifiedByPeriod(assetId, (currentPeriod - delta)))
402- if ((delta == voteBeforeElimination))
403- then $Tuple2(nil, result)
404- else if (if ((0 > (currentPeriod - delta)))
405- then true
406- else (assetVerifiedByPeriod == unit))
407- then $Tuple2(nil, false)
408- else if (value(assetVerifiedByPeriod))
409- then $Tuple2(nil, false)
410- else $Tuple2(nil, asBool(invoke(this, "eliminationCheck", [assetId, (delta + 1), true], nil)))
411- }
412-
413-
414-
415-@Callable(i)
416412 func finalizeAssetINTERNAL (assetId,period) = {
417413 let checkCaller = thisOnly(i)
418414 if ((checkCaller == checkCaller))
419415 then {
420416 let voteResultKey = keyVoteResultByPeriod(assetId, period)
421- let $t01544215574 = match getString(voteResultKey) {
417+ let $t01532415456 = match getString(voteResultKey) {
422418 case s: String =>
423419 parseVoteResult(s)
424420 case _: Unit =>
426422 case _ =>
427423 throw("Match error")
428424 }
429- let totalYes = $t01544215574._1
430- let totalNo = $t01544215574._2
425+ let totalYes = $t01532415456._1
426+ let totalNo = $t01532415456._2
431427 let total = (totalYes + totalNo)
432428 let verified = if ((total >= votingThreshold))
433429 then (totalYes > totalNo)
436432 let assetsStoreSetVerifiedInv = invoke(assetsStoreContract, "setVerified", [assetId, verified], nil)
437433 if ((assetsStoreSetVerifiedInv == assetsStoreSetVerifiedInv))
438434 then {
439- let eliminate = if (verified)
440- then false
441- else asBool(invoke(this, "eliminationCheck", [assetId, 1, false], nil))
435+ let eliminate = eliminationCheck(assetId)
442436 let voteResultActions = if (eliminate)
443437 then nil
444438 else [getVoteResultAction(assetId, 0, true, (currentPeriod + 1))]
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let maxDepthDefault = 10
77
88 func asInt (val) = match val {
99 case valInt: Int =>
1010 valInt
1111 case _ =>
1212 throw("Failed to cast into Integer")
1313 }
1414
1515
1616 func asBool (val) = match val {
1717 case valBool: Boolean =>
1818 valBool
1919 case _ =>
2020 throw("Failed to cast into Boolean")
2121 }
2222
2323
2424 let keyFeeAmount = makeString(["%s", "fee"], separator)
2525
2626 let keyWxAssetId = makeString(["%s", "wxAssetId"], separator)
2727
2828 let keyVotingThreshold = makeString(["%s", "votingThreshold"], separator)
2929
3030 let keyVotingDuration = makeString(["%s", "epochLength"], separator)
3131
3232 let keyVoteBeforeElimination = makeString(["%s", "voteBeforeElimination"], separator)
3333
3434 let keyStartHeight = makeString(["%s", "currentVotingHeightStart"], separator)
3535
3636 let keyCurrentPeriod = makeString(["%s", "currentEpoch"], separator)
3737
3838 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3939
4040 let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
4141
4242 let keyAssetsStoreContract = makeString(["%s", "assetsStoreContract"], separator)
4343
4444 let keyLatestProcessedAsset = makeString(["%s", "latestProcessedAsset"], separator)
4545
4646 let keyLatestProcessedUser = makeString(["%s", "latestProcessedUser"], separator)
4747
4848 let keyLatestProcessedAssetTransfer = makeString(["%s", "latestProcessedAssetTransfer"], separator)
4949
5050 let keyLatestProcessedUserTransfer = makeString(["%s", "latestProcessedUserTransfer"], separator)
5151
5252 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
5353
5454 func keyVotesTransferFinishedByPeriod (period) = makeString(["%s", "votesTransferFinished", toString(period)], separator)
5555
5656
5757 let assetsListName = "__assets"
5858
5959 func getVotesListName (assetId) = ("%s__votes__" + assetId)
6060
6161
6262 func keyListHead (listName) = makeString([("%s%s" + listName), "head"], separator)
6363
6464
6565 func keyListSize (listName) = makeString([("%s%s" + listName), "size"], separator)
6666
6767
6868 func keyListPrev (listName,id) = makeString([("%s%s%s" + listName), id, "prev"], separator)
6969
7070
7171 func keyListNext (listName,id) = makeString([("%s%s%s" + listName), id, "next"], separator)
7272
7373
7474 func keyAssetVerifiedByPeriod (assetId,period) = makeString(["%s%d%s", "verifiedAt", toString(period), assetId], separator)
7575
7676
7777 func keyVoteResultByPeriod (assetId,period) = makeString(["%s%d%s", "votingResultAtAsset", toString(period), assetId], separator)
7878
7979
8080 func formatVoteResult (totalYes,totalNo) = makeString(["%d%d", toString(totalYes), toString(totalNo)], separator)
8181
8282
8383 func parseVoteResult (input) = {
8484 let parts = split(input, separator)
8585 let totalYesIdx = 1
8686 let totalNoIdx = 2
8787 let totalYes = parseIntValue(parts[totalYesIdx])
8888 let totalNo = parseIntValue(parts[totalNoIdx])
8989 $Tuple2(totalYes, totalNo)
9090 }
9191
9292
9393 func keyUserVoteByPeriod (userAddress,assetId,period) = makeString(["%s%d%s%s", "vru", toString(period), assetId, userAddress], separator)
9494
9595
9696 func formatUserVote (total,inFavor) = {
9797 let totalYes = if (inFavor)
9898 then total
9999 else 0
100100 let totalNo = if (inFavor)
101101 then 0
102102 else total
103103 makeString(["%d%d", toString(totalYes), toString(totalNo)], separator)
104104 }
105105
106106
107107 func parseUserVote (input) = {
108108 let parts = split(input, separator)
109109 let totalYesIdx = 1
110110 let totalNoIdx = 2
111111 let totalYes = parseIntValue(parts[totalYesIdx])
112112 let totalNo = parseIntValue(parts[totalNoIdx])
113113 let inFavor = if ((totalYes > 0))
114114 then (totalNo == 0)
115115 else false
116116 let against = if ((totalYes == 0))
117117 then (totalNo > 0)
118118 else false
119119 let checkTotals = if (if (inFavor)
120120 then true
121121 else against)
122122 then true
123123 else throw("Invalid user vote value")
124124 if ((checkTotals == checkTotals))
125125 then {
126126 let total = if (inFavor)
127127 then totalYes
128128 else totalNo
129129 $Tuple2(total, inFavor)
130130 }
131131 else throw("Strict value is not equal to itself.")
132132 }
133133
134134
135135 func keyUserVoteHistory (type,userAddress,assetId,txId,period) = makeString(["%s%s%s%s%s%d", "history", type, assetId, userAddress, txId, toString(period)], separator)
136136
137137
138138 func thisOnly (i) = if ((i.caller == this))
139139 then true
140140 else throw("Permission denied")
141141
142142
143143 func getIntegerOrZero (key) = valueOrElse(getInteger(this, key), 0)
144144
145145
146146 func getIntegerOrFail (key) = valueOrErrorMessage(getInteger(this, key), (key + " is not defined"))
147147
148148
149149 func getStringOrEmpty (key) = valueOrElse(getString(this, key), "")
150150
151151
152152 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
153153
154154
155155 let feeAmount = getIntegerOrFail(keyFeeAmount)
156156
157157 let wxAssetId = fromBase58String(getStringOrFail(keyWxAssetId))
158158
159159 let votingThreshold = getIntegerOrFail(keyVotingThreshold)
160160
161161 let votingDuration = getIntegerOrFail(keyVotingDuration)
162162
163163 let voteBeforeElimination = getIntegerOrFail(keyVoteBeforeElimination)
164164
165165 let startHeight = getIntegerOrFail(keyStartHeight)
166166
167167 let currentPeriod = getIntegerOrFail(keyCurrentPeriod)
168168
169169 let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
170170
171171 let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract))
172172
173173 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract))
174174
175175 let maxDepth = valueOrElse(getInteger(keyMaxDepth), maxDepthDefault)
176176
177177 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
178178 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
179179 asInt(gwxAmount)
180180 }
181181
182182
183183 func getVoteResultAction (assetId,total,inFavor,period) = {
184184 let voteResultKey = keyVoteResultByPeriod(assetId, period)
185185 let $t054515583 = match getString(voteResultKey) {
186186 case s: String =>
187187 parseVoteResult(s)
188188 case _: Unit =>
189189 $Tuple2(0, 0)
190190 case _ =>
191191 throw("Match error")
192192 }
193193 let totalYes = $t054515583._1
194194 let totalNo = $t054515583._2
195195 StringEntry(voteResultKey, formatVoteResult((totalYes + (if (inFavor)
196196 then total
197197 else 0)), (totalNo + (if (inFavor)
198198 then 0
199199 else total))))
200200 }
201201
202202
203203 func containsNode (listName,id) = {
204204 let head = getString(this, keyListHead(listName))
205205 let prev = getString(this, keyListPrev(listName, id))
206206 let next = getString(this, keyListNext(listName, id))
207207 if (if ((id == head))
208208 then true
209209 else (prev != unit))
210210 then true
211211 else (next != unit)
212212 }
213213
214214
215215 func insertNode (listName,id) = {
216216 let head = getString(this, keyListHead(listName))
217217 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
218218 let checkNode = if (!(containsNode(listName, id)))
219219 then true
220220 else throw("Node exists")
221221 if ((checkNode == checkNode))
222222 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if (isDefined(head))
223223 then [StringEntry(keyListNext(listName, id), value(head)), StringEntry(keyListPrev(listName, value(head)), id)]
224224 else nil)) ++ [StringEntry(keyListHead(listName), id)])
225225 else throw("Strict value is not equal to itself.")
226226 }
227227
228228
229229 func deleteNode (listName,id) = {
230230 let head = getString(this, keyListHead(listName))
231231 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
232232 let prev = getString(this, keyListPrev(listName, id))
233233 let next = getString(this, keyListNext(listName, id))
234234 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if (isDefined(prev))
235235 then isDefined(next)
236236 else false)
237237 then [StringEntry(keyListNext(listName, value(prev)), value(next)), StringEntry(keyListPrev(listName, value(next)), value(prev)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
238238 else if (isDefined(next))
239239 then [StringEntry(keyListHead(listName), value(next)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(next)))]
240240 else if (isDefined(prev))
241241 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prev)))]
242242 else if ((id == head))
243243 then [DeleteEntry(keyListHead(listName))]
244244 else throw("Invalid node")))
245245 }
246246
247247
248248 func processVote (assetId,userAddressOrUnit,latestProcessedAssetKey,latestProcessedUserKey) = {
249249 let updateLatestProcessedAssetAction = StringEntry(latestProcessedAssetKey, assetId)
250250 let deleteLatestProcessedUserAction = DeleteEntry(latestProcessedUserKey)
251251 if ((userAddressOrUnit == unit))
252252 then [updateLatestProcessedAssetAction, deleteLatestProcessedUserAction]
253253 else {
254254 let endHeight = (startHeight + votingDuration)
255255 let userAddress = value(userAddressOrUnit)
256256 let updateLatestProcessedUserAction = StringEntry(latestProcessedUserKey, userAddress)
257257 let userVoteKey = keyUserVoteByPeriod(userAddress, assetId, currentPeriod)
258258 let userVoteOrUnit = getString(userVoteKey)
259259 let userGwxAmountAtEndHeight = getUserGwxAmountAtHeight(userAddress, endHeight)
260260 let voteActions = if ((userGwxAmountAtEndHeight == 0))
261261 then {
262262 let votesListName = getVotesListName(assetId)
263263 deleteNode(votesListName, userAddress)
264264 }
265265 else if ((userVoteOrUnit == unit))
266266 then {
267267 let userPreviousVoteOrUnit = getString(keyUserVoteByPeriod(userAddress, assetId, (currentPeriod - 1)))
268268 if ((userPreviousVoteOrUnit == unit))
269269 then nil
270270 else {
271271 let $t093859458 = parseUserVote(value(userPreviousVoteOrUnit))
272272 let prevTotal = $t093859458._1
273273 let inFavor = $t093859458._2
274274 let total = min([prevTotal, userGwxAmountAtEndHeight])
275275 [StringEntry(userVoteKey, formatUserVote(total, inFavor)), getVoteResultAction(assetId, total, inFavor, currentPeriod)]
276276 }
277277 }
278278 else nil
279279 ((voteActions :+ updateLatestProcessedAssetAction) :+ updateLatestProcessedUserAction)
280280 }
281281 }
282282
283283
284+func assetShouldBeEliminated (assetId,period) = !(valueOrElse(getBoolean(keyAssetVerifiedByPeriod(assetId, period)), true))
285+
286+
287+func eliminationCheck (assetId) = if (if (if (assetShouldBeEliminated(assetId, currentPeriod))
288+ then assetShouldBeEliminated(assetId, (currentPeriod - 1))
289+ else false)
290+ then assetShouldBeEliminated(assetId, (currentPeriod - 2))
291+ else false)
292+ then assetShouldBeEliminated(assetId, (currentPeriod - 3))
293+ else false
294+
295+
284296 @Callable(i)
285297 func constructor (boostingContractPrm,emissionContractPrm,assetsStoreContractPrm,feeAmountPrm,wxAssetIdPrm,votingThresholdPrm,votingDurationPrm,voteBeforeEliminationPrm,startHeightPrm,maxDepthPrm) = {
286298 let checks = [thisOnly(i), if (isDefined(addressFromString(boostingContractPrm)))
287299 then true
288300 else throw("Invalid boosting contract address"), if (isDefined(addressFromString(emissionContractPrm)))
289301 then true
290302 else throw("Invalid emission contract address"), if (isDefined(addressFromString(assetsStoreContractPrm)))
291303 then true
292304 else throw("Invalid asset_store contract address"), if ((feeAmountPrm >= 0))
293305 then true
294306 else throw("Invalid fee amount"), if (isDefined(assetInfo(fromBase58String(wxAssetIdPrm))))
295307 then true
296308 else throw("Invalid WX asset ID"), if ((votingThresholdPrm >= 0))
297309 then true
298310 else throw("Invalid voting threshold"), if ((votingDurationPrm > 0))
299311 then true
300312 else throw("Invalid voting duration"), if (((startHeightPrm + votingDurationPrm) > height))
301313 then true
302314 else throw("Invalid start height")]
303315 if ((checks == checks))
304316 then $Tuple2([StringEntry(keyBoostingContract, boostingContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), StringEntry(keyAssetsStoreContract, assetsStoreContractPrm), IntegerEntry(keyFeeAmount, feeAmountPrm), StringEntry(keyWxAssetId, wxAssetIdPrm), IntegerEntry(keyVotingThreshold, votingThresholdPrm), IntegerEntry(keyVotingDuration, votingDurationPrm), IntegerEntry(keyVoteBeforeElimination, voteBeforeEliminationPrm), IntegerEntry(keyStartHeight, startHeightPrm), IntegerEntry(keyCurrentPeriod, 0), IntegerEntry(keyMaxDepth, maxDepthPrm)], unit)
305317 else throw("Strict value is not equal to itself.")
306318 }
307319
308320
309321
310322 @Callable(i)
311323 func suggest (assetId,assetImage) = {
312324 let info = valueOrErrorMessage(assetInfo(fromBase58String(assetId)), "Invalid asset ID")
313325 let payment = value(i.payments[0])
314326 let checks = [if ((info.issuer == i.caller))
315327 then true
316328 else throw("Asset can only be suggested by its issuer"), if ((value(payment.assetId) == wxAssetId))
317329 then true
318330 else throw("Invalid fee asset"), if ((payment.amount == feeAmount))
319331 then true
320332 else throw("Invalid fee amount")]
321333 if ((checks == checks))
322334 then {
323335 let assetsStoreCreateOrUpdateInv = invoke(assetsStoreContract, "createOrUpdate", [assetId, "", assetImage, false], nil)
324336 if ((assetsStoreCreateOrUpdateInv == assetsStoreCreateOrUpdateInv))
325337 then {
326338 let burnFeeInv = invoke(emissionContract, "burn", nil, [AttachedPayment(payment.assetId, payment.amount)])
327339 if ((burnFeeInv == burnFeeInv))
328340 then {
329341 let addAssetActions = insertNode(assetsListName, assetId)
330342 $Tuple2((addAssetActions :+ getVoteResultAction(assetId, 0, true, currentPeriod)), unit)
331343 }
332344 else throw("Strict value is not equal to itself.")
333345 }
334346 else throw("Strict value is not equal to itself.")
335347 }
336348 else throw("Strict value is not equal to itself.")
337349 }
338350
339351
340352
341353 @Callable(i)
342354 func vote (assetId,inFavor) = {
343355 let endHeight = (startHeight + votingDuration)
344356 let checkAsset = if (containsNode(assetsListName, assetId))
345357 then true
346358 else throw("Invalid asset")
347359 if ((checkAsset == checkAsset))
348360 then {
349361 let checkHeight = if ((endHeight > height))
350362 then true
351363 else throw("Current voting is over but results are not finalized")
352364 if ((checkHeight == checkHeight))
353365 then {
354366 let userAddress = toString(i.caller)
355367 let gwxAmountAtEnd = getUserGwxAmountAtHeight(userAddress, endHeight)
356368 let checkGwxAmountAtEnd = if ((gwxAmountAtEnd > 0))
357369 then true
358370 else throw("You'll not have gWX at the end of voting")
359371 if ((checkGwxAmountAtEnd == checkGwxAmountAtEnd))
360372 then {
361373 let votesListName = getVotesListName(assetId)
362374 let userVoteKey = keyUserVoteByPeriod(userAddress, assetId, currentPeriod)
363375 let userVoteActions = [StringEntry(userVoteKey, formatUserVote(gwxAmountAtEnd, inFavor)), StringEntry(keyUserVoteHistory("vote", userAddress, assetId, toBase58String(i.transactionId), currentPeriod), formatUserVote(gwxAmountAtEnd, inFavor)), getVoteResultAction(assetId, gwxAmountAtEnd, inFavor, currentPeriod)]
364376 let votesListActions = if (containsNode(votesListName, userAddress))
365377 then nil
366378 else insertNode(votesListName, userAddress)
367379 $Tuple2((votesListActions ++ userVoteActions), unit)
368380 }
369381 else throw("Strict value is not equal to itself.")
370382 }
371383 else throw("Strict value is not equal to itself.")
372384 }
373385 else throw("Strict value is not equal to itself.")
374386 }
375387
376388
377389
378390 @Callable(i)
379391 func cancelVote (assetId) = {
380392 let userAddress = toString(i.caller)
381393 let votesListName = getVotesListName(assetId)
382394 let userVoteKey = keyUserVoteByPeriod(userAddress, assetId, currentPeriod)
383395 let userVoteOrUnit = getString(userVoteKey)
384396 let checkVote = valueOrElse(getString(userVoteKey), "Nothing to cancel")
385397 if ((checkVote == checkVote))
386398 then {
387- let $t01419914260 = parseUserVote(value(userVoteOrUnit))
388- let total = $t01419914260._1
389- let inFavor = $t01419914260._2
399+ let $t01460914670 = parseUserVote(value(userVoteOrUnit))
400+ let total = $t01460914670._1
401+ let inFavor = $t01460914670._2
390402 let votesListActions = deleteNode(votesListName, userAddress)
391403 let userVoteActions = [DeleteEntry(userVoteKey), StringEntry(keyUserVoteHistory("cancelVote", userAddress, assetId, toBase58String(i.transactionId), currentPeriod), formatUserVote(0, true)), getVoteResultAction(assetId, -(total), inFavor, currentPeriod)]
392404 $Tuple2((votesListActions ++ userVoteActions), unit)
393405 }
394406 else throw("Strict value is not equal to itself.")
395407 }
396408
397409
398410
399411 @Callable(i)
400-func eliminationCheck (assetId,delta,result) = {
401- let assetVerifiedByPeriod = getBoolean(keyAssetVerifiedByPeriod(assetId, (currentPeriod - delta)))
402- if ((delta == voteBeforeElimination))
403- then $Tuple2(nil, result)
404- else if (if ((0 > (currentPeriod - delta)))
405- then true
406- else (assetVerifiedByPeriod == unit))
407- then $Tuple2(nil, false)
408- else if (value(assetVerifiedByPeriod))
409- then $Tuple2(nil, false)
410- else $Tuple2(nil, asBool(invoke(this, "eliminationCheck", [assetId, (delta + 1), true], nil)))
411- }
412-
413-
414-
415-@Callable(i)
416412 func finalizeAssetINTERNAL (assetId,period) = {
417413 let checkCaller = thisOnly(i)
418414 if ((checkCaller == checkCaller))
419415 then {
420416 let voteResultKey = keyVoteResultByPeriod(assetId, period)
421- let $t01544215574 = match getString(voteResultKey) {
417+ let $t01532415456 = match getString(voteResultKey) {
422418 case s: String =>
423419 parseVoteResult(s)
424420 case _: Unit =>
425421 $Tuple2(0, 0)
426422 case _ =>
427423 throw("Match error")
428424 }
429- let totalYes = $t01544215574._1
430- let totalNo = $t01544215574._2
425+ let totalYes = $t01532415456._1
426+ let totalNo = $t01532415456._2
431427 let total = (totalYes + totalNo)
432428 let verified = if ((total >= votingThreshold))
433429 then (totalYes > totalNo)
434430 else false
435431 let assetVerifiedAction = [BooleanEntry(keyAssetVerifiedByPeriod(assetId, period), verified)]
436432 let assetsStoreSetVerifiedInv = invoke(assetsStoreContract, "setVerified", [assetId, verified], nil)
437433 if ((assetsStoreSetVerifiedInv == assetsStoreSetVerifiedInv))
438434 then {
439- let eliminate = if (verified)
440- then false
441- else asBool(invoke(this, "eliminationCheck", [assetId, 1, false], nil))
435+ let eliminate = eliminationCheck(assetId)
442436 let voteResultActions = if (eliminate)
443437 then nil
444438 else [getVoteResultAction(assetId, 0, true, (currentPeriod + 1))]
445439 let votesListActions = if (eliminate)
446440 then deleteNode(assetsListName, assetId)
447441 else nil
448442 $Tuple2(((votesListActions ++ voteResultActions) ++ assetVerifiedAction), unit)
449443 }
450444 else throw("Strict value is not equal to itself.")
451445 }
452446 else throw("Strict value is not equal to itself.")
453447 }
454448
455449
456450
457451 @Callable(i)
458452 func finalizeVotingHelper () = {
459453 let endHeight = (startHeight + votingDuration)
460454 if ((endHeight > height))
461455 then $Tuple2(nil, false)
462456 else {
463457 let latestProcessedAssetOrUnit = getString(keyLatestProcessedAsset)
464458 let latestProcessedUserOrUnit = getString(keyLatestProcessedUser)
465459 let nextPeriodDelay = 0
466460 let finish = $Tuple2([IntegerEntry(keyStartHeight, (height + nextPeriodDelay)), IntegerEntry(keyCurrentPeriod, (currentPeriod + 1)), DeleteEntry(keyLatestProcessedAsset), DeleteEntry(keyLatestProcessedUser), DeleteEntry(keyLatestProcessedAssetTransfer), DeleteEntry(keyLatestProcessedUserTransfer)], true)
467461 if ((latestProcessedAssetOrUnit == unit))
468462 then {
469463 let assetsHeadOrUnit = getString(keyListHead(assetsListName))
470464 if ((assetsHeadOrUnit == unit))
471465 then finish
472466 else {
473467 let asset = value(assetsHeadOrUnit)
474468 let userAddressOrUnit = getString(keyListHead(getVotesListName(asset)))
475469 let processVoteActions = processVote(asset, userAddressOrUnit, keyLatestProcessedAsset, keyLatestProcessedUser)
476470 $Tuple2(processVoteActions, true)
477471 }
478472 }
479473 else {
480474 let latestProcessedAsset = value(latestProcessedAssetOrUnit)
481475 if ((latestProcessedUserOrUnit == unit))
482476 then {
483477 let assetOrUnit = getString(keyListNext(assetsListName, latestProcessedAsset))
484478 if ((assetOrUnit == assetOrUnit))
485479 then {
486480 let finalizeAssetInv = invoke(this, "finalizeAssetINTERNAL", [latestProcessedAsset, currentPeriod], nil)
487481 if ((finalizeAssetInv == finalizeAssetInv))
488482 then if ((assetOrUnit == unit))
489483 then finish
490484 else {
491485 let asset = value(assetOrUnit)
492486 let userAddressOrUnit = getString(keyListHead(getVotesListName(asset)))
493487 let processVoteActions = processVote(asset, userAddressOrUnit, keyLatestProcessedAsset, keyLatestProcessedUser)
494488 $Tuple2(processVoteActions, true)
495489 }
496490 else throw("Strict value is not equal to itself.")
497491 }
498492 else throw("Strict value is not equal to itself.")
499493 }
500494 else {
501495 let latestProcessedUser = value(latestProcessedUserOrUnit)
502496 let userAddressOrUnit = getString(keyListNext(getVotesListName(latestProcessedAsset), latestProcessedUser))
503497 let processVoteActions = processVote(latestProcessedAsset, userAddressOrUnit, keyLatestProcessedAsset, keyLatestProcessedUser)
504498 $Tuple2(processVoteActions, true)
505499 }
506500 }
507501 }
508502 }
509503
510504
511505
512506 @Callable(i)
513507 func finalizeVotingWrapper (counter) = {
514508 let result = asBool(invoke(this, "finalizeVotingHelper", nil, nil))
515509 if ((result == result))
516510 then if (!(result))
517511 then if ((counter == 0))
518512 then throw("Current voting is not over yet")
519513 else $Tuple2(nil, unit)
520514 else if ((maxDepth > counter))
521515 then {
522516 let inv = invoke(this, "finalizeVotingWrapper", [(counter + 1)], nil)
523517 if ((inv == inv))
524518 then $Tuple2(nil, unit)
525519 else throw("Strict value is not equal to itself.")
526520 }
527521 else $Tuple2(nil, unit)
528522 else throw("Strict value is not equal to itself.")
529523 }
530524
531525
532526
533527 @Callable(i)
534528 func finalizeVoting () = {
535529 let inv = invoke(this, "finalizeVotingWrapper", [0], nil)
536530 if ((inv == inv))
537531 then $Tuple2(nil, unit)
538532 else throw("Strict value is not equal to itself.")
539533 }
540534
541535
542536
543537 @Callable(i)
544538 func transferVotesHelper () = {
545539 let votesTransferFinishedKey = keyVotesTransferFinishedByPeriod(currentPeriod)
546540 let votesTransferFinished = valueOrElse(getBoolean(votesTransferFinishedKey), false)
547541 let endHeight = (startHeight + votingDuration)
548542 if (if (if ((startHeight > height))
549543 then true
550544 else (height >= endHeight))
551545 then true
552546 else votesTransferFinished)
553547 then $Tuple2(nil, false)
554548 else {
555549 let latestProcessedAssetOrUnit = getString(keyLatestProcessedAssetTransfer)
556550 let latestProcessedUserOrUnit = getString(keyLatestProcessedUserTransfer)
557551 let finish = $Tuple2([BooleanEntry(votesTransferFinishedKey, true), DeleteEntry(keyLatestProcessedAssetTransfer), DeleteEntry(keyLatestProcessedUserTransfer)], true)
558552 if ((latestProcessedAssetOrUnit == unit))
559553 then {
560554 let assetsHeadOrUnit = getString(keyListHead(assetsListName))
561555 if ((assetsHeadOrUnit == unit))
562556 then finish
563557 else {
564558 let asset = value(assetsHeadOrUnit)
565559 let userAddressOrUnit = getString(keyListHead(getVotesListName(asset)))
566560 let processVoteActions = processVote(asset, userAddressOrUnit, keyLatestProcessedAssetTransfer, keyLatestProcessedUserTransfer)
567561 $Tuple2(processVoteActions, true)
568562 }
569563 }
570564 else {
571565 let latestProcessedAsset = value(latestProcessedAssetOrUnit)
572566 if ((latestProcessedUserOrUnit == unit))
573567 then {
574568 let assetOrUnit = getString(keyListNext(assetsListName, latestProcessedAsset))
575569 if ((assetOrUnit == unit))
576570 then finish
577571 else {
578572 let asset = value(assetOrUnit)
579573 let userAddressOrUnit = getString(keyListHead(getVotesListName(asset)))
580574 let processVoteActions = processVote(asset, userAddressOrUnit, keyLatestProcessedAssetTransfer, keyLatestProcessedUserTransfer)
581575 $Tuple2(processVoteActions, true)
582576 }
583577 }
584578 else {
585579 let latestProcessedUser = value(latestProcessedUserOrUnit)
586580 let userAddressOrUnit = getString(keyListNext(getVotesListName(latestProcessedAsset), latestProcessedUser))
587581 let processVoteActions = processVote(latestProcessedAsset, userAddressOrUnit, keyLatestProcessedAssetTransfer, keyLatestProcessedUserTransfer)
588582 $Tuple2(processVoteActions, true)
589583 }
590584 }
591585 }
592586 }
593587
594588
595589
596590 @Callable(i)
597591 func transferVotesWrapper (counter) = {
598592 let result = asBool(invoke(this, "transferVotesHelper", nil, nil))
599593 if ((result == result))
600594 then if (!(result))
601595 then if ((counter == 0))
602596 then throw("Voting is not started yet")
603597 else $Tuple2(nil, unit)
604598 else if ((maxDepth > counter))
605599 then {
606600 let inv = invoke(this, "transferVotesWrapper", [(counter + 1)], nil)
607601 if ((inv == inv))
608602 then $Tuple2(nil, unit)
609603 else throw("Strict value is not equal to itself.")
610604 }
611605 else $Tuple2(nil, unit)
612606 else throw("Strict value is not equal to itself.")
613607 }
614608
615609
616610
617611 @Callable(i)
618612 func transferVotes () = {
619613 let inv = invoke(this, "transferVotesWrapper", [0], nil)
620614 if ((inv == inv))
621615 then $Tuple2(nil, unit)
622616 else throw("Strict value is not equal to itself.")
623617 }
624618
625619
626620
627621 @Callable(i)
628622 func setVotingThreshold (newThreshold) = {
629623 let checkCaller = thisOnly(i)
630624 if ((checkCaller == checkCaller))
631625 then $Tuple2([IntegerEntry(keyVotingThreshold, newThreshold)], unit)
632626 else throw("Strict value is not equal to itself.")
633627 }
634628
635629
636630
637631 @Callable(i)
638632 func setFee (newFee) = {
639633 let checkCaller = thisOnly(i)
640634 if ((checkCaller == checkCaller))
641635 then $Tuple2([IntegerEntry(keyFeeAmount, newFee)], unit)
642636 else throw("Strict value is not equal to itself.")
643637 }
644638
645639
646640
647641 @Callable(i)
648642 func gwxAvailableForVoteREADONLY (userAddress) = {
649643 let endHeight = (startHeight + votingDuration)
650644 let gwxAmountAtEnd = getUserGwxAmountAtHeight(userAddress, endHeight)
651645 $Tuple2(nil, gwxAmountAtEnd)
652646 }
653647
654648

github/deemru/w8io/026f985 
84.70 ms