tx · 49c3vZz6BgY45jsxTz3UmuMteDRpr6f5GLGZkBzxynQ4

3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr:  -0.02200000 Waves

2023.06.01 12:22 [2603411] smart account 3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr > SELF 0.00000000 Waves

{ "type": 13, "id": "49c3vZz6BgY45jsxTz3UmuMteDRpr6f5GLGZkBzxynQ4", "fee": 2200000, "feeAssetId": null, "timestamp": 1685611396932, "version": 2, "chainId": 84, "sender": "3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr", "senderPublicKey": "GFbasS3jufhZkK4xR7tdTjjnP8K33KvJFEDHRtxXDkaJ", "proofs": [ "1AsWcJEP4mFLzvQ4gYUd2FfH3GjPvbrFLR1m3XnLBD69vMmkS4kGiHx6FbHKv4XbWfhgXgQhnDZ9xyyW1RpqjrS" ], "script": "base64:BgKpFggCEgQKAggBEgcKBQgICAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgMKAQESBAoCCAgSBAoCCAQSABIDCgEBEgASBAoCCAgSBAoCCAgSBAoCCAgiCXNlcGFyYXRvciIOcG9vbFdlaWdodE11bHQiD21heERlcHRoRGVmYXVsdCIWZmluYWxpemF0aW9uU3RhZ2VUb3RhbCIXZmluYWxpemF0aW9uU3RhZ2VTaGFyZXMiDmtleUVwb2NoTGVuZ3RoIhFrZXlFcG9jaExlbmd0aE5ldyIVa2V5RXBvY2hMZW5ndGhCeUVwb2NoIgVlcG9jaCIPa2V5Q3VycmVudEVwb2NoIgtrZXlNYXhEZXB0aCIia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdCISa2V5RmFjdG9yeUNvbnRyYWN0IhNrZXlCb29zdGluZ0NvbnRyYWN0IhJrZXlTdGFraW5nQ29udHJhY3QiFGtleUZpbmFsaXphdGlvblN0YWdlIgtrZXlOZXh0UG9vbCILa2V5TmV4dFVzZXIiDmtleVN0YXJ0SGVpZ2h0IhFrZXlDdXJyZW50RXBvY2hVaSIQa2V5U3RhcnRIZWlnaHRVaSIda2V5RmluYWxpemF0aW9uU2hvdWxkQmVGb3JjZWQiFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaCIMa2V5RmluYWxpemVkIglrZXlJbkxpc3QiBHBvb2wiCyR0MDE2OTMxNzMzIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiB2tleVVzZWQiB2FkZHJlc3MiB2tleVZvdGUiCyR0MDIwMDcyMDQ3Ig9rZXlWb3RpbmdSZXN1bHQiCyR0MDIyMjkyMjY5IhVrZXlWb3RpbmdSZXN1bHRTdGFrZWQiDGxwQXNzZXRJZFN0ciIMa2V5UG9vbFNoYXJlIgskdDAyNTkwMjYzMCINa2V5VG90YWxWb3RlcyIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIHd3JhcEVyciIDbXNnIgh0aHJvd0VyciIOZ2V0VmFsdWVPckZhaWwiA2tleSIEdHlwZSIFZXJyb3IiByRtYXRjaDAiA3N0ciIDaW50IgxnZXRTdHJPckZhaWwiAUAiDGdldEludE9yRmFpbCIMcG9vbFRvU3RyaW5nIgxzdHJpbmdUb1Bvb2wiBXBhcnRzIg9mYWN0b3J5Q29udHJhY3QiGklkeEZhY3RvcnlDZmdHd3hSZXdhcmREYXBwIg1rZXlGYWN0b3J5Q2ZnIhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIWZ2V0THBBc3NldEJ5UG9vbEFzc2V0cyIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyIhdpbnRlcm5hbFByaWNlQXNzZXRJZFN0ciIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCITcG9vbENvbnRyYWN0QWRkcmVzcyIVYW1vdW50QXNzZXRJbnRlcm5hbElkIhRwcmljZUFzc2V0SW50ZXJuYWxJZCIJbHBBc3NldElkIhhjaGVja1d4RW1pc3Npb25Qb29sTGFiZWwiCyR0MDU0NzA1NTEwIhBnd3hSZXdhcmREZXBvc2l0IhJnd3hSZXdhcmRzQ29udHJhY3QiDXBvb2xzTGlzdE5hbWUiEGdldFZvdGVzTGlzdE5hbWUiCyR0MDU5Mjc1OTY3IgtrZXlMaXN0SGVhZCIIbGlzdE5hbWUiBG1ldGEiC2tleUxpc3RTaXplIgtrZXlMaXN0UHJldiICaWQiC2tleUxpc3ROZXh0Igxjb250YWluc05vZGUiCmhlYWRPclVuaXQiCnByZXZPclVuaXQiCm5leHRPclVuaXQiEWluc2VydE5vZGVBY3Rpb25zIghsaXN0U2l6ZSIJY2hlY2tOb2RlIhFkZWxldGVOb2RlQWN0aW9ucyIWa2V5TWFuYWdlclZhdWx0QWRkcmVzcyITa2V5TWFuYWdlclB1YmxpY0tleSIcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcyIBcyIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyIJaXNNYW5hZ2VyIgFpIgJwayILbXVzdE1hbmFnZXIiCG11c3RUaGlzIgt1c2VyQWRkcmVzcyIMdGFyZ2V0SGVpZ2h0Ihdib29zdGluZ0NvbnRyYWN0QWRkcmVzcyIfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdCIQYm9vc3RpbmdDb250cmFjdCIPc3Rha2luZ0NvbnRyYWN0IgtlcG9jaExlbmd0aCIGY2hlY2tzIg1pbkxpc3RBY3Rpb25zIhhjdXJyZW50RXBvY2hJc05vdERlZmluZWQiEnN0YXJ0SGVpZ2h0QWN0aW9ucyIGYW1vdW50IgtzdGFydEhlaWdodCIJZW5kSGVpZ2h0IhdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdCIEdXNlZCIEdm90ZSIKcG9vbFJlc3VsdCIKdG90YWxWb3RlcyITZ3d4QW1vdW50QXRFbmRUb3RhbCIJYXZhaWxhYmxlIgduZXdWb3RlIgp3eEVtaXNzaW9uIg12b3Rlc0xpc3ROYW1lIhB2b3Rlc0xpc3RBY3Rpb25zIg5uZXdFcG9jaExlbmd0aCILbmV3TWF4RGVwdGgiB3Bvb2xTdHIiC2NoZWNrQ2FsbGVyIg1lcG9jaFByZXZpb3VzIhNzdGFydEhlaWdodFByZXZpb3VzIhNlcG9jaExlbmd0aFByZXZpb3VzIhFlbmRIZWlnaHRQcmV2aW91cyIQY2hlY2tUYXJnZXRFcG9jaCINJHQwMTc5NzAxODAxMCIbZ3d4QW1vdW50QXRFbmRUb3RhbFByZXZpb3VzIgx2b3RpbmdSZXN1bHQiDHZvdGVQcmV2aW91cyIadm90aW5nUmVzdWx0U3Rha2VkUHJldmlvdXMiDHN0YWtlZEJ5VXNlciIZdm90aW5nUmVzdWx0U3Rha2VkQWN0aW9ucyIHYWN0aW9ucyIFZm9yY2UiC3RhcmdldEVwb2NoIgxjdXJyZW50RXBvY2giDSR0MDIwMzY3MjA0MDciAXIiBXNoYXJlIg9tb2RpZnlXZWlnaHRJbnYiEHBvb2xzTGlzdEFjdGlvbnMiDXByZXZpb3VzRXBvY2giCG5ld0Vwb2NoIhRuZXdFcG9jaExlbmd0aE9wdGlvbiIVbmV3RXBvY2hMZW5ndGhBY3Rpb25zIgpwb29sT3JVbml0Igp1c2VyT3JVbml0IgckbWF0Y2gxIgxwb29sc0hlYWRTdHIiDm5leHRVc2VyT3JVbml0IgR1c2VyIgRuZXh0Ig5wcm9jZXNzVm90ZUludiIObmV4dFBvb2xPclVuaXQiByRtYXRjaDIiCG5leHRVc2VyIhNnd3hSZXdhcmREZXBvc2l0SW52IgtuZXh0UG9vbFN0ciIHY291bnRlciIGcmVzdWx0IghtYXhEZXB0aCIDaW52IgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXk+AAFhAgJfXwABYgCAwtcvAAFjAAoAAWQAAAABZQABAAFmCQC5CQIJAMwIAgICJXMJAMwIAgILZXBvY2hMZW5ndGgFA25pbAUBYQABZwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQZXBvY2hMZW5ndGhfX25ldwUDbmlsBQFhAQFoAQFpCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtlcG9jaExlbmd0aAkAzAgCCQCkAwEFAWkFA25pbAUBYQABagkAuQkCCQDMCAICAiVzCQDMCAICDGN1cnJlbnRFcG9jaAUDbmlsBQFhAAFrCQC5CQIJAMwIAgICJXMJAMwIAgIIbWF4RGVwdGgFA25pbAUBYQABbAkAuQkCCQDMCAICAiVzCQDMCAICH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QFA25pbAUBYQABbQkAuQkCCQDMCAICAiVzCQDMCAICD2ZhY3RvcnlDb250cmFjdAUDbmlsBQFhAAFuCQC5CQIJAMwIAgICJXMJAMwIAgIQYm9vc3RpbmdDb250cmFjdAUDbmlsBQFhAAFvCQC5CQIJAMwIAgICJXMJAMwIAgIPc3Rha2luZ0NvbnRyYWN0BQNuaWwFAWEAAXAJALkJAgkAzAgCAgIlcwkAzAgCAhFmaW5hbGl6YXRpb25TdGFnZQUDbmlsBQFhAAFxCQC5CQIJAMwIAgICJXMJAMwIAgIIbmV4dFBvb2wFA25pbAUBYQABcgkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRVc2VyBQNuaWwFAWEAAXMJALkJAgkAzAgCAgIlcwkAzAgCAgtzdGFydEhlaWdodAUDbmlsBQFhAAF0CQC5CQIJAMwIAgICJXMJAMwIAgIOY3VycmVudEVwb2NoVWkFA25pbAUBYQABdQkAuQkCCQDMCAICAiVzCQDMCAICDXN0YXJ0SGVpZ2h0VWkFA25pbAUBYQABdgkAuQkCCQDMCAICAiVzCQDMCAICBWZvcmNlBQNuaWwFAWEBAXcBAWkJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUBaQUDbmlsBQFhAQF4AQFpCQC5CQIJAMwIAgIEJXMlZAkAzAgCAglmaW5hbGl6ZWQJAMwIAgkApAMBBQFpBQNuaWwFAWEBAXkBAXoEAUEFAXoEAUIIBQFBAl8xBAFDCAUBQQJfMgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZpbkxpc3QJAMwIAgUBQgkAzAgCBQFDBQNuaWwFAWEBAUQCAUUBaQkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgR1c2VkCQDMCAIJAKUIAQUBRQkAzAgCCQCkAwEFAWkFA25pbAUBYQEBRgMBegFFAWkEAUcFAXoEAUIIBQFHAl8xBAFDCAUBRwJfMgkAuQkCCQDMCAICCiVzJXMlcyVzJWQJAMwIAgIEdm90ZQkAzAgCBQFCCQDMCAIFAUMJAMwIAgkApQgBBQFFCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFIAgF6AWkEAUkFAXoEAUIIBQFJAl8xBAFDCAUBSQJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICDHZvdGluZ1Jlc3VsdAkAzAgCBQFCCQDMCAIFAUMJAMwIAgkApAMBBQFpBQNuaWwFAWEBAUoCAUsBaQkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhJ2b3RpbmdSZXN1bHRTdGFrZWQJAMwIAgUBSwkAzAgCCQCkAwEFAWkFA25pbAUBYQEBTAIBegFpBAFNBQF6BAFCCAUBTQJfMQQBQwgFAU0CXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAglwb29sU2hhcmUJAMwIAgUBQgkAzAgCBQFDCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFOAQFpCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgp0b3RhbFZvdGVzCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFPAgFLAVAJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGc3Rha2VkCQDMCAIFAVAJAMwIAgUBSwUDbmlsBQFhAQFRAQFSCQC5CQIJAMwIAgIVdm90aW5nX2VtaXNzaW9uLnJpZGU6CQDMCAIFAVIFA25pbAIBIAEBUwEBUgkAAgEJAQFRAQUBUgEBVAMBRQFVAVYEAVcJAQFRAQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQFFCQDMCAICAS4JAMwIAgUBVQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIACQETdmFsdWVPckVycm9yTWVzc2FnZQIEAVgFAVYDCQABAgUBWAIGU3RyaW5nBAFZBQFYCQCdCAIFAUUFAVUDCQABAgUBWAIDSW50BAFaBQFYCQCaCAIFAUUFAVUJAQFTAQISaW52YWxpZCBlbnRyeSB0eXBlBQFXAQJhYQIBRQFVCgACYWIJAQFUAwUBRQUBVQIAAwkAAQIFAmFiAgZTdHJpbmcFAmFiCQACAQkArAICCQADAQUCYWICGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwECYWMCAUUBVQoAAmFiCQEBVAMFAUUFAVUAAAMJAAECBQJhYgIDSW50BQJhYgkAAgEJAKwCAgkAAwEFAmFiAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBAmFkAQF6CQCsAgIJAKwCAggFAXoCXzEFAWEIBQF6Al8yAQJhZQEBWQQCYWYJALUJAgUBWQUBYQMJAAACCQCQAwEFAmFmAAIJAJQKAgkAkQMCBQJhZgAACQCRAwIFAmFmAAEJAQFTAQITaW52YWxpZCBwb29sIHN0cmluZwACYWcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhYQIFBHRoaXMFAW0AAmFoAAoBAmFpAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFqAQJhawkAtQkCCQECYWECBQJhawkBAmFpAAUBYQECYWwBAmFtCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFtBQJhaAECYW4CAUIBQwoBAmFvAQJhcAkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhcAoBAmFxAgJhcgJhcwkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fCQCkAwEFAmFyAgJfXwkApAMBBQJhcwIjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QKAQJhdAECYXUJAKwCAgkArAICAgglcyVzJXNfXwUCYXUCIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0BAJhdgkBAmFjAgUCYWcJAQJhbwEFAUIEAmF3CQECYWMCBQJhZwkBAmFvAQUBQwQCYXUJAQJhYQIFAmFnCQECYXECBQJhdgUCYXcEAmF4CQECYWECBQJhZwkBAmF0AQUCYXUFAmF4AQJheQEBegQCYXoFAXoEAUIIBQJhegJfMQQBQwgFAmF6Al8yCgACYWIJAPwHBAUCYWcCGGNoZWNrV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQFCCQDMCAIFAUMFA25pbAUDbmlsAwkAAQIFAmFiAgdCb29sZWFuBQJhYgkAAgEJAKwCAgkAAwEFAmFiAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAQJhQQAEAmFtCQECYWoBBQJhZwQCYUIJAQJhbAEFAmFtCQD8BwQFAmFCAgdkZXBvc2l0BQNuaWwFA25pbAACYUMCBXBvb2xzAQJhRAEBegQCYUUFAXoEAUIIBQJhRQJfMQQBQwgFAmFFAl8yCQC5CQIJAMwIAgIFdm90ZXMJAMwIAgUBQgkAzAgCBQFDBQNuaWwFAWEBAmFGAQJhRwQCYUgDCQAAAgUCYUcFAmFDAgQlcyVzAgglcyVzJXMlcwkAuQkCCQDMCAIFAmFICQDMCAIFAmFHCQDMCAICBGhlYWQFA25pbAUBYQECYUkBAmFHBAJhSAMJAAACBQJhRwUCYUMCBCVzJXMCCCVzJXMlcyVzCQC5CQIJAMwIAgUCYUgJAMwIAgUCYUcJAMwIAgIEc2l6ZQUDbmlsBQFhAQJhSgICYUcCYUsEAmFIAwkAAAIFAmFHBQJhQwIIJXMlcyVzJXMCCiVzJXMlcyVzJXMJALkJAgkAzAgCBQJhSAkAzAgCBQJhRwkAzAgCBQJhSwkAzAgCAgRwcmV2BQNuaWwFAWEBAmFMAgJhRwJhSwQCYUgDCQAAAgUCYUcFAmFDAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFAmFICQDMCAIFAmFHCQDMCAIFAmFLCQDMCAICBG5leHQFA25pbAUBYQECYU0CAmFHAmFLBAJhTgkAnQgCBQR0aGlzCQECYUYBBQJhRwQCYU8JAJ0IAgUEdGhpcwkBAmFKAgUCYUcFAmFLBAJhUAkAnQgCBQR0aGlzCQECYUwCBQJhRwUCYUsDAwkAAAIFAmFLCQELdmFsdWVPckVsc2UCBQJhTgIABgkBAiE9AgUCYU8FBHVuaXQGCQECIT0CBQJhUAUEdW5pdAECYVECAmFHAmFLBAJhTgkAnQgCBQR0aGlzCQECYUYBBQJhRwQCYVIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFJAQUCYUcAAAQCYVMDCQEBIQEJAQJhTQIFAmFHBQJhSwYJAQFTAQILTm9kZSBleGlzdHMDCQAAAgUCYVMFAmFTCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFJAQUCYUcJAGQCBQJhUgABBQNuaWwDCQECIT0CBQJhTgUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYUwCBQJhRwUCYUsJAQV2YWx1ZQEFAmFOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhSgIFAmFHCQEFdmFsdWUBBQJhTgUCYUsFA25pbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhRgEFAmFHBQJhSwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJhVAICYUcCYUsEAmFOCQCdCAIFBHRoaXMJAQJhRgEFAmFHBAJhUgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYUkBBQJhRwAABAJhTwkAnQgCBQR0aGlzCQECYUoCBQJhRwUCYUsEAmFQCQCdCAIFBHRoaXMJAQJhTAIFAmFHBQJhSwkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUkBBQJhRwkAZQIFAmFSAAEFA25pbAMDCQECIT0CBQJhTwUEdW5pdAkBAiE9AgUCYVAFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhTAIFAmFHCQEFdmFsdWUBBQJhTwkBBXZhbHVlAQUCYVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFKAgUCYUcJAQV2YWx1ZQEFAmFQCQEFdmFsdWUBBQJhTwkAzAgCCQELRGVsZXRlRW50cnkBCQECYUoCBQJhRwUCYUsJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFMAgUCYUcFAmFLBQNuaWwDCQECIT0CBQJhUAUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYUYBBQJhRwkBBXZhbHVlAQUCYVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFMAgUCYUcFAmFLCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhSgIFAmFHCQEFdmFsdWUBBQJhUAUDbmlsAwkBAiE9AgUCYU8FBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFKAgUCYUcFAmFLCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhTAIFAmFHCQEFdmFsdWUBBQJhTwUDbmlsAwkAAAIFAmFLCQELdmFsdWVPckVsc2UCBQJhTgIACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhRgEFAmFHBQNuaWwJAQFTAQkArAICCQCsAgIJAKwCAgIOaW52YWxpZCBub2RlOiAFAmFHAgEuBQJhSwECYVUAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwECYVYAAhQlc19fbWFuYWdlclB1YmxpY0tleQECYVcABAFYCQCiCAEJAQJhVQADCQABAgUBWAIGU3RyaW5nBAJhWAUBWAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYVgFBHRoaXMBAmFZAAQCYVoJAQJhVwAEAVgJAJ0IAgUCYVoJAQJhVgADCQABAgUBWAIGU3RyaW5nBAJhWAUBWAkA2QQBBQJhWAMJAAECBQFYAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmJhAQJiYgQBWAkBAmFZAAMJAAECBQFYAgpCeXRlVmVjdG9yBAJiYwUBWAkAAAIIBQJiYg9jYWxsZXJQdWJsaWNLZXkFAmJjAwkAAQIFAVgCBFVuaXQJAAACCAUCYmIGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmJkAQJiYgMJAQJiYQEFAmJiBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkAQJiZQECYmIDCQAAAggFAmJiBmNhbGxlcgUEdGhpcwYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZA8CYmIBGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAICYmYCYmcEAmJoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBAmFhAgUEdGhpcwUBbgkBAVEBAiFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAJQKAgUDbmlsCgACYWIJAPwHBAUCYmgCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFAmJmCQDMCAIFAmJnBQNuaWwFA25pbAMJAAECBQJhYgIDSW50BQJhYgkAAgEJAKwCAgkAAwEFAmFiAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQCYmIBC2NvbnN0cnVjdG9yBQJhZwJiaQJiagJiawJibAQCYm0JAMwIAgkBAmJkAQUCYmIJAMwIAgMJAQIhPQIJAKYIAQUCYWcFBHVuaXQGAiBpbnZhbGlkIGZhY3RvcnkgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJiaQUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJqBQR1bml0BgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJrBQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQJibAAABgkBAVMBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJtBQJibQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAW0FAmFnCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWwFAmJpCQDMCAIJAQtTdHJpbmdFbnRyeQIFAW4FAmJqCQDMCAIJAQtTdHJpbmdFbnRyeQIFAW8FAmJrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFmBQJibAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJiAQZjcmVhdGUCAUIBQwQCYm0JAMwIAgMJAAACCQDYBAEICAUCYmIGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWwCAAYJAQJiZAEFAmJiBQNuaWwDCQAAAgUCYm0FAmJtBAF6CQCUCgIFAUIFAUMEAmJuCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF5AQUBegYFA25pbAkBAmFRAgUCYUMJAQJhZAEFAXoEAmJvCQAAAgkAmggCBQR0aGlzBQFqBQR1bml0BAJicAMFAmJvBAFpAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFAWoFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF3AQUBaQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFzBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAXQFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIFAXUFBmhlaWdodAUDbmlsBQNuaWwJAJQKAgkAzggCBQJibgUCYnAFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmIBBHZvdGUDAUIBQwJicQQBegkAlAoCBQFCBQFDBAFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWoAAAQCYnIJAQJhYwIFBHRoaXMJAQF3AQUBaQQCYmwJAQJhYwIFBHRoaXMFAWYEAmJzCQBkAgUCYnIFAmJsBAJidAkAmggCBQR0aGlzBQFwBAJidQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRAIIBQJiYgZjYWxsZXIFAWkAAAQCYnYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUYDBQF6CAUCYmIGY2FsbGVyBQFpAAAEAmJ3CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFIAgUBegUBaQAABAJieAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTgEFAWkAAAQCYnkKAAJhYgkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgkA2AQBCAgFAmJiBmNhbGxlcgVieXRlcwkAzAgCBQJicwUDbmlsBQNuaWwDCQABAgUCYWICA0ludAUCYWIJAAIBCQCsAgIJAAMBBQJhYgIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJiegkAZQIFAmJ5BQJidQQCYkEJAGQCBQJidgUCYnEEAmJCCQECYXkBBQF6BAJibQkAzAgCAwkBAiE9AgkAoAgBCQEBeQEFAXoFBHVuaXQGCQEBUwECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYnMFBmhlaWdodAYJAQFTAQIOaW52YWxpZCBoZWlnaHQJAMwIAgMJAAACBQJidAUEdW5pdAYJAQFTAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUCYnkAAAYJAQFTAQITeW91IGRvIG5vdCBoYXZlIGdXWAkAzAgCAwMJAGYCBQJicQAACQBnAgUCYnoFAmJxBwYJAQFTAQIOaW52YWxpZCBhbW91bnQJAMwIAgMFAmJCBgkBAVMBAh1wb29sIGhhc24ndCBXWF9FTUlTU0lPTiBsYWJlbAUDbmlsAwkAAAIFAmJtBQJibQQCYkMJAQJhRAEFAXoEAVAJAKUIAQgFAmJiBmNhbGxlcgQCYkQDCQECYU0CBQJiQwUBUAUDbmlsCQECYVECBQJiQwUBUAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAggFAmJiBmNhbGxlcgUBaQkAZAIFAmJ1BQJicQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUYDBQF6CAUCYmIGY2FsbGVyBQFpBQJiQQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUgCBQF6BQFpCQBkAgUCYncFAmJxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTgEFAWkJAGQCBQJieAUCYnEFA25pbAUCYkQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmIBCmNhbmNlbFZvdGUCAUIBQwQBegkAlAoCBQFCBQFDBAFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWoAAAQCYnIJAQJhYwIFBHRoaXMJAQF3AQUBaQQCYmwJAQJhYwIFBHRoaXMFAWYEAmJzCQBkAgUCYnIFAmJsBAJidAkAmggCBQR0aGlzBQFwBAJidQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRAIIBQJiYgZjYWxsZXIFAWkAAAQCYnYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUYDBQF6CAUCYmIGY2FsbGVyBQFpAAAEAmJ3CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFIAgUBegUBaQAABAJieAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTgEFAWkAAAQCYm0JAMwIAgMJAQIhPQIJAKAIAQkBAXkBBQF6BQR1bml0BgkBAVMBAg5pbnZhbGlkIGFzc2V0cwkAzAgCAwkAZgIFAmJzBQZoZWlnaHQGCQEBUwECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUCYnQFBHVuaXQGCQEBUwECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFAmJ2AAAGCQEBUwECB25vIHZvdGUFA25pbAMJAAACBQJibQUCYm0EAmJDCQECYUQBBQF6BAFQCQClCAEIBQJiYgZjYWxsZXIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRAIIBQJiYgZjYWxsZXIFAWkJAJYDAQkAzAgCCQBlAgUCYnUFAmJ2CQDMCAIAAAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFGAwUBeggFAmJiBmNhbGxlcgUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUgCBQF6BQFpCQBlAgUCYncFAmJ2CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTgEFAWkJAGUCBQJieAUCYnYFA25pbAkBAmFUAgUCYkMFAVAFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmIBDnNldEVwb2NoTGVuZ3RoAQJiRQQCYm0JAMwIAgkBAmJkAQUCYmIJAMwIAgMJAGYCBQJiRQAABgkBAVMBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJtBQJibQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFnBQJiRQUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJiAQtzZXRNYXhEZXB0aAECYkYEAmJtCQDMCAIJAQJiZAEFAmJiCQDMCAIDCQBmAgUCYkYAAAYJAQFTAQIRaW52YWxpZCBtYXggZGVwdGgFA25pbAMJAAACBQJibQUCYm0JAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBawUCYkYFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYgETcHJvY2Vzc1ZvdGVJTlRFUk5BTAICYkcBUAQCYkgJAQJiZQEFAmJiAwkAAAIFAmJIBQJiSAQCYmYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFQCQEBUQEJAKwCAgIqcHJvY2Vzc1ZvdGVJTlRFUk5BTDogaW52YWxpZCB1c2VyIGFkZHJlc3MgBQFQBAFpCQECYWMCBQR0aGlzBQFqBAJiSQkAZQIFAWkAAQQCYmwJAQJhYwIFBHRoaXMFAWYEAmJyCQECYWMCBQR0aGlzCQEBdwEFAWkEAmJzCQBkAgUCYnIFAmJsBAJiSgkBAmFjAgUEdGhpcwkBAXcBBQJiSQQCYksJAQJhYwIFBHRoaXMJAQFoAQUCYkkEAmJMCQBkAgUCYkoFAmJLBAJiTQMJAGcCBQJiSQAABgkBAVMBAitwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHByZXZpb3VzIGVwb2NoAwkAAAIFAmJNBQJiTQQBegkBAmFlAQUCYkcEAmJOBQF6BAFCCAUCYk4CXzEEAUMIBQJiTgJfMgQCYkIJAQJheQEFAXoEAmJ5CgACYWIJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAVAJAMwIAgUCYnMFA25pbAUDbmlsAwkAAQIFAmFiAgNJbnQFAmFiCQACAQkArAICCQADAQUCYWICGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYk8KAAJhYgkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgUBUAkAzAgCBQJiTAUDbmlsBQNuaWwDCQABAgUCYWICA0ludAUCYWIJAAIBCQCsAgIJAAMBBQJhYgIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJieAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBTgEFAWkAAAQCYlAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAUgCBQF6BQFpAAAEAmJRCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBAUYDBQF6BQJiZgUCYkkJAQFRAQkArAICCQCsAgIJAKwCAgkArAICAhRwcm9jZXNzVm90ZUlOVEVSTkFMIAUCYkcCASAFAVACEjogbm8gcHJldmlvdXMgdm90ZQQCYnUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUQCBQJiZgUBaQAABAFLCQECYW4CBQFCBQFDBAJiUgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBSgIFAUsFAmJJAAAEAmJrCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYWECBQR0aGlzBQFvBAJiUwkBC3ZhbHVlT3JFbHNlAgkAmggCBQJiawkBAU8CBQFLBQFQAAAEAmJUAwkAAAIFAmJTAAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUoCBQFLBQJiSQkAZAIFAmJSBQJiUQUDbmlsBAJiQQMJAGYCBQJiTwAACQBrAwUCYlEFAmJ5BQJiTwAABAJiVQMDCQBmAgUCYkEAAAUCYkIHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRgMFAXoFAmJmBQFpBQJiQQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAU4BBQFpCQBkAgUCYngFAmJBCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBSAIFAXoFAWkJAGQCBQJiUAUCYkEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAgUCYmYFAWkJAGQCBQJidQUCYkEFA25pbAkBAmFUAgkBAmFEAQUBegUBUAkAlAoCCQDOCAIFAmJVBQJiVAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYgETcHJvY2Vzc1Bvb2xJTlRFUk5BTAICYkcCYlYEAmJICQECYmUBBQJiYgMJAAACBQJiSAUCYkgEAmJXBAJiWAkBAmFjAgUEdGhpcwUBagMFAmJWBQJiWAkAZQIFAmJYAAEEAmJNAwkAZwIFAmJXAAAGCQEBUwECKXByb2Nlc3NQb29sSU5URVJOQUw6IGludmFsaWQgdGFyZ2V0IGVwb2NoAwkAAAIFAmJNBQJiTQQBegkBAmFlAQUCYkcEAmJZBQF6BAFCCAUCYlkCXzEEAUMIBQJiWQJfMgQCYmsJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhYQIFBHRoaXMFAW8EAmF4CQECYW4CBQFCBQFDBAJiWgoAAmFiCQD8BwQFAmJrAhJ1c2Vyc0xpc3RUcmF2ZXJzYWwJAMwIAgUCYXgFA25pbAUDbmlsAwkAAQIFAmFiAgdCb29sZWFuBQJhYgkAAgEJAKwCAgkAAwEFAmFiAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmJaBQJiWgMFAmJaCQCUCgIFA25pbAYEAmJCCQECYXkBBQF6BAJieAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTgEFAmJXAAAEAmJQCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFIAgUBegUCYlcAAAQCY2EDAwkAAAIFAmJ4AAAGCQEBIQEFAmJCAAAJAGsDBQJiUAUBYgUCYngEAmNiCQD8BwQFAmFnAgxtb2RpZnlXZWlnaHQJAMwIAgUCYXgJAMwIAgUCY2EFA25pbAUDbmlsAwkAAAIFAmNiBQJjYgQCY2MDAwUCYkIGBQJiVgUDbmlsCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAXkBBQF6BQNuaWwJAQJhVAIFAmFDBQJiRwkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFMAgUBegUCYlcFAmNhBQNuaWwFAmNjBwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYgEOZmluYWxpemVIZWxwZXIABAJiVgkBC3ZhbHVlT3JFbHNlAgkAoAgBBQF2BwQBaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFqAAAEAmNkCQBlAgUBaQABBAJicgkBAmFjAgUEdGhpcwkBAXcBBQFpBAJibAkBAmFjAgUEdGhpcwUBZgQCYnMJAGQCBQJicgUCYmwEAmJ0CQCaCAIFBHRoaXMFAXADAwMJAGcCBQZoZWlnaHQFAmJzCQAAAgUCYnQFBHVuaXQHCQEBIQEFAmJWBwQCY2UJAGQCBQFpAAEEAmNmCQCaCAIFBHRoaXMFAWcEAmNnBAFYBQJjZgMJAAECBQFYAgNJbnQEAmJFBQFYCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFmBQJiRQkAzAgCCQELRGVsZXRlRW50cnkBBQFnBQNuaWwDCQABAgUBWAIEVW5pdAUDbmlsCQACAQILTWF0Y2ggZXJyb3IJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdwEFAmNlBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAXMFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBagUCY2UJAMwIAgkBDEludGVnZXJFbnRyeQIFAXAFAWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFoAQUBaQUCYmwFA25pbAUCY2cGAwMFAmJWCQAAAgUCYnQFBHVuaXQHCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXAFAWUFA25pbAYDCQAAAgUCYnQFBHVuaXQJAJQKAgUDbmlsBwMJAAACBQJidAUBZAQCY2gJAKIIAQUBcQQCY2kJAKIIAQUBcgQBWAUCY2gDCQABAgUBWAIEVW5pdAQCY2oJAKIIAQkBAmFGAQUCYUMDCQABAgUCY2oCBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcAUBZQkAzAgCCQELRGVsZXRlRW50cnkBBQFxCQDMCAIJAQtEZWxldGVFbnRyeQEFAXIFA25pbAYDCQABAgUCY2oCBlN0cmluZwQCY2sFAmNqCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcQUCY2sFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQFYAgZTdHJpbmcEAmJHBQFYBAF6CQECYWUBBQJiRwQCY2wEAmNqBQJjaQMJAAECBQJjagIEVW5pdAkAoggBCQECYUYBCQECYUQBBQF6AwkAAQIFAmNqAgZTdHJpbmcEAmNtBQJjagQCY24JAKIIAQkBAmFMAgkBAmFEAQUBegUCY20DCQAAAgUCY24FAmNuBAJjbwkA/AcEBQR0aGlzAhNwcm9jZXNzVm90ZUlOVEVSTkFMCQDMCAIFAmJHCQDMCAIFAmNtBQNuaWwFA25pbAMJAAACBQJjbwUCY28FAmNuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQILTWF0Y2ggZXJyb3IEAmNqBQJjbAMJAAECBQJjagIEVW5pdAQCY3AJAKIIAQkBAmFMAgUCYUMFAmJHBAJjcQUCY3ADCQABAgUCY3ECBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBcAUBZQkAzAgCCQELRGVsZXRlRW50cnkBBQFxCQDMCAIJAQtEZWxldGVFbnRyeQEFAXIFA25pbAYDCQABAgUCY3ECBlN0cmluZwQCYVgFAmNxCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcQUCYVgJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAmNqAgZTdHJpbmcEAmNyBQJjagkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXIFAmNyBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAgtNYXRjaCBlcnJvcgMJAAACBQJidAUBZQQCY2gJAKIIAQUBcQQBWAUCY2gDCQABAgUBWAIEVW5pdAQCY2oJAKIIAQkBAmFGAQUCYUMDCQABAgUCY2oCBFVuaXQEAmJVAwUCYlYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcAkAzAgCCQELRGVsZXRlRW50cnkBBQF2BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAXgBBQJjZAYJAMwIAgkBDEludGVnZXJFbnRyeQIFAXQFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIFAXUFAmJyBQNuaWwEAmNzCQECYUEAAwkAAAIFAmNzBQJjcwkAlAoCBQJiVQYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQABAgUCY2oCBlN0cmluZwQCY3QFAmNqCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcQUCY3QFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQFYAgZTdHJpbmcEAmJHBQFYBAJjcAkAoggBCQECYUwCBQJhQwUCYkcDCQAAAgUCY3AFAmNwBAJiWgoAAmFiCQD8BwQFBHRoaXMCE3Byb2Nlc3NQb29sSU5URVJOQUwJAMwIAgUCYkcJAMwIAgUCYlYFA25pbAUDbmlsAwkAAQIFAmFiAgdCb29sZWFuBQJhYgkAAgEJAKwCAgkAAwEFAmFiAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmJaBQJiWgMFAmJaCQCUCgIFA25pbAYEAmNqBQJjcAMJAAECBQJjagIEVW5pdAQCYlUDBQJiVgkAzAgCCQELRGVsZXRlRW50cnkBBQFwCQDMCAIJAQtEZWxldGVFbnRyeQEFAXYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcQUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAXAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF4AQUCY2QGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQJicgkAzAgCCQELRGVsZXRlRW50cnkBBQFxBQNuaWwEAmNzCQECYUEAAwkAAAIFAmNzBQJjcwkAlAoCBQJiVQYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQABAgUCY2oCBlN0cmluZwQCY3QFAmNqCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcQUCY3QFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yCQEBUwECFmZpbmFsaXphdGlvbiBpcyBicm9rZW4CYmIBD2ZpbmFsaXplV3JhcHBlcgECY3UEAmN2CgACYWIJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAmFiAgdCb29sZWFuBQJhYgkAAgEJAKwCAgkAAwEFAmFiAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmN2BQJjdgMJAQEhAQUCY3YDCQAAAgUCY3UAAAkBAVMBAh5DdXJyZW50IHZvdGluZyBpcyBub3Qgb3ZlciB5ZXQJAJQKAgUDbmlsBQR1bml0BAJjdwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrBQFjAwkAZgIFAmN3BQJjdQQCY3gJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGQCBQJjdQABBQNuaWwFA25pbAMJAAACBQJjeAUCY3gJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYgEIZmluYWxpemUABAJjeAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQJjeAUCY3gJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJiARRjb250YWluc05vZGVSRUFET05MWQICYUcCYUsJAJQKAgUDbmlsCQECYU0CBQJhRwUCYUsCYmIBCmluc2VydE5vZGUCAmFHAmFLBAJiSAkBAmJkAQUCYmIDCQAAAgUCYkgFAmJICQCUCgIJAQJhUQIFAmFHBQJhSwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYgEKZGVsZXRlTm9kZQICYUcCYUsEAmJICQECYmQBBQJiYgMJAAACBQJiSAUCYkgJAJQKAgkBAmFUAgUCYUcFAmFLBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJjeQECY3oABAJjQQQBWAkBAmFZAAMJAAECBQFYAgpCeXRlVmVjdG9yBAJiYwUBWAUCYmMDCQABAgUBWAIEVW5pdAgFAmN5D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJjeQlib2R5Qnl0ZXMJAJEDAggFAmN5BnByb29mcwAABQJjQX6PrfM=", "height": 2603411, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Eoz4Z5PLKEWMFDfk3qhyAAGGH2R9woswAGDDgd32o3sz Next: 5kgukao7QtUdYscifwwMwk49TTcjoykra9FMENNFcinL Diff:
OldNewDifferences
2323 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
2424
2525 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
26-
27-let keyVotingEmissionRateContract = makeString(["%s", "votingEmissionRateContract"], separator)
2826
2927 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
3028
5351
5452
5553 func keyInList (pool) = {
56- let $t017881828 = pool
57- let amountAssetId = $t017881828._1
58- let priceAssetId = $t017881828._2
54+ let $t016931733 = pool
55+ let amountAssetId = $t016931733._1
56+ let priceAssetId = $t016931733._2
5957 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6058 }
6159
6462
6563
6664 func keyVote (pool,address,epoch) = {
67- let $t021022142 = pool
68- let amountAssetId = $t021022142._1
69- let priceAssetId = $t021022142._2
65+ let $t020072047 = pool
66+ let amountAssetId = $t020072047._1
67+ let priceAssetId = $t020072047._2
7068 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
7169 }
7270
7371
7472 func keyVotingResult (pool,epoch) = {
75- let $t023242364 = pool
76- let amountAssetId = $t023242364._1
77- let priceAssetId = $t023242364._2
73+ let $t022292269 = pool
74+ let amountAssetId = $t022292269._1
75+ let priceAssetId = $t022292269._2
7876 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7977 }
8078
8381
8482
8583 func keyPoolShare (pool,epoch) = {
86- let $t026852725 = pool
87- let amountAssetId = $t026852725._1
88- let priceAssetId = $t026852725._2
84+ let $t025902630 = pool
85+ let amountAssetId = $t025902630._1
86+ let priceAssetId = $t025902630._2
8987 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
9088 }
9189
171169
172170
173171 func checkWxEmissionPoolLabel (pool) = {
174- let $t055655605 = pool
175- let amountAssetId = $t055655605._1
176- let priceAssetId = $t055655605._2
172+ let $t054705510 = pool
173+ let amountAssetId = $t054705510._1
174+ let priceAssetId = $t054705510._2
177175 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
178176 if ($isInstanceOf(@, "Boolean"))
179177 then @
191189 let poolsListName = "pools"
192190
193191 func getVotesListName (pool) = {
194- let $t060226062 = pool
195- let amountAssetId = $t060226062._1
196- let priceAssetId = $t060226062._2
192+ let $t059275967 = pool
193+ let amountAssetId = $t059275967._1
194+ let priceAssetId = $t059275967._2
197195 makeString(["votes", amountAssetId, priceAssetId], separator)
198196 }
199197
504502 if ((checkTargetEpoch == checkTargetEpoch))
505503 then {
506504 let pool = stringToPool(poolStr)
507- let $t01806518105 = pool
508- let amountAssetId = $t01806518105._1
509- let priceAssetId = $t01806518105._2
505+ let $t01797018010 = pool
506+ let amountAssetId = $t01797018010._1
507+ let priceAssetId = $t01797018010._2
510508 let wxEmission = checkWxEmissionPoolLabel(pool)
511509 let gwxAmountAtEndTotal = {
512510 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
565563 if ((checkTargetEpoch == checkTargetEpoch))
566564 then {
567565 let pool = stringToPool(poolStr)
568- let $t02046220502 = pool
569- let amountAssetId = $t02046220502._1
570- let priceAssetId = $t02046220502._2
566+ let $t02036720407 = pool
567+ let amountAssetId = $t02036720407._1
568+ let priceAssetId = $t02036720407._2
571569 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
572570 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
573571 let r = {
754752
755753 @Callable(i)
756754 func finalizeWrapper (counter) = {
757- let votingEmissionRateContract = addressFromStringValue(getStringValue(this, keyVotingEmissionRateContract))
758755 let result = {
759756 let @ = invoke(this, "finalizeHelper", nil, nil)
760757 if ($isInstanceOf(@, "Boolean"))
765762 then if (!(result))
766763 then if ((counter == 0))
767764 then throwErr("Current voting is not over yet")
768- else {
769- let inv = invoke(votingEmissionRateContract, "finalize", nil, nil)
770- if ((inv == inv))
771- then $Tuple2(nil, unit)
772- else throw("Strict value is not equal to itself.")
773- }
765+ else $Tuple2(nil, unit)
774766 else {
775767 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
776768 if ((maxDepth > counter))
821813 }
822814
823815
824-
825-@Callable(i)
826-func isFinalizationInProgress () = {
827- let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
828- let finalizationInProgress = (finalizationStageOrUnit != unit)
829- $Tuple2(nil, finalizationInProgress)
830- }
831-
832-
833816 @Verifier(tx)
834817 func verify () = {
835818 let targetPublicKey = match managerPublicKeyOrUnit() {
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)
26-
27-let keyVotingEmissionRateContract = makeString(["%s", "votingEmissionRateContract"], separator)
2826
2927 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
3028
3129 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3230
3331 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
3432
3533 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
3634
3735 let keyNextPool = makeString(["%s", "nextPool"], separator)
3836
3937 let keyNextUser = makeString(["%s", "nextUser"], separator)
4038
4139 let keyStartHeight = makeString(["%s", "startHeight"], separator)
4240
4341 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
4442
4543 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
4644
4745 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
4846
4947 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
5048
5149
5250 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
5351
5452
5553 func keyInList (pool) = {
56- let $t017881828 = pool
57- let amountAssetId = $t017881828._1
58- let priceAssetId = $t017881828._2
54+ let $t016931733 = pool
55+ let amountAssetId = $t016931733._1
56+ let priceAssetId = $t016931733._2
5957 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6058 }
6159
6260
6361 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
6462
6563
6664 func keyVote (pool,address,epoch) = {
67- let $t021022142 = pool
68- let amountAssetId = $t021022142._1
69- let priceAssetId = $t021022142._2
65+ let $t020072047 = pool
66+ let amountAssetId = $t020072047._1
67+ let priceAssetId = $t020072047._2
7068 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
7169 }
7270
7371
7472 func keyVotingResult (pool,epoch) = {
75- let $t023242364 = pool
76- let amountAssetId = $t023242364._1
77- let priceAssetId = $t023242364._2
73+ let $t022292269 = pool
74+ let amountAssetId = $t022292269._1
75+ let priceAssetId = $t022292269._2
7876 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7977 }
8078
8179
8280 func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], separator)
8381
8482
8583 func keyPoolShare (pool,epoch) = {
86- let $t026852725 = pool
87- let amountAssetId = $t026852725._1
88- let priceAssetId = $t026852725._2
84+ let $t025902630 = pool
85+ let amountAssetId = $t025902630._1
86+ let priceAssetId = $t025902630._2
8987 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
9088 }
9189
9290
9391 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
9492
9593
9694 func keyStakedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], separator)
9795
9896
9997 func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
10098
10199
102100 func throwErr (msg) = throw(wrapErr(msg))
103101
104102
105103 func getValueOrFail (address,key,type) = {
106104 let error = wrapErr(makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
107105 valueOrErrorMessage( match type {
108106 case str: String =>
109107 getString(address, key)
110108 case int: Int =>
111109 getInteger(address, key)
112110 case _ =>
113111 throwErr("invalid entry type")
114112 }, error)
115113 }
116114
117115
118116 func getStrOrFail (address,key) = {
119117 let @ = getValueOrFail(address, key, "")
120118 if ($isInstanceOf(@, "String"))
121119 then @
122120 else throw(($getType(@) + " couldn't be cast to String"))
123121 }
124122
125123
126124 func getIntOrFail (address,key) = {
127125 let @ = getValueOrFail(address, key, 0)
128126 if ($isInstanceOf(@, "Int"))
129127 then @
130128 else throw(($getType(@) + " couldn't be cast to Int"))
131129 }
132130
133131
134132 func poolToString (pool) = ((pool._1 + separator) + pool._2)
135133
136134
137135 func stringToPool (str) = {
138136 let parts = split(str, separator)
139137 if ((size(parts) == 2))
140138 then $Tuple2(parts[0], parts[1])
141139 else throwErr("invalid pool string")
142140 }
143141
144142
145143 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
146144
147145 let IdxFactoryCfgGwxRewardDapp = 10
148146
149147 func keyFactoryCfg () = "%s__factoryConfig"
150148
151149
152150 func readFactoryCfgOrFail (factory) = split(getStrOrFail(factory, keyFactoryCfg()), separator)
153151
154152
155153 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
156154
157155
158156 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
159157 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
160158
161159 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
162160
163161 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
164162
165163 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
166164 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
167165 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
168166 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
169167 lpAssetId
170168 }
171169
172170
173171 func checkWxEmissionPoolLabel (pool) = {
174- let $t055655605 = pool
175- let amountAssetId = $t055655605._1
176- let priceAssetId = $t055655605._2
172+ let $t054705510 = pool
173+ let amountAssetId = $t054705510._1
174+ let priceAssetId = $t054705510._2
177175 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
178176 if ($isInstanceOf(@, "Boolean"))
179177 then @
180178 else throw(($getType(@) + " couldn't be cast to Boolean"))
181179 }
182180
183181
184182 func gwxRewardDeposit () = {
185183 let factoryCfg = readFactoryCfgOrFail(factoryContract)
186184 let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
187185 invoke(gwxRewardsContract, "deposit", nil, nil)
188186 }
189187
190188
191189 let poolsListName = "pools"
192190
193191 func getVotesListName (pool) = {
194- let $t060226062 = pool
195- let amountAssetId = $t060226062._1
196- let priceAssetId = $t060226062._2
192+ let $t059275967 = pool
193+ let amountAssetId = $t059275967._1
194+ let priceAssetId = $t059275967._2
197195 makeString(["votes", amountAssetId, priceAssetId], separator)
198196 }
199197
200198
201199 func keyListHead (listName) = {
202200 let meta = if ((listName == poolsListName))
203201 then "%s%s"
204202 else "%s%s%s%s"
205203 makeString([meta, listName, "head"], separator)
206204 }
207205
208206
209207 func keyListSize (listName) = {
210208 let meta = if ((listName == poolsListName))
211209 then "%s%s"
212210 else "%s%s%s%s"
213211 makeString([meta, listName, "size"], separator)
214212 }
215213
216214
217215 func keyListPrev (listName,id) = {
218216 let meta = if ((listName == poolsListName))
219217 then "%s%s%s%s"
220218 else "%s%s%s%s%s"
221219 makeString([meta, listName, id, "prev"], separator)
222220 }
223221
224222
225223 func keyListNext (listName,id) = {
226224 let meta = if ((listName == poolsListName))
227225 then "%s%s%s%s"
228226 else "%s%s%s%s%s"
229227 makeString([meta, listName, id, "next"], separator)
230228 }
231229
232230
233231 func containsNode (listName,id) = {
234232 let headOrUnit = getString(this, keyListHead(listName))
235233 let prevOrUnit = getString(this, keyListPrev(listName, id))
236234 let nextOrUnit = getString(this, keyListNext(listName, id))
237235 if (if ((id == valueOrElse(headOrUnit, "")))
238236 then true
239237 else (prevOrUnit != unit))
240238 then true
241239 else (nextOrUnit != unit)
242240 }
243241
244242
245243 func insertNodeActions (listName,id) = {
246244 let headOrUnit = getString(this, keyListHead(listName))
247245 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
248246 let checkNode = if (!(containsNode(listName, id)))
249247 then true
250248 else throwErr("Node exists")
251249 if ((checkNode == checkNode))
252250 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
253251 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
254252 else nil)) ++ [StringEntry(keyListHead(listName), id)])
255253 else throw("Strict value is not equal to itself.")
256254 }
257255
258256
259257 func deleteNodeActions (listName,id) = {
260258 let headOrUnit = getString(this, keyListHead(listName))
261259 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
262260 let prevOrUnit = getString(this, keyListPrev(listName, id))
263261 let nextOrUnit = getString(this, keyListNext(listName, id))
264262 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
265263 then (nextOrUnit != unit)
266264 else false)
267265 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
268266 else if ((nextOrUnit != unit))
269267 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
270268 else if ((prevOrUnit != unit))
271269 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
272270 else if ((id == valueOrElse(headOrUnit, "")))
273271 then [DeleteEntry(keyListHead(listName))]
274272 else throwErr(((("invalid node: " + listName) + ".") + id))))
275273 }
276274
277275
278276 func keyManagerVaultAddress () = "%s__managerVaultAddress"
279277
280278
281279 func keyManagerPublicKey () = "%s__managerPublicKey"
282280
283281
284282 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
285283 case s: String =>
286284 addressFromStringValue(s)
287285 case _ =>
288286 this
289287 }
290288
291289
292290 func managerPublicKeyOrUnit () = {
293291 let managerVaultAddress = getManagerVaultAddressOrThis()
294292 match getString(managerVaultAddress, keyManagerPublicKey()) {
295293 case s: String =>
296294 fromBase58String(s)
297295 case _: Unit =>
298296 unit
299297 case _ =>
300298 throw("Match error")
301299 }
302300 }
303301
304302
305303 func isManager (i) = match managerPublicKeyOrUnit() {
306304 case pk: ByteVector =>
307305 (i.callerPublicKey == pk)
308306 case _: Unit =>
309307 (i.caller == this)
310308 case _ =>
311309 throw("Match error")
312310 }
313311
314312
315313 func mustManager (i) = if (isManager(i))
316314 then true
317315 else throw("permission denied")
318316
319317
320318 func mustThis (i) = if ((i.caller == this))
321319 then true
322320 else throw("permission denied")
323321
324322
325323 @Callable(i)
326324 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
327325 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), wrapErr("invalid boosting contract address"))
328326 $Tuple2(nil, {
329327 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
330328 if ($isInstanceOf(@, "Int"))
331329 then @
332330 else throw(($getType(@) + " couldn't be cast to Int"))
333331 })
334332 }
335333
336334
337335
338336 @Callable(i)
339337 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
340338 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
341339 then true
342340 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
343341 then true
344342 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
345343 then true
346344 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
347345 then true
348346 else "invalid staking contract address", if ((epochLength > 0))
349347 then true
350348 else throwErr("invalid epoch length")]
351349 if ((checks == checks))
352350 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
353351 else throw("Strict value is not equal to itself.")
354352 }
355353
356354
357355
358356 @Callable(i)
359357 func create (amountAssetId,priceAssetId) = {
360358 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
361359 then true
362360 else mustManager(i)]
363361 if ((checks == checks))
364362 then {
365363 let pool = $Tuple2(amountAssetId, priceAssetId)
366364 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
367365 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
368366 let startHeightActions = if (currentEpochIsNotDefined)
369367 then {
370368 let epoch = 0
371369 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
372370 }
373371 else nil
374372 $Tuple2((inListActions ++ startHeightActions), unit)
375373 }
376374 else throw("Strict value is not equal to itself.")
377375 }
378376
379377
380378
381379 @Callable(i)
382380 func vote (amountAssetId,priceAssetId,amount) = {
383381 let pool = $Tuple2(amountAssetId, priceAssetId)
384382 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
385383 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
386384 let epochLength = getIntOrFail(this, keyEpochLength)
387385 let endHeight = (startHeight + epochLength)
388386 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
389387 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
390388 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
391389 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
392390 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
393391 let gwxAmountAtEndTotal = {
394392 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
395393 if ($isInstanceOf(@, "Int"))
396394 then @
397395 else throw(($getType(@) + " couldn't be cast to Int"))
398396 }
399397 let available = (gwxAmountAtEndTotal - used)
400398 let newVote = (vote + amount)
401399 let wxEmission = checkWxEmissionPoolLabel(pool)
402400 let checks = [if ((getBoolean(keyInList(pool)) != unit))
403401 then true
404402 else throwErr("invalid assets"), if ((endHeight > height))
405403 then true
406404 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
407405 then true
408406 else throwErr("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
409407 then true
410408 else throwErr("you do not have gWX"), if (if ((amount > 0))
411409 then (available >= amount)
412410 else false)
413411 then true
414412 else throwErr("invalid amount"), if (wxEmission)
415413 then true
416414 else throwErr("pool hasn't WX_EMISSION label")]
417415 if ((checks == checks))
418416 then {
419417 let votesListName = getVotesListName(pool)
420418 let userAddressStr = toString(i.caller)
421419 let votesListActions = if (containsNode(votesListName, userAddressStr))
422420 then nil
423421 else insertNodeActions(votesListName, userAddressStr)
424422 $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)
425423 }
426424 else throw("Strict value is not equal to itself.")
427425 }
428426
429427
430428
431429 @Callable(i)
432430 func cancelVote (amountAssetId,priceAssetId) = {
433431 let pool = $Tuple2(amountAssetId, priceAssetId)
434432 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
435433 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
436434 let epochLength = getIntOrFail(this, keyEpochLength)
437435 let endHeight = (startHeight + epochLength)
438436 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
439437 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
440438 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
441439 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
442440 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
443441 let checks = [if ((getBoolean(keyInList(pool)) != unit))
444442 then true
445443 else throwErr("invalid assets"), if ((endHeight > height))
446444 then true
447445 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
448446 then true
449447 else throwErr("finalization in progress"), if ((vote > 0))
450448 then true
451449 else throwErr("no vote")]
452450 if ((checks == checks))
453451 then {
454452 let votesListName = getVotesListName(pool)
455453 let userAddressStr = toString(i.caller)
456454 $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)
457455 }
458456 else throw("Strict value is not equal to itself.")
459457 }
460458
461459
462460
463461 @Callable(i)
464462 func setEpochLength (newEpochLength) = {
465463 let checks = [mustManager(i), if ((newEpochLength > 0))
466464 then true
467465 else throwErr("invalid epoch length")]
468466 if ((checks == checks))
469467 then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
470468 else throw("Strict value is not equal to itself.")
471469 }
472470
473471
474472
475473 @Callable(i)
476474 func setMaxDepth (newMaxDepth) = {
477475 let checks = [mustManager(i), if ((newMaxDepth > 0))
478476 then true
479477 else throwErr("invalid max depth")]
480478 if ((checks == checks))
481479 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
482480 else throw("Strict value is not equal to itself.")
483481 }
484482
485483
486484
487485 @Callable(i)
488486 func processVoteINTERNAL (poolStr,userAddressStr) = {
489487 let checkCaller = mustThis(i)
490488 if ((checkCaller == checkCaller))
491489 then {
492490 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr(("processVoteINTERNAL: invalid user address " + userAddressStr)))
493491 let epoch = getIntOrFail(this, keyCurrentEpoch)
494492 let epochPrevious = (epoch - 1)
495493 let epochLength = getIntOrFail(this, keyEpochLength)
496494 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
497495 let endHeight = (startHeight + epochLength)
498496 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
499497 let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
500498 let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
501499 let checkTargetEpoch = if ((epochPrevious >= 0))
502500 then true
503501 else throwErr("processVoteINTERNAL: invalid previous epoch")
504502 if ((checkTargetEpoch == checkTargetEpoch))
505503 then {
506504 let pool = stringToPool(poolStr)
507- let $t01806518105 = pool
508- let amountAssetId = $t01806518105._1
509- let priceAssetId = $t01806518105._2
505+ let $t01797018010 = pool
506+ let amountAssetId = $t01797018010._1
507+ let priceAssetId = $t01797018010._2
510508 let wxEmission = checkWxEmissionPoolLabel(pool)
511509 let gwxAmountAtEndTotal = {
512510 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
513511 if ($isInstanceOf(@, "Int"))
514512 then @
515513 else throw(($getType(@) + " couldn't be cast to Int"))
516514 }
517515 let gwxAmountAtEndTotalPrevious = {
518516 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
519517 if ($isInstanceOf(@, "Int"))
520518 then @
521519 else throw(($getType(@) + " couldn't be cast to Int"))
522520 }
523521 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
524522 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
525523 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), wrapErr((((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote")))
526524 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
527525 let lpAssetIdStr = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
528526 let votingResultStakedPrevious = valueOrElse(getInteger(keyVotingResultStaked(lpAssetIdStr, epochPrevious)), 0)
529527 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
530528 let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(lpAssetIdStr, userAddressStr)), 0)
531529 let votingResultStakedActions = if ((stakedByUser == 0))
532530 then nil
533531 else [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, epochPrevious), (votingResultStakedPrevious + votePrevious))]
534532 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
535533 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
536534 else 0
537535 let actions = if (if ((newVote > 0))
538536 then wxEmission
539537 else false)
540538 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
541539 else deleteNodeActions(getVotesListName(pool), userAddressStr)
542540 $Tuple2((actions ++ votingResultStakedActions), unit)
543541 }
544542 else throw("Strict value is not equal to itself.")
545543 }
546544 else throw("Strict value is not equal to itself.")
547545 }
548546
549547
550548
551549 @Callable(i)
552550 func processPoolINTERNAL (poolStr,force) = {
553551 let checkCaller = mustThis(i)
554552 if ((checkCaller == checkCaller))
555553 then {
556554 let targetEpoch = {
557555 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
558556 if (force)
559557 then currentEpoch
560558 else (currentEpoch - 1)
561559 }
562560 let checkTargetEpoch = if ((targetEpoch >= 0))
563561 then true
564562 else throwErr("processPoolINTERNAL: invalid target epoch")
565563 if ((checkTargetEpoch == checkTargetEpoch))
566564 then {
567565 let pool = stringToPool(poolStr)
568- let $t02046220502 = pool
569- let amountAssetId = $t02046220502._1
570- let priceAssetId = $t02046220502._2
566+ let $t02036720407 = pool
567+ let amountAssetId = $t02036720407._1
568+ let priceAssetId = $t02036720407._2
571569 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
572570 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
573571 let r = {
574572 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
575573 if ($isInstanceOf(@, "Boolean"))
576574 then @
577575 else throw(($getType(@) + " couldn't be cast to Boolean"))
578576 }
579577 if ((r == r))
580578 then if (r)
581579 then $Tuple2(nil, true)
582580 else {
583581 let wxEmission = checkWxEmissionPoolLabel(pool)
584582 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
585583 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
586584 let share = if (if ((totalVotes == 0))
587585 then true
588586 else !(wxEmission))
589587 then 0
590588 else fraction(votingResult, poolWeightMult, totalVotes)
591589 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
592590 if ((modifyWeightInv == modifyWeightInv))
593591 then {
594592 let poolsListActions = if (if (wxEmission)
595593 then true
596594 else force)
597595 then nil
598596 else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
599597 $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
600598 }
601599 else throw("Strict value is not equal to itself.")
602600 }
603601 else throw("Strict value is not equal to itself.")
604602 }
605603 else throw("Strict value is not equal to itself.")
606604 }
607605 else throw("Strict value is not equal to itself.")
608606 }
609607
610608
611609
612610 @Callable(i)
613611 func finalizeHelper () = {
614612 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
615613 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
616614 let previousEpoch = (epoch - 1)
617615 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
618616 let epochLength = getIntOrFail(this, keyEpochLength)
619617 let endHeight = (startHeight + epochLength)
620618 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
621619 if (if (if ((height >= endHeight))
622620 then (finalizationStageOrUnit == unit)
623621 else false)
624622 then !(force)
625623 else false)
626624 then {
627625 let newEpoch = (epoch + 1)
628626 let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
629627 let newEpochLengthActions = match newEpochLengthOption {
630628 case newEpochLength: Int =>
631629 [IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
632630 case _: Unit =>
633631 nil
634632 case _ =>
635633 throw("Match error")
636634 }
637635 $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
638636 }
639637 else if (if (force)
640638 then (finalizationStageOrUnit == unit)
641639 else false)
642640 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
643641 else if ((finalizationStageOrUnit == unit))
644642 then $Tuple2(nil, false)
645643 else if ((finalizationStageOrUnit == finalizationStageTotal))
646644 then {
647645 let poolOrUnit = getString(keyNextPool)
648646 let userOrUnit = getString(keyNextUser)
649647 match poolOrUnit {
650648 case _: Unit =>
651649 match getString(keyListHead(poolsListName)) {
652650 case _: Unit =>
653651 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
654652 case poolsHeadStr: String =>
655653 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
656654 case _ =>
657655 throw("Match error")
658656 }
659657 case poolStr: String =>
660658 let pool = stringToPool(poolStr)
661659 let nextUserOrUnit = match userOrUnit {
662660 case _: Unit =>
663661 getString(keyListHead(getVotesListName(pool)))
664662 case user: String =>
665663 let next = getString(keyListNext(getVotesListName(pool), user))
666664 if ((next == next))
667665 then {
668666 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
669667 if ((processVoteInv == processVoteInv))
670668 then next
671669 else throw("Strict value is not equal to itself.")
672670 }
673671 else throw("Strict value is not equal to itself.")
674672 case _ =>
675673 throw("Match error")
676674 }
677675 match nextUserOrUnit {
678676 case _: Unit =>
679677 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
680678 match nextPoolOrUnit {
681679 case _: Unit =>
682680 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
683681 case s: String =>
684682 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
685683 case _ =>
686684 throw("Match error")
687685 }
688686 case nextUser: String =>
689687 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
690688 case _ =>
691689 throw("Match error")
692690 }
693691 case _ =>
694692 throw("Match error")
695693 }
696694 }
697695 else if ((finalizationStageOrUnit == finalizationStageShares))
698696 then {
699697 let poolOrUnit = getString(keyNextPool)
700698 match poolOrUnit {
701699 case _: Unit =>
702700 match getString(keyListHead(poolsListName)) {
703701 case _: Unit =>
704702 let actions = if (force)
705703 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
706704 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
707705 let gwxRewardDepositInv = gwxRewardDeposit()
708706 if ((gwxRewardDepositInv == gwxRewardDepositInv))
709707 then $Tuple2(actions, true)
710708 else throw("Strict value is not equal to itself.")
711709 case nextPoolStr: String =>
712710 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
713711 case _ =>
714712 throw("Match error")
715713 }
716714 case poolStr: String =>
717715 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
718716 if ((nextPoolOrUnit == nextPoolOrUnit))
719717 then {
720718 let r = {
721719 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
722720 if ($isInstanceOf(@, "Boolean"))
723721 then @
724722 else throw(($getType(@) + " couldn't be cast to Boolean"))
725723 }
726724 if ((r == r))
727725 then if (r)
728726 then $Tuple2(nil, true)
729727 else match nextPoolOrUnit {
730728 case _: Unit =>
731729 let actions = if (force)
732730 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
733731 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
734732 let gwxRewardDepositInv = gwxRewardDeposit()
735733 if ((gwxRewardDepositInv == gwxRewardDepositInv))
736734 then $Tuple2(actions, true)
737735 else throw("Strict value is not equal to itself.")
738736 case nextPoolStr: String =>
739737 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
740738 case _ =>
741739 throw("Match error")
742740 }
743741 else throw("Strict value is not equal to itself.")
744742 }
745743 else throw("Strict value is not equal to itself.")
746744 case _ =>
747745 throw("Match error")
748746 }
749747 }
750748 else throwErr("finalization is broken")
751749 }
752750
753751
754752
755753 @Callable(i)
756754 func finalizeWrapper (counter) = {
757- let votingEmissionRateContract = addressFromStringValue(getStringValue(this, keyVotingEmissionRateContract))
758755 let result = {
759756 let @ = invoke(this, "finalizeHelper", nil, nil)
760757 if ($isInstanceOf(@, "Boolean"))
761758 then @
762759 else throw(($getType(@) + " couldn't be cast to Boolean"))
763760 }
764761 if ((result == result))
765762 then if (!(result))
766763 then if ((counter == 0))
767764 then throwErr("Current voting is not over yet")
768- else {
769- let inv = invoke(votingEmissionRateContract, "finalize", nil, nil)
770- if ((inv == inv))
771- then $Tuple2(nil, unit)
772- else throw("Strict value is not equal to itself.")
773- }
765+ else $Tuple2(nil, unit)
774766 else {
775767 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
776768 if ((maxDepth > counter))
777769 then {
778770 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
779771 if ((inv == inv))
780772 then $Tuple2(nil, unit)
781773 else throw("Strict value is not equal to itself.")
782774 }
783775 else $Tuple2(nil, unit)
784776 }
785777 else throw("Strict value is not equal to itself.")
786778 }
787779
788780
789781
790782 @Callable(i)
791783 func finalize () = {
792784 let inv = invoke(this, "finalizeWrapper", [0], nil)
793785 if ((inv == inv))
794786 then $Tuple2(nil, unit)
795787 else throw("Strict value is not equal to itself.")
796788 }
797789
798790
799791
800792 @Callable(i)
801793 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
802794
803795
804796
805797 @Callable(i)
806798 func insertNode (listName,id) = {
807799 let checkCaller = mustManager(i)
808800 if ((checkCaller == checkCaller))
809801 then $Tuple2(insertNodeActions(listName, id), unit)
810802 else throw("Strict value is not equal to itself.")
811803 }
812804
813805
814806
815807 @Callable(i)
816808 func deleteNode (listName,id) = {
817809 let checkCaller = mustManager(i)
818810 if ((checkCaller == checkCaller))
819811 then $Tuple2(deleteNodeActions(listName, id), unit)
820812 else throw("Strict value is not equal to itself.")
821813 }
822814
823815
824-
825-@Callable(i)
826-func isFinalizationInProgress () = {
827- let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
828- let finalizationInProgress = (finalizationStageOrUnit != unit)
829- $Tuple2(nil, finalizationInProgress)
830- }
831-
832-
833816 @Verifier(tx)
834817 func verify () = {
835818 let targetPublicKey = match managerPublicKeyOrUnit() {
836819 case pk: ByteVector =>
837820 pk
838821 case _: Unit =>
839822 tx.senderPublicKey
840823 case _ =>
841824 throw("Match error")
842825 }
843826 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
844827 }
845828

github/deemru/w8io/026f985 
99.51 ms