tx · AV9cwwPTu77YCvGsy8F1tpDhsgUJqzGJ7YTdqUT21x2M

3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr:  -0.02300000 Waves

2023.12.29 10:31 [2907751] smart account 3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr > SELF 0.00000000 Waves

{ "type": 13, "id": "AV9cwwPTu77YCvGsy8F1tpDhsgUJqzGJ7YTdqUT21x2M", "fee": 2300000, "feeAssetId": null, "timestamp": 1703835131768, "version": 2, "chainId": 84, "sender": "3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr", "senderPublicKey": "GFbasS3jufhZkK4xR7tdTjjnP8K33KvJFEDHRtxXDkaJ", "proofs": [ "fs6Xyeu4oGtaS8183gAvZ8xfeeU8GNsuHchuQm3hcEixvDxFzTJpzaT11fRZh4C7y451w7Ed8GQnbRtjHVjDK7g" ], "script": "base64:BgKrFwgCEgQKAggBEgcKBQgICAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgMKAQESBAoCCAgSBAoCCAQSABIDCgEBEgASBAoCCAgSBAoCCAgSBAoCCAgSABIECgIICCIJc2VwYXJhdG9yIg5wb29sV2VpZ2h0TXVsdCIPbWF4RGVwdGhEZWZhdWx0IhZmaW5hbGl6YXRpb25TdGFnZVRvdGFsIhdmaW5hbGl6YXRpb25TdGFnZVNoYXJlcyIOa2V5RXBvY2hMZW5ndGgiEWtleUVwb2NoTGVuZ3RoTmV3IhVrZXlFcG9jaExlbmd0aEJ5RXBvY2giBWVwb2NoIg9rZXlDdXJyZW50RXBvY2giC2tleU1heERlcHRoIiJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0Ih1rZXlWb3RpbmdFbWlzc2lvblJhdGVDb250cmFjdCISa2V5RmFjdG9yeUNvbnRyYWN0IhNrZXlCb29zdGluZ0NvbnRyYWN0IhJrZXlTdGFraW5nQ29udHJhY3QiFGtleUZpbmFsaXphdGlvblN0YWdlIgtrZXlOZXh0UG9vbCILa2V5TmV4dFVzZXIiDmtleVN0YXJ0SGVpZ2h0IhFrZXlDdXJyZW50RXBvY2hVaSIQa2V5U3RhcnRIZWlnaHRVaSIda2V5RmluYWxpemF0aW9uU2hvdWxkQmVGb3JjZWQiFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaCIMa2V5RmluYWxpemVkIglrZXlJbkxpc3QiBHBvb2wiCyR0MDE3ODgxODI4Ig1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiB2tleVVzZWQiB2FkZHJlc3MiB2tleVZvdGUiCyR0MDIxMDIyMTQyIg9rZXlWb3RpbmdSZXN1bHQiCyR0MDIzMjQyMzY0IhVrZXlWb3RpbmdSZXN1bHRTdGFrZWQiDGxwQXNzZXRJZFN0ciIMa2V5UG9vbFNoYXJlIgskdDAyNjg1MjcyNSINa2V5VG90YWxWb3RlcyIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIHd3JhcEVyciIDbXNnIgh0aHJvd0VyciIOZ2V0VmFsdWVPckZhaWwiA2tleSIEdHlwZSIFZXJyb3IiByRtYXRjaDAiA3N0ciIDaW50IgxnZXRTdHJPckZhaWwiAUAiDGdldEludE9yRmFpbCIMcG9vbFRvU3RyaW5nIgxzdHJpbmdUb1Bvb2wiBXBhcnRzIg9mYWN0b3J5Q29udHJhY3QiGklkeEZhY3RvcnlDZmdHd3hSZXdhcmREYXBwIg1rZXlGYWN0b3J5Q2ZnIhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIWZ2V0THBBc3NldEJ5UG9vbEFzc2V0cyIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyIhdpbnRlcm5hbFByaWNlQXNzZXRJZFN0ciIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCITcG9vbENvbnRyYWN0QWRkcmVzcyIVYW1vdW50QXNzZXRJbnRlcm5hbElkIhRwcmljZUFzc2V0SW50ZXJuYWxJZCIJbHBBc3NldElkIhhjaGVja1d4RW1pc3Npb25Qb29sTGFiZWwiCyR0MDU1NjU1NjA1IhBnd3hSZXdhcmREZXBvc2l0IhJnd3hSZXdhcmRzQ29udHJhY3QiDXBvb2xzTGlzdE5hbWUiEGdldFZvdGVzTGlzdE5hbWUiCyR0MDYwMjI2MDYyIgtrZXlMaXN0SGVhZCIIbGlzdE5hbWUiBG1ldGEiC2tleUxpc3RTaXplIgtrZXlMaXN0UHJldiICaWQiC2tleUxpc3ROZXh0Igxjb250YWluc05vZGUiCmhlYWRPclVuaXQiCnByZXZPclVuaXQiCm5leHRPclVuaXQiEWluc2VydE5vZGVBY3Rpb25zIghsaXN0U2l6ZSIJY2hlY2tOb2RlIhFkZWxldGVOb2RlQWN0aW9ucyIWa2V5TWFuYWdlclZhdWx0QWRkcmVzcyITa2V5TWFuYWdlclB1YmxpY0tleSIcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcyIBcyIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyIJaXNNYW5hZ2VyIgFpIgJwayILbXVzdE1hbmFnZXIiCG11c3RUaGlzIgt1c2VyQWRkcmVzcyIMdGFyZ2V0SGVpZ2h0Ihdib29zdGluZ0NvbnRyYWN0QWRkcmVzcyIfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdCIQYm9vc3RpbmdDb250cmFjdCIPc3Rha2luZ0NvbnRyYWN0IgtlcG9jaExlbmd0aCIGY2hlY2tzIg1pbkxpc3RBY3Rpb25zIhhjdXJyZW50RXBvY2hJc05vdERlZmluZWQiEnN0YXJ0SGVpZ2h0QWN0aW9ucyIGYW1vdW50IgtzdGFydEhlaWdodCIJZW5kSGVpZ2h0IhdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdCIEdXNlZCIEdm90ZSIKcG9vbFJlc3VsdCIKdG90YWxWb3RlcyITZ3d4QW1vdW50QXRFbmRUb3RhbCIJYXZhaWxhYmxlIgduZXdWb3RlIgp3eEVtaXNzaW9uIg12b3Rlc0xpc3ROYW1lIhB2b3Rlc0xpc3RBY3Rpb25zIg5uZXdFcG9jaExlbmd0aCILbmV3TWF4RGVwdGgiB3Bvb2xTdHIiC2NoZWNrQ2FsbGVyIg1lcG9jaFByZXZpb3VzIhNzdGFydEhlaWdodFByZXZpb3VzIhNlcG9jaExlbmd0aFByZXZpb3VzIhFlbmRIZWlnaHRQcmV2aW91cyIQY2hlY2tUYXJnZXRFcG9jaCINJHQwMTgwNjUxODEwNSIbZ3d4QW1vdW50QXRFbmRUb3RhbFByZXZpb3VzIgx2b3RpbmdSZXN1bHQiDHZvdGVQcmV2aW91cyIadm90aW5nUmVzdWx0U3Rha2VkUHJldmlvdXMiDHN0YWtlZEJ5VXNlciIZdm90aW5nUmVzdWx0U3Rha2VkQWN0aW9ucyILYmFsYW5jZUlzT2siB2FjdGlvbnMiBWZvcmNlIgt0YXJnZXRFcG9jaCIMY3VycmVudEVwb2NoIg0kdDAyMDY0MTIwNjgxIgFyIhhkZWxldGVXeEVtaXNzaW9uTGFiZWxJbnYiBXNoYXJlIg9tb2RpZnlXZWlnaHRJbnYiEHBvb2xzTGlzdEFjdGlvbnMiDXByZXZpb3VzRXBvY2giCG5ld0Vwb2NoIhRuZXdFcG9jaExlbmd0aE9wdGlvbiIVbmV3RXBvY2hMZW5ndGhBY3Rpb25zIgpwb29sT3JVbml0Igp1c2VyT3JVbml0IgckbWF0Y2gxIgxwb29sc0hlYWRTdHIiDm5leHRVc2VyT3JVbml0IgR1c2VyIgRuZXh0Ig5wcm9jZXNzVm90ZUludiIObmV4dFBvb2xPclVuaXQiByRtYXRjaDIiCG5leHRVc2VyIhNnd3hSZXdhcmREZXBvc2l0SW52IgtuZXh0UG9vbFN0ciIHY291bnRlciIadm90aW5nRW1pc3Npb25SYXRlQ29udHJhY3QiBnJlc3VsdCIDaW52IghtYXhEZXB0aCIWZmluYWxpemF0aW9uSW5Qcm9ncmVzcyICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5PwABYQICX18AAWIAgMLXLwABYwAKAAFkAAAAAWUAAQABZgkAuQkCCQDMCAICAiVzCQDMCAICC2Vwb2NoTGVuZ3RoBQNuaWwFAWEAAWcJALkJAgkAzAgCAgQlcyVzCQDMCAICEGVwb2NoTGVuZ3RoX19uZXcFA25pbAUBYQEBaAEBaQkAuQkCCQDMCAICBCVzJWQJAMwIAgILZXBvY2hMZW5ndGgJAMwIAgkApAMBBQFpBQNuaWwFAWEAAWoJALkJAgkAzAgCAgIlcwkAzAgCAgxjdXJyZW50RXBvY2gFA25pbAUBYQABawkAuQkCCQDMCAICAiVzCQDMCAICCG1heERlcHRoBQNuaWwFAWEAAWwJALkJAgkAzAgCAgIlcwkAzAgCAh92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQNuaWwFAWEAAW0JALkJAgkAzAgCAgIlcwkAzAgCAhp2b3RpbmdFbWlzc2lvblJhdGVDb250cmFjdAUDbmlsBQFhAAFuCQC5CQIJAMwIAgICJXMJAMwIAgIPZmFjdG9yeUNvbnRyYWN0BQNuaWwFAWEAAW8JALkJAgkAzAgCAgIlcwkAzAgCAhBib29zdGluZ0NvbnRyYWN0BQNuaWwFAWEAAXAJALkJAgkAzAgCAgIlcwkAzAgCAg9zdGFraW5nQ29udHJhY3QFA25pbAUBYQABcQkAuQkCCQDMCAICAiVzCQDMCAICEWZpbmFsaXphdGlvblN0YWdlBQNuaWwFAWEAAXIJALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0UG9vbAUDbmlsBQFhAAFzCQC5CQIJAMwIAgICJXMJAMwIAgIIbmV4dFVzZXIFA25pbAUBYQABdAkAuQkCCQDMCAICAiVzCQDMCAICC3N0YXJ0SGVpZ2h0BQNuaWwFAWEAAXUJALkJAgkAzAgCAgIlcwkAzAgCAg5jdXJyZW50RXBvY2hVaQUDbmlsBQFhAAF2CQC5CQIJAMwIAgICJXMJAMwIAgINc3RhcnRIZWlnaHRVaQUDbmlsBQFhAAF3CQC5CQIJAMwIAgICJXMJAMwIAgIFZm9yY2UFA25pbAUBYQEBeAEBaQkAuQkCCQDMCAICBCVzJWQJAMwIAgILc3RhcnRIZWlnaHQJAMwIAgkApAMBBQFpBQNuaWwFAWEBAXkBAWkJALkJAgkAzAgCAgQlcyVkCQDMCAICCWZpbmFsaXplZAkAzAgCCQCkAwEFAWkFA25pbAUBYQEBegEBQQQBQgUBQQQBQwgFAUICXzEEAUQIBQFCAl8yCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBmluTGlzdAkAzAgCBQFDCQDMCAIFAUQFA25pbAUBYQEBRQIBRgFpCQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICBHVzZWQJAMwIAgkApQgBBQFGCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFHAwFBAUYBaQQBSAUBQQQBQwgFAUgCXzEEAUQIBQFIAl8yCQC5CQIJAMwIAgIKJXMlcyVzJXMlZAkAzAgCAgR2b3RlCQDMCAIFAUMJAMwIAgUBRAkAzAgCCQClCAEFAUYJAMwIAgkApAMBBQFpBQNuaWwFAWEBAUkCAUEBaQQBSgUBQQQBQwgFAUoCXzEEAUQIBQFKAl8yCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgIMdm90aW5nUmVzdWx0CQDMCAIFAUMJAMwIAgUBRAkAzAgCCQCkAwEFAWkFA25pbAUBYQEBSwIBTAFpCQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICEnZvdGluZ1Jlc3VsdFN0YWtlZAkAzAgCBQFMCQDMCAIJAKQDAQUBaQUDbmlsBQFhAQFNAgFBAWkEAU4FAUEEAUMIBQFOAl8xBAFECAUBTgJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICCXBvb2xTaGFyZQkAzAgCBQFDCQDMCAIFAUQJAMwIAgkApAMBBQFpBQNuaWwFAWEBAU8BAWkJALkJAgkAzAgCAgQlcyVkCQDMCAICCnRvdGFsVm90ZXMJAMwIAgkApAMBBQFpBQNuaWwFAWEBAVACAUwBUQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZzdGFrZWQJAMwIAgUBUQkAzAgCBQFMBQNuaWwFAWEBAVIBAVMJALkJAgkAzAgCAhV2b3RpbmdfZW1pc3Npb24ucmlkZToJAMwIAgUBUwUDbmlsAgEgAQFUAQFTCQACAQkBAVIBBQFTAQFVAwFGAVYBVwQBWAkBAVIBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAUYJAMwIAgIBLgkAzAgCBQFWCQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgQBWQUBVwMJAAECBQFZAgZTdHJpbmcEAVoFAVkJAJ0IAgUBRgUBVgMJAAECBQFZAgNJbnQEAmFhBQFZCQCaCAIFAUYFAVYJAQFUAQISaW52YWxpZCBlbnRyeSB0eXBlBQFYAQJhYgIBRgFWCgACYWMJAQFVAwUBRgUBVgIAAwkAAQIFAmFjAgZTdHJpbmcFAmFjCQACAQkArAICCQADAQUCYWMCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwECYWQCAUYBVgoAAmFjCQEBVQMFAUYFAVYAAAMJAAECBQJhYwIDSW50BQJhYwkAAgEJAKwCAgkAAwEFAmFjAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBAmFlAQFBCQCsAgIJAKwCAggFAUECXzEFAWEIBQFBAl8yAQJhZgEBWgQCYWcJALUJAgUBWgUBYQMJAAACCQCQAwEFAmFnAAIJAJQKAgkAkQMCBQJhZwAACQCRAwIFAmFnAAEJAQFUAQITaW52YWxpZCBwb29sIHN0cmluZwACYWgJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhYgIFBHRoaXMFAW4AAmFpAAoBAmFqAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFrAQJhbAkAtQkCCQECYWICBQJhbAkBAmFqAAUBYQECYW0BAmFuCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFuBQJhaQECYW8CAUMBRAoBAmFwAQJhcQkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhcQoBAmFyAgJhcwJhdAkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fCQCkAwEFAmFzAgJfXwkApAMBBQJhdAIjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QKAQJhdQECYXYJAKwCAgkArAICAgglcyVzJXNfXwUCYXYCIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0BAJhdwkBAmFkAgUCYWgJAQJhcAEFAUMEAmF4CQECYWQCBQJhaAkBAmFwAQUBRAQCYXYJAQJhYgIFAmFoCQECYXICBQJhdwUCYXgEAmF5CQECYWICBQJhaAkBAmF1AQUCYXYFAmF5AQJhegEBQQQCYUEFAUEEAUMIBQJhQQJfMQQBRAgFAmFBAl8yCgACYWMJAPwHBAUCYWgCGGNoZWNrV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQFDCQDMCAIFAUQFA25pbAUDbmlsAwkAAQIFAmFjAgdCb29sZWFuBQJhYwkAAgEJAKwCAgkAAwEFAmFjAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAQJhQgAEAmFuCQECYWsBBQJhaAQCYUMJAQJhbQEFAmFuCQD8BwQFAmFDAgdkZXBvc2l0BQNuaWwFA25pbAACYUQCBXBvb2xzAQJhRQEBQQQCYUYFAUEEAUMIBQJhRgJfMQQBRAgFAmFGAl8yCQC5CQIJAMwIAgIFdm90ZXMJAMwIAgUBQwkAzAgCBQFEBQNuaWwFAWEBAmFHAQJhSAQCYUkDCQAAAgUCYUgFAmFEAgQlcyVzAgglcyVzJXMlcwkAuQkCCQDMCAIFAmFJCQDMCAIFAmFICQDMCAICBGhlYWQFA25pbAUBYQECYUoBAmFIBAJhSQMJAAACBQJhSAUCYUQCBCVzJXMCCCVzJXMlcyVzCQC5CQIJAMwIAgUCYUkJAMwIAgUCYUgJAMwIAgIEc2l6ZQUDbmlsBQFhAQJhSwICYUgCYUwEAmFJAwkAAAIFAmFIBQJhRAIIJXMlcyVzJXMCCiVzJXMlcyVzJXMJALkJAgkAzAgCBQJhSQkAzAgCBQJhSAkAzAgCBQJhTAkAzAgCAgRwcmV2BQNuaWwFAWEBAmFNAgJhSAJhTAQCYUkDCQAAAgUCYUgFAmFEAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFAmFJCQDMCAIFAmFICQDMCAIFAmFMCQDMCAICBG5leHQFA25pbAUBYQECYU4CAmFIAmFMBAJhTwkAnQgCBQR0aGlzCQECYUcBBQJhSAQCYVAJAJ0IAgUEdGhpcwkBAmFLAgUCYUgFAmFMBAJhUQkAnQgCBQR0aGlzCQECYU0CBQJhSAUCYUwDAwkAAAIFAmFMCQELdmFsdWVPckVsc2UCBQJhTwIABgkBAiE9AgUCYVAFBHVuaXQGCQECIT0CBQJhUQUEdW5pdAECYVICAmFIAmFMBAJhTwkAnQgCBQR0aGlzCQECYUcBBQJhSAQCYVMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFKAQUCYUgAAAQCYVQDCQEBIQEJAQJhTgIFAmFIBQJhTAYJAQFUAQILTm9kZSBleGlzdHMDCQAAAgUCYVQFAmFUCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFKAQUCYUgJAGQCBQJhUwABBQNuaWwDCQECIT0CBQJhTwUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYU0CBQJhSAUCYUwJAQV2YWx1ZQEFAmFPCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhSwIFAmFICQEFdmFsdWUBBQJhTwUCYUwFA25pbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhRwEFAmFIBQJhTAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJhVQICYUgCYUwEAmFPCQCdCAIFBHRoaXMJAQJhRwEFAmFIBAJhUwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYUoBBQJhSAAABAJhUAkAnQgCBQR0aGlzCQECYUsCBQJhSAUCYUwEAmFRCQCdCAIFBHRoaXMJAQJhTQIFAmFIBQJhTAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUoBBQJhSAkAZQIFAmFTAAEFA25pbAMDCQECIT0CBQJhUAUEdW5pdAkBAiE9AgUCYVEFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhTQIFAmFICQEFdmFsdWUBBQJhUAkBBXZhbHVlAQUCYVEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFLAgUCYUgJAQV2YWx1ZQEFAmFRCQEFdmFsdWUBBQJhUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYUsCBQJhSAUCYUwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFNAgUCYUgFAmFMBQNuaWwDCQECIT0CBQJhUQUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYUcBBQJhSAkBBXZhbHVlAQUCYVEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFNAgUCYUgFAmFMCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhSwIFAmFICQEFdmFsdWUBBQJhUQUDbmlsAwkBAiE9AgUCYVAFBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFLAgUCYUgFAmFMCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhTQIFAmFICQEFdmFsdWUBBQJhUAUDbmlsAwkAAAIFAmFMCQELdmFsdWVPckVsc2UCBQJhTwIACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhRwEFAmFIBQNuaWwJAQFUAQkArAICCQCsAgIJAKwCAgIOaW52YWxpZCBub2RlOiAFAmFIAgEuBQJhTAECYVYAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwECYVcAAhQlc19fbWFuYWdlclB1YmxpY0tleQECYVgABAFZCQCiCAEJAQJhVgADCQABAgUBWQIGU3RyaW5nBAJhWQUBWQkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYVkFBHRoaXMBAmFaAAQCYmEJAQJhWAAEAVkJAJ0IAgUCYmEJAQJhVwADCQABAgUBWQIGU3RyaW5nBAJhWQUBWQkA2QQBBQJhWQMJAAECBQFZAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmJiAQJiYwQBWQkBAmFaAAMJAAECBQFZAgpCeXRlVmVjdG9yBAJiZAUBWQkAAAIIBQJiYw9jYWxsZXJQdWJsaWNLZXkFAmJkAwkAAQIFAVkCBFVuaXQJAAACCAUCYmMGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmJlAQJiYwMJAQJiYgEFAmJjBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkAQJiZgECYmMDCQAAAggFAmJjBmNhbGxlcgUEdGhpcwYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZBECYmMBGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAICYmcCYmgEAmJpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBAmFiAgUEdGhpcwUBbwkBAVIBAiFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAJQKAgUDbmlsCgACYWMJAPwHBAUCYmkCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFAmJnCQDMCAIFAmJoBQNuaWwFA25pbAMJAAECBQJhYwIDSW50BQJhYwkAAgEJAKwCAgkAAwEFAmFjAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQCYmMBC2NvbnN0cnVjdG9yBQJhaAJiagJiawJibAJibQQCYm4JAMwIAgkBAmJlAQUCYmMJAMwIAgMJAQIhPQIJAKYIAQUCYWgFBHVuaXQGAiBpbnZhbGlkIGZhY3RvcnkgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJiagUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJrBQR1bml0BgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJsBQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQJibQAABgkBAVQBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJuBQJibgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAW4FAmFoCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWwFAmJqCQDMCAIJAQtTdHJpbmdFbnRyeQIFAW8FAmJrCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXAFAmJsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFmBQJibQUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJjAQZjcmVhdGUCAUMBRAQCYm4JAMwIAgMJAAACCQDYBAEICAUCYmMGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWwCAAYJAQJiZQEFAmJjBQNuaWwDCQAAAgUCYm4FAmJuBAFBCQCUCgIFAUMFAUQEAmJvCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF6AQUBQQYFA25pbAkBAmFSAgUCYUQJAQJhZQEFAUEEAmJwCQAAAgkAmggCBQR0aGlzBQFqBQR1bml0BAJicQMFAmJwBAFpAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFAWoFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF4AQUBaQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAXUFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIFAXYFBmhlaWdodAUDbmlsBQNuaWwJAJQKAgkAzggCBQJibwUCYnEFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmMBBHZvdGUDAUMBRAJicgQBQQkAlAoCBQFDBQFEBAFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWoAAAQCYnMJAQJhZAIFBHRoaXMJAQF4AQUBaQQCYm0JAQJhZAIFBHRoaXMFAWYEAmJ0CQBkAgUCYnMFAmJtBAJidQkAmggCBQR0aGlzBQFxBAJidgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRQIIBQJiYwZjYWxsZXIFAWkAAAQCYncJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUcDBQFBCAUCYmMGY2FsbGVyBQFpAAAEAmJ4CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFJAgUBQQUBaQAABAJieQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTwEFAWkAAAQCYnoKAAJhYwkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgkA2AQBCAgFAmJjBmNhbGxlcgVieXRlcwkAzAgCBQJidAUDbmlsBQNuaWwDCQABAgUCYWMCA0ludAUCYWMJAAIBCQCsAgIJAAMBBQJhYwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJiQQkAZQIFAmJ6BQJidgQCYkIJAGQCBQJidwUCYnIEAmJDCQECYXoBBQFBBAJibgkAzAgCAwkBAiE9AgkAoAgBCQEBegEFAUEFBHVuaXQGCQEBVAECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYnQFBmhlaWdodAYJAQFUAQIOaW52YWxpZCBoZWlnaHQJAMwIAgMJAAACBQJidQUEdW5pdAYJAQFUAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUCYnoAAAYJAQFUAQITeW91IGRvIG5vdCBoYXZlIGdXWAkAzAgCAwMJAGYCBQJicgAACQBnAgUCYkEFAmJyBwYJAQFUAQIOaW52YWxpZCBhbW91bnQJAMwIAgMFAmJDBgkBAVQBAh1wb29sIGhhc24ndCBXWF9FTUlTU0lPTiBsYWJlbAUDbmlsAwkAAAIFAmJuBQJibgQCYkQJAQJhRQEFAUEEAVEJAKUIAQgFAmJjBmNhbGxlcgQCYkUDCQECYU4CBQJiRAUBUQUDbmlsCQECYVICBQJiRAUBUQkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFFAggFAmJjBmNhbGxlcgUBaQkAZAIFAmJ2BQJicgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUcDBQFBCAUCYmMGY2FsbGVyBQFpBQJiQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUkCBQFBBQFpCQBkAgUCYngFAmJyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwEFAWkJAGQCBQJieQUCYnIFA25pbAUCYkUFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmMBCmNhbmNlbFZvdGUCAUMBRAQBQQkAlAoCBQFDBQFEBAFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWoAAAQCYnMJAQJhZAIFBHRoaXMJAQF4AQUBaQQCYm0JAQJhZAIFBHRoaXMFAWYEAmJ0CQBkAgUCYnMFAmJtBAJidQkAmggCBQR0aGlzBQFxBAJidgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBRQIIBQJiYwZjYWxsZXIFAWkAAAQCYncJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUcDBQFBCAUCYmMGY2FsbGVyBQFpAAAEAmJ4CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFJAgUBQQUBaQAABAJieQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTwEFAWkAAAQCYm4JAMwIAgMJAQIhPQIJAKAIAQkBAXoBBQFBBQR1bml0BgkBAVQBAg5pbnZhbGlkIGFzc2V0cwkAzAgCAwkAZgIFAmJ0BQZoZWlnaHQGCQEBVAECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUCYnUFBHVuaXQGCQEBVAECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFAmJ3AAAGCQEBVAECB25vIHZvdGUFA25pbAMJAAACBQJibgUCYm4EAmJECQECYUUBBQFBBAFRCQClCAEIBQJiYwZjYWxsZXIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRQIIBQJiYwZjYWxsZXIFAWkJAJYDAQkAzAgCCQBlAgUCYnYFAmJ3CQDMCAIAAAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFHAwUBQQgFAmJjBmNhbGxlcgUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUkCBQFBBQFpCQBlAgUCYngFAmJ3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwEFAWkJAGUCBQJieQUCYncFA25pbAkBAmFVAgUCYkQFAVEFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmMBDnNldEVwb2NoTGVuZ3RoAQJiRgQCYm4JAMwIAgkBAmJlAQUCYmMJAMwIAgMJAGYCBQJiRgAABgkBAVQBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJuBQJibgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFnBQJiRgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJjAQtzZXRNYXhEZXB0aAECYkcEAmJuCQDMCAIJAQJiZQEFAmJjCQDMCAIDCQBmAgUCYkcAAAYJAQFUAQIRaW52YWxpZCBtYXggZGVwdGgFA25pbAMJAAACBQJibgUCYm4JAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBawUCYkcFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYwETcHJvY2Vzc1ZvdGVJTlRFUk5BTAICYkgBUQQCYkkJAQJiZgEFAmJjAwkAAAIFAmJJBQJiSQQCYmcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFRCQEBUgEJAKwCAgIqcHJvY2Vzc1ZvdGVJTlRFUk5BTDogaW52YWxpZCB1c2VyIGFkZHJlc3MgBQFRBAFpCQECYWQCBQR0aGlzBQFqBAJiSgkAZQIFAWkAAQQCYm0JAQJhZAIFBHRoaXMFAWYEAmJzCQECYWQCBQR0aGlzCQEBeAEFAWkEAmJ0CQBkAgUCYnMFAmJtBAJiSwkBAmFkAgUEdGhpcwkBAXgBBQJiSgQCYkwJAQJhZAIFBHRoaXMJAQFoAQUCYkoEAmJNCQBkAgUCYksFAmJMBAJiTgMJAGcCBQJiSgAABgkBAVQBAitwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHByZXZpb3VzIGVwb2NoAwkAAAIFAmJOBQJiTgQBQQkBAmFmAQUCYkgEAmJPBQFBBAFDCAUCYk8CXzEEAUQIBQJiTwJfMgQCYkMJAQJhegEFAUEEAmJ6CgACYWMJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAVEJAMwIAgUCYnQFA25pbAUDbmlsAwkAAQIFAmFjAgNJbnQFAmFjCQACAQkArAICCQADAQUCYWMCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYlAKAAJhYwkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgUBUQkAzAgCBQJiTQUDbmlsBQNuaWwDCQABAgUCYWMCA0ludAUCYWMJAAIBCQCsAgIJAAMBBQJhYwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJieQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBTwEFAWkAAAQCYlEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAUkCBQFBBQFpAAAEAmJSCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBAUcDBQFBBQJiZwUCYkoJAQFSAQkArAICCQCsAgIJAKwCAgkArAICAhRwcm9jZXNzVm90ZUlOVEVSTkFMIAUCYkgCASAFAVECEjogbm8gcHJldmlvdXMgdm90ZQQCYnYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAUUCBQJiZwUBaQAABAFMCQECYW8CBQFDBQFEBAJiUwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBSwIFAUwFAmJKAAAEAmJsCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYWICBQR0aGlzBQFwBAJiVAkBC3ZhbHVlT3JFbHNlAgkAmggCBQJibAkBAVACBQFMBQFRAAAEAmJVAwkAAAIFAmJUAAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUsCBQFMBQJiSgkAZAIFAmJTBQJiUgUDbmlsBAJheQkBAmFvAgUBQwUBRAQCYlYKAAJhYwkA/AcEBQJhaAIMY2hlY2tCYWxhbmNlCQDMCAIFAmF5BQNuaWwFA25pbAMJAAECBQJhYwIHQm9vbGVhbgUCYWMJAAIBCQCsAgIJAAMBBQJhYwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCYkIDCQBmAgUCYlAAAAkAawMFAmJSBQJiegUCYlAAAAQCYlcDAwMJAGYCBQJiQgAABQJiQwcFAmJWBwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUcDBQFBBQJiZwUBaQUCYkIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFPAQUBaQkAZAIFAmJ5BQJiQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUkCBQFBBQFpCQBkAgUCYlEFAmJCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRQIFAmJnBQFpCQBkAgUCYnYFAmJCBQNuaWwJAQJhVQIJAQJhRQEFAUEFAVEJAJQKAgkAzggCBQJiVwUCYlUFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmMBE3Byb2Nlc3NQb29sSU5URVJOQUwCAmJIAmJYBAJiSQkBAmJmAQUCYmMDCQAAAgUCYkkFAmJJBAJiWQQCYloJAQJhZAIFBHRoaXMFAWoDBQJiWAUCYloJAGUCBQJiWgABBAJiTgMJAGcCBQJiWQAABgkBAVQBAilwcm9jZXNzUG9vbElOVEVSTkFMOiBpbnZhbGlkIHRhcmdldCBlcG9jaAMJAAACBQJiTgUCYk4EAUEJAQJhZgEFAmJIBAJjYQUBQQQBQwgFAmNhAl8xBAFECAUCY2ECXzIEAmJsCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYWICBQR0aGlzBQFwBAJheQkBAmFvAgUBQwUBRAQCY2IKAAJhYwkA/AcEBQJibAISdXNlcnNMaXN0VHJhdmVyc2FsCQDMCAIFAmF5BQNuaWwFA25pbAMJAAECBQJhYwIHQm9vbGVhbgUCYWMJAAIBCQCsAgIJAAMBBQJhYwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJjYgUCY2IDBQJjYgkAlAoCBQNuaWwGBAJiVgoAAmFjCQD8BwQFAmFoAgxjaGVja0JhbGFuY2UJAMwIAgUCYXkFA25pbAUDbmlsAwkAAQIFAmFjAgdCb29sZWFuBQJhYwkAAgEJAKwCAgkAAwEFAmFjAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJjYwMFAmJWBQR1bml0CQD8BwQFAmFoAhlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAUMJAMwIAgUBRAUDbmlsBQNuaWwDCQAAAgUCY2MFAmNjBAJiQwkBAmF6AQUBQQQCYnkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAU8BBQJiWQAABAJiUQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBSQIFAUEFAmJZAAAEAmNkAwMJAAACBQJieQAABgkBASEBBQJiQwAACQBrAwUCYlEFAWIFAmJ5BAJjZQkA/AcEBQJhaAIMbW9kaWZ5V2VpZ2h0CQDMCAIFAmF5CQDMCAIFAmNkBQNuaWwFA25pbAMJAAACBQJjZQUCY2UEAmNmAwMFAmJDBgUCYlgFA25pbAkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQF6AQUBQQUDbmlsCQECYVUCBQJhRAUCYkgJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTQIFAUEFAmJZBQJjZAUDbmlsBQJjZgcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmMBDmZpbmFsaXplSGVscGVyAAQCYlgJAQt2YWx1ZU9yRWxzZQIJAKAIAQUBdwcEAWkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBagAABAJjZwkAZQIFAWkAAQQCYnMJAQJhZAIFBHRoaXMJAQF4AQUBaQQCYm0JAQJhZAIFBHRoaXMFAWYEAmJ0CQBkAgUCYnMFAmJtBAJidQkAmggCBQR0aGlzBQFxAwMDCQBnAgUGaGVpZ2h0BQJidAkAAAIFAmJ1BQR1bml0BwkBASEBBQJiWAcEAmNoCQBkAgUBaQABBAJjaQkAmggCBQR0aGlzBQFnBAJjagQBWQUCY2kDCQABAgUBWQIDSW50BAJiRgUBWQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBZgUCYkYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBZwUDbmlsAwkAAQIFAVkCBFVuaXQFA25pbAkAAgECC01hdGNoIGVycm9yCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXgBBQJjaAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAWoFAmNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFxBQFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBaAEFAWkFAmJtBQNuaWwFAmNqBgMDBQJiWAkAAAIFAmJ1BQR1bml0BwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFxBQFlBQNuaWwGAwkAAAIFAmJ1BQR1bml0CQCUCgIFA25pbAcDCQAAAgUCYnUFAWQEAmNrCQCiCAEFAXIEAmNsCQCiCAEFAXMEAVkFAmNrAwkAAQIFAVkCBFVuaXQEAmNtCQCiCAEJAQJhRwEFAmFEAwkAAQIFAmNtAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXEFAWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcgkAzAgCCQELRGVsZXRlRW50cnkBBQFzBQNuaWwGAwkAAQIFAmNtAgZTdHJpbmcEAmNuBQJjbQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXIFAmNuBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IDCQABAgUBWQIGU3RyaW5nBAJiSAUBWQQBQQkBAmFmAQUCYkgEAmNvBAJjbQUCY2wDCQABAgUCY20CBFVuaXQJAKIIAQkBAmFHAQkBAmFFAQUBQQMJAAECBQJjbQIGU3RyaW5nBAJjcAUCY20EAmNxCQCiCAEJAQJhTQIJAQJhRQEFAUEFAmNwAwkAAAIFAmNxBQJjcQQCY3IJAPwHBAUEdGhpcwITcHJvY2Vzc1ZvdGVJTlRFUk5BTAkAzAgCBQJiSAkAzAgCBQJjcAUDbmlsBQNuaWwDCQAAAgUCY3IFAmNyBQJjcQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yBAJjbQUCY28DCQABAgUCY20CBFVuaXQEAmNzCQCiCAEJAQJhTQIFAmFEBQJiSAQCY3QFAmNzAwkAAQIFAmN0AgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXEFAWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcgkAzAgCCQELRGVsZXRlRW50cnkBBQFzBQNuaWwGAwkAAQIFAmN0AgZTdHJpbmcEAmFZBQJjdAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXIFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEFAXMFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQJjbQIGU3RyaW5nBAJjdQUCY20JAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFzBQJjdQUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUCYnUFAWUEAmNrCQCiCAEFAXIEAVkFAmNrAwkAAQIFAVkCBFVuaXQEAmNtCQCiCAEJAQJhRwEFAmFEAwkAAQIFAmNtAgRVbml0BAJiVwMFAmJYCQDMCAIJAQtEZWxldGVFbnRyeQEFAXEJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdwUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAXEJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQF5AQUCY2cGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF2BQJicwUDbmlsBAJjdgkBAmFCAAMJAAACBQJjdgUCY3YJAJQKAgUCYlcGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAQIFAmNtAgZTdHJpbmcEAmN3BQJjbQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXIFAmN3BQNuaWwGCQACAQILTWF0Y2ggZXJyb3IDCQABAgUBWQIGU3RyaW5nBAJiSAUBWQQCY3MJAKIIAQkBAmFNAgUCYUQFAmJIAwkAAAIFAmNzBQJjcwQCY2IKAAJhYwkA/AcEBQR0aGlzAhNwcm9jZXNzUG9vbElOVEVSTkFMCQDMCAIFAmJICQDMCAIFAmJYBQNuaWwFA25pbAMJAAECBQJhYwIHQm9vbGVhbgUCYWMJAAIBCQCsAgIJAAMBBQJhYwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJjYgUCY2IDBQJjYgkAlAoCBQNuaWwGBAJjbQUCY3MDCQABAgUCY20CBFVuaXQEAmJXAwUCYlgJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcQkAzAgCCQELRGVsZXRlRW50cnkBBQF3CQDMCAIJAQtEZWxldGVFbnRyeQEFAXIFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQFxCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBeQEFAmNnBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdQUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdgUCYnMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBcgUDbmlsBAJjdgkBAmFCAAMJAAACBQJjdgUCY3YJAJQKAgUCYlcGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAQIFAmNtAgZTdHJpbmcEAmN3BQJjbQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXIFAmN3BQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgkBAVQBAhZmaW5hbGl6YXRpb24gaXMgYnJva2VuAmJjAQ9maW5hbGl6ZVdyYXBwZXIBAmN4BAJjeQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUBbQQCY3oKAAJhYwkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUCYWMCB0Jvb2xlYW4FAmFjCQACAQkArAICCQADAQUCYWMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCY3oFAmN6AwkBASEBBQJjegMJAAACBQJjeAAACQEBVAECHkN1cnJlbnQgdm90aW5nIGlzIG5vdCBvdmVyIHlldAQCY0EJAPwHBAUCY3kCCGZpbmFsaXplBQNuaWwFA25pbAMJAAACBQJjQQUCY0EJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJjQgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrBQFjAwkAZgIFAmNCBQJjeAQCY0EJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGQCBQJjeAABBQNuaWwFA25pbAMJAAACBQJjQQUCY0EJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYwEIZmluYWxpemUABAJjQQkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQJjQQUCY0EJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJjARRjb250YWluc05vZGVSRUFET05MWQICYUgCYUwJAJQKAgUDbmlsCQECYU4CBQJhSAUCYUwCYmMBCmluc2VydE5vZGUCAmFIAmFMBAJiSQkBAmJlAQUCYmMDCQAAAgUCYkkFAmJJCQCUCgIJAQJhUgIFAmFIBQJhTAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiYwEKZGVsZXRlTm9kZQICYUgCYUwEAmJJCQECYmUBBQJiYwMJAAACBQJiSQUCYkkJAJQKAgkBAmFVAgUCYUgFAmFMBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJjARhpc0ZpbmFsaXphdGlvbkluUHJvZ3Jlc3MABAJidQkAmggCBQR0aGlzBQFxBAJjQwkBAiE9AgUCYnUFBHVuaXQJAJQKAgUDbmlsBQJjQwJiYwEKZGVsZXRlUG9vbAIBQwFEBAJiSQMDCQAAAggFAmJjBmNhbGxlcgUCYWgGCQECYmUBBQJiYwYJAQFUAQIRUGVybWlzc2lvbiBkZW5pZWQDCQAAAgUCYkkFAmJJBAJhSAIFcG9vbHMEAUEJAJQKAgUBQwUBRAQCYUwJALkJAgkAzAgCBQFDCQDMCAIFAUQFA25pbAUBYQQCYlcDCQECYU4CBQJhSAUCYUwJAQJhVQIFAmFIBQJhTAUDbmlsCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAXoBBQFBBQNuaWwFAmJXCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJjRAECY0UABAJjRgQBWQkBAmFaAAMJAAECBQFZAgpCeXRlVmVjdG9yBAJiZAUBWQUCYmQDCQABAgUBWQIEVW5pdAgFAmNED3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJjRAlib2R5Qnl0ZXMJAJEDAggFAmNEBnByb29mcwAABQJjRgYM0go=", "height": 2907751, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: yyaXcB1XHk2swAX1QzUfRGaA8d58qSffdFTNaxHFrW3 Next: 6FY627hQpwQbpuxPkTSiSRNDTg45vxDnJ46axyrwscfb Diff:
OldNewDifferences
589589 then if (r)
590590 then $Tuple2(nil, true)
591591 else {
592- let wxEmission = checkWxEmissionPoolLabel(pool)
593592 let balanceIsOk = {
594593 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
595594 if ($isInstanceOf(@, "Boolean"))
596595 then @
597596 else throw(($getType(@) + " couldn't be cast to Boolean"))
598597 }
599- let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
600- let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
601- let share = if (if (if ((totalVotes == 0))
602- then true
603- else !(wxEmission))
604- then true
605- else !(balanceIsOk))
606- then 0
607- else fraction(votingResult, poolWeightMult, totalVotes)
608- let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
609- if ((modifyWeightInv == modifyWeightInv))
598+ let deleteWxEmissionLabelInv = if (balanceIsOk)
599+ then unit
600+ else invoke(factoryContract, "deleteWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
601+ if ((deleteWxEmissionLabelInv == deleteWxEmissionLabelInv))
610602 then {
611- let poolsListActions = if (if (wxEmission)
603+ let wxEmission = checkWxEmissionPoolLabel(pool)
604+ let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
605+ let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
606+ let share = if (if ((totalVotes == 0))
612607 then true
613- else force)
614- then nil
615- else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
616- $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
608+ else !(wxEmission))
609+ then 0
610+ else fraction(votingResult, poolWeightMult, totalVotes)
611+ let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
612+ if ((modifyWeightInv == modifyWeightInv))
613+ then {
614+ let poolsListActions = if (if (wxEmission)
615+ then true
616+ else force)
617+ then nil
618+ else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
619+ $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
620+ }
621+ else throw("Strict value is not equal to itself.")
617622 }
618623 else throw("Strict value is not equal to itself.")
619624 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let poolWeightMult = 100000000
77
88 let maxDepthDefault = 10
99
1010 let finalizationStageTotal = 0
1111
1212 let finalizationStageShares = 1
1313
1414 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1515
1616 let keyEpochLengthNew = makeString(["%s%s", "epochLength__new"], separator)
1717
1818 func keyEpochLengthByEpoch (epoch) = makeString(["%s%d", "epochLength", toString(epoch)], separator)
1919
2020
2121 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
2222
2323 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
2424
2525 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
2626
2727 let keyVotingEmissionRateContract = makeString(["%s", "votingEmissionRateContract"], separator)
2828
2929 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
3030
3131 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3232
3333 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
3434
3535 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
3636
3737 let keyNextPool = makeString(["%s", "nextPool"], separator)
3838
3939 let keyNextUser = makeString(["%s", "nextUser"], separator)
4040
4141 let keyStartHeight = makeString(["%s", "startHeight"], separator)
4242
4343 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
4444
4545 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
4646
4747 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
4848
4949 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
5050
5151
5252 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
5353
5454
5555 func keyInList (pool) = {
5656 let $t017881828 = pool
5757 let amountAssetId = $t017881828._1
5858 let priceAssetId = $t017881828._2
5959 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6060 }
6161
6262
6363 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
6464
6565
6666 func keyVote (pool,address,epoch) = {
6767 let $t021022142 = pool
6868 let amountAssetId = $t021022142._1
6969 let priceAssetId = $t021022142._2
7070 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
7171 }
7272
7373
7474 func keyVotingResult (pool,epoch) = {
7575 let $t023242364 = pool
7676 let amountAssetId = $t023242364._1
7777 let priceAssetId = $t023242364._2
7878 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7979 }
8080
8181
8282 func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], separator)
8383
8484
8585 func keyPoolShare (pool,epoch) = {
8686 let $t026852725 = pool
8787 let amountAssetId = $t026852725._1
8888 let priceAssetId = $t026852725._2
8989 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
9090 }
9191
9292
9393 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
9494
9595
9696 func keyStakedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], separator)
9797
9898
9999 func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
100100
101101
102102 func throwErr (msg) = throw(wrapErr(msg))
103103
104104
105105 func getValueOrFail (address,key,type) = {
106106 let error = wrapErr(makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
107107 valueOrErrorMessage( match type {
108108 case str: String =>
109109 getString(address, key)
110110 case int: Int =>
111111 getInteger(address, key)
112112 case _ =>
113113 throwErr("invalid entry type")
114114 }, error)
115115 }
116116
117117
118118 func getStrOrFail (address,key) = {
119119 let @ = getValueOrFail(address, key, "")
120120 if ($isInstanceOf(@, "String"))
121121 then @
122122 else throw(($getType(@) + " couldn't be cast to String"))
123123 }
124124
125125
126126 func getIntOrFail (address,key) = {
127127 let @ = getValueOrFail(address, key, 0)
128128 if ($isInstanceOf(@, "Int"))
129129 then @
130130 else throw(($getType(@) + " couldn't be cast to Int"))
131131 }
132132
133133
134134 func poolToString (pool) = ((pool._1 + separator) + pool._2)
135135
136136
137137 func stringToPool (str) = {
138138 let parts = split(str, separator)
139139 if ((size(parts) == 2))
140140 then $Tuple2(parts[0], parts[1])
141141 else throwErr("invalid pool string")
142142 }
143143
144144
145145 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
146146
147147 let IdxFactoryCfgGwxRewardDapp = 10
148148
149149 func keyFactoryCfg () = "%s__factoryConfig"
150150
151151
152152 func readFactoryCfgOrFail (factory) = split(getStrOrFail(factory, keyFactoryCfg()), separator)
153153
154154
155155 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
156156
157157
158158 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
159159 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
160160
161161 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
162162
163163 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
164164
165165 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
166166 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
167167 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
168168 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
169169 lpAssetId
170170 }
171171
172172
173173 func checkWxEmissionPoolLabel (pool) = {
174174 let $t055655605 = pool
175175 let amountAssetId = $t055655605._1
176176 let priceAssetId = $t055655605._2
177177 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
178178 if ($isInstanceOf(@, "Boolean"))
179179 then @
180180 else throw(($getType(@) + " couldn't be cast to Boolean"))
181181 }
182182
183183
184184 func gwxRewardDeposit () = {
185185 let factoryCfg = readFactoryCfgOrFail(factoryContract)
186186 let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
187187 invoke(gwxRewardsContract, "deposit", nil, nil)
188188 }
189189
190190
191191 let poolsListName = "pools"
192192
193193 func getVotesListName (pool) = {
194194 let $t060226062 = pool
195195 let amountAssetId = $t060226062._1
196196 let priceAssetId = $t060226062._2
197197 makeString(["votes", amountAssetId, priceAssetId], separator)
198198 }
199199
200200
201201 func keyListHead (listName) = {
202202 let meta = if ((listName == poolsListName))
203203 then "%s%s"
204204 else "%s%s%s%s"
205205 makeString([meta, listName, "head"], separator)
206206 }
207207
208208
209209 func keyListSize (listName) = {
210210 let meta = if ((listName == poolsListName))
211211 then "%s%s"
212212 else "%s%s%s%s"
213213 makeString([meta, listName, "size"], separator)
214214 }
215215
216216
217217 func keyListPrev (listName,id) = {
218218 let meta = if ((listName == poolsListName))
219219 then "%s%s%s%s"
220220 else "%s%s%s%s%s"
221221 makeString([meta, listName, id, "prev"], separator)
222222 }
223223
224224
225225 func keyListNext (listName,id) = {
226226 let meta = if ((listName == poolsListName))
227227 then "%s%s%s%s"
228228 else "%s%s%s%s%s"
229229 makeString([meta, listName, id, "next"], separator)
230230 }
231231
232232
233233 func containsNode (listName,id) = {
234234 let headOrUnit = getString(this, keyListHead(listName))
235235 let prevOrUnit = getString(this, keyListPrev(listName, id))
236236 let nextOrUnit = getString(this, keyListNext(listName, id))
237237 if (if ((id == valueOrElse(headOrUnit, "")))
238238 then true
239239 else (prevOrUnit != unit))
240240 then true
241241 else (nextOrUnit != unit)
242242 }
243243
244244
245245 func insertNodeActions (listName,id) = {
246246 let headOrUnit = getString(this, keyListHead(listName))
247247 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
248248 let checkNode = if (!(containsNode(listName, id)))
249249 then true
250250 else throwErr("Node exists")
251251 if ((checkNode == checkNode))
252252 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
253253 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
254254 else nil)) ++ [StringEntry(keyListHead(listName), id)])
255255 else throw("Strict value is not equal to itself.")
256256 }
257257
258258
259259 func deleteNodeActions (listName,id) = {
260260 let headOrUnit = getString(this, keyListHead(listName))
261261 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
262262 let prevOrUnit = getString(this, keyListPrev(listName, id))
263263 let nextOrUnit = getString(this, keyListNext(listName, id))
264264 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
265265 then (nextOrUnit != unit)
266266 else false)
267267 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
268268 else if ((nextOrUnit != unit))
269269 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
270270 else if ((prevOrUnit != unit))
271271 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
272272 else if ((id == valueOrElse(headOrUnit, "")))
273273 then [DeleteEntry(keyListHead(listName))]
274274 else throwErr(((("invalid node: " + listName) + ".") + id))))
275275 }
276276
277277
278278 func keyManagerVaultAddress () = "%s__managerVaultAddress"
279279
280280
281281 func keyManagerPublicKey () = "%s__managerPublicKey"
282282
283283
284284 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
285285 case s: String =>
286286 addressFromStringValue(s)
287287 case _ =>
288288 this
289289 }
290290
291291
292292 func managerPublicKeyOrUnit () = {
293293 let managerVaultAddress = getManagerVaultAddressOrThis()
294294 match getString(managerVaultAddress, keyManagerPublicKey()) {
295295 case s: String =>
296296 fromBase58String(s)
297297 case _: Unit =>
298298 unit
299299 case _ =>
300300 throw("Match error")
301301 }
302302 }
303303
304304
305305 func isManager (i) = match managerPublicKeyOrUnit() {
306306 case pk: ByteVector =>
307307 (i.callerPublicKey == pk)
308308 case _: Unit =>
309309 (i.caller == this)
310310 case _ =>
311311 throw("Match error")
312312 }
313313
314314
315315 func mustManager (i) = if (isManager(i))
316316 then true
317317 else throw("permission denied")
318318
319319
320320 func mustThis (i) = if ((i.caller == this))
321321 then true
322322 else throw("permission denied")
323323
324324
325325 @Callable(i)
326326 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
327327 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), wrapErr("invalid boosting contract address"))
328328 $Tuple2(nil, {
329329 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
330330 if ($isInstanceOf(@, "Int"))
331331 then @
332332 else throw(($getType(@) + " couldn't be cast to Int"))
333333 })
334334 }
335335
336336
337337
338338 @Callable(i)
339339 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
340340 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
341341 then true
342342 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
343343 then true
344344 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
345345 then true
346346 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
347347 then true
348348 else "invalid staking contract address", if ((epochLength > 0))
349349 then true
350350 else throwErr("invalid epoch length")]
351351 if ((checks == checks))
352352 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
353353 else throw("Strict value is not equal to itself.")
354354 }
355355
356356
357357
358358 @Callable(i)
359359 func create (amountAssetId,priceAssetId) = {
360360 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
361361 then true
362362 else mustManager(i)]
363363 if ((checks == checks))
364364 then {
365365 let pool = $Tuple2(amountAssetId, priceAssetId)
366366 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
367367 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
368368 let startHeightActions = if (currentEpochIsNotDefined)
369369 then {
370370 let epoch = 0
371371 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
372372 }
373373 else nil
374374 $Tuple2((inListActions ++ startHeightActions), unit)
375375 }
376376 else throw("Strict value is not equal to itself.")
377377 }
378378
379379
380380
381381 @Callable(i)
382382 func vote (amountAssetId,priceAssetId,amount) = {
383383 let pool = $Tuple2(amountAssetId, priceAssetId)
384384 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
385385 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
386386 let epochLength = getIntOrFail(this, keyEpochLength)
387387 let endHeight = (startHeight + epochLength)
388388 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
389389 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
390390 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
391391 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
392392 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
393393 let gwxAmountAtEndTotal = {
394394 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
395395 if ($isInstanceOf(@, "Int"))
396396 then @
397397 else throw(($getType(@) + " couldn't be cast to Int"))
398398 }
399399 let available = (gwxAmountAtEndTotal - used)
400400 let newVote = (vote + amount)
401401 let wxEmission = checkWxEmissionPoolLabel(pool)
402402 let checks = [if ((getBoolean(keyInList(pool)) != unit))
403403 then true
404404 else throwErr("invalid assets"), if ((endHeight > height))
405405 then true
406406 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
407407 then true
408408 else throwErr("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
409409 then true
410410 else throwErr("you do not have gWX"), if (if ((amount > 0))
411411 then (available >= amount)
412412 else false)
413413 then true
414414 else throwErr("invalid amount"), if (wxEmission)
415415 then true
416416 else throwErr("pool hasn't WX_EMISSION label")]
417417 if ((checks == checks))
418418 then {
419419 let votesListName = getVotesListName(pool)
420420 let userAddressStr = toString(i.caller)
421421 let votesListActions = if (containsNode(votesListName, userAddressStr))
422422 then nil
423423 else insertNodeActions(votesListName, userAddressStr)
424424 $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)
425425 }
426426 else throw("Strict value is not equal to itself.")
427427 }
428428
429429
430430
431431 @Callable(i)
432432 func cancelVote (amountAssetId,priceAssetId) = {
433433 let pool = $Tuple2(amountAssetId, priceAssetId)
434434 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
435435 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
436436 let epochLength = getIntOrFail(this, keyEpochLength)
437437 let endHeight = (startHeight + epochLength)
438438 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
439439 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
440440 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
441441 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
442442 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
443443 let checks = [if ((getBoolean(keyInList(pool)) != unit))
444444 then true
445445 else throwErr("invalid assets"), if ((endHeight > height))
446446 then true
447447 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
448448 then true
449449 else throwErr("finalization in progress"), if ((vote > 0))
450450 then true
451451 else throwErr("no vote")]
452452 if ((checks == checks))
453453 then {
454454 let votesListName = getVotesListName(pool)
455455 let userAddressStr = toString(i.caller)
456456 $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)
457457 }
458458 else throw("Strict value is not equal to itself.")
459459 }
460460
461461
462462
463463 @Callable(i)
464464 func setEpochLength (newEpochLength) = {
465465 let checks = [mustManager(i), if ((newEpochLength > 0))
466466 then true
467467 else throwErr("invalid epoch length")]
468468 if ((checks == checks))
469469 then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
470470 else throw("Strict value is not equal to itself.")
471471 }
472472
473473
474474
475475 @Callable(i)
476476 func setMaxDepth (newMaxDepth) = {
477477 let checks = [mustManager(i), if ((newMaxDepth > 0))
478478 then true
479479 else throwErr("invalid max depth")]
480480 if ((checks == checks))
481481 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
482482 else throw("Strict value is not equal to itself.")
483483 }
484484
485485
486486
487487 @Callable(i)
488488 func processVoteINTERNAL (poolStr,userAddressStr) = {
489489 let checkCaller = mustThis(i)
490490 if ((checkCaller == checkCaller))
491491 then {
492492 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr(("processVoteINTERNAL: invalid user address " + userAddressStr)))
493493 let epoch = getIntOrFail(this, keyCurrentEpoch)
494494 let epochPrevious = (epoch - 1)
495495 let epochLength = getIntOrFail(this, keyEpochLength)
496496 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
497497 let endHeight = (startHeight + epochLength)
498498 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
499499 let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
500500 let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
501501 let checkTargetEpoch = if ((epochPrevious >= 0))
502502 then true
503503 else throwErr("processVoteINTERNAL: invalid previous epoch")
504504 if ((checkTargetEpoch == checkTargetEpoch))
505505 then {
506506 let pool = stringToPool(poolStr)
507507 let $t01806518105 = pool
508508 let amountAssetId = $t01806518105._1
509509 let priceAssetId = $t01806518105._2
510510 let wxEmission = checkWxEmissionPoolLabel(pool)
511511 let gwxAmountAtEndTotal = {
512512 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
513513 if ($isInstanceOf(@, "Int"))
514514 then @
515515 else throw(($getType(@) + " couldn't be cast to Int"))
516516 }
517517 let gwxAmountAtEndTotalPrevious = {
518518 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
519519 if ($isInstanceOf(@, "Int"))
520520 then @
521521 else throw(($getType(@) + " couldn't be cast to Int"))
522522 }
523523 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
524524 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
525525 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), wrapErr((((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote")))
526526 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
527527 let lpAssetIdStr = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
528528 let votingResultStakedPrevious = valueOrElse(getInteger(keyVotingResultStaked(lpAssetIdStr, epochPrevious)), 0)
529529 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
530530 let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(lpAssetIdStr, userAddressStr)), 0)
531531 let votingResultStakedActions = if ((stakedByUser == 0))
532532 then nil
533533 else [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, epochPrevious), (votingResultStakedPrevious + votePrevious))]
534534 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
535535 let balanceIsOk = {
536536 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
537537 if ($isInstanceOf(@, "Boolean"))
538538 then @
539539 else throw(($getType(@) + " couldn't be cast to Boolean"))
540540 }
541541 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
542542 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
543543 else 0
544544 let actions = if (if (if ((newVote > 0))
545545 then wxEmission
546546 else false)
547547 then balanceIsOk
548548 else false)
549549 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
550550 else deleteNodeActions(getVotesListName(pool), userAddressStr)
551551 $Tuple2((actions ++ votingResultStakedActions), unit)
552552 }
553553 else throw("Strict value is not equal to itself.")
554554 }
555555 else throw("Strict value is not equal to itself.")
556556 }
557557
558558
559559
560560 @Callable(i)
561561 func processPoolINTERNAL (poolStr,force) = {
562562 let checkCaller = mustThis(i)
563563 if ((checkCaller == checkCaller))
564564 then {
565565 let targetEpoch = {
566566 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
567567 if (force)
568568 then currentEpoch
569569 else (currentEpoch - 1)
570570 }
571571 let checkTargetEpoch = if ((targetEpoch >= 0))
572572 then true
573573 else throwErr("processPoolINTERNAL: invalid target epoch")
574574 if ((checkTargetEpoch == checkTargetEpoch))
575575 then {
576576 let pool = stringToPool(poolStr)
577577 let $t02064120681 = pool
578578 let amountAssetId = $t02064120681._1
579579 let priceAssetId = $t02064120681._2
580580 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
581581 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
582582 let r = {
583583 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
584584 if ($isInstanceOf(@, "Boolean"))
585585 then @
586586 else throw(($getType(@) + " couldn't be cast to Boolean"))
587587 }
588588 if ((r == r))
589589 then if (r)
590590 then $Tuple2(nil, true)
591591 else {
592- let wxEmission = checkWxEmissionPoolLabel(pool)
593592 let balanceIsOk = {
594593 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
595594 if ($isInstanceOf(@, "Boolean"))
596595 then @
597596 else throw(($getType(@) + " couldn't be cast to Boolean"))
598597 }
599- let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
600- let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
601- let share = if (if (if ((totalVotes == 0))
602- then true
603- else !(wxEmission))
604- then true
605- else !(balanceIsOk))
606- then 0
607- else fraction(votingResult, poolWeightMult, totalVotes)
608- let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
609- if ((modifyWeightInv == modifyWeightInv))
598+ let deleteWxEmissionLabelInv = if (balanceIsOk)
599+ then unit
600+ else invoke(factoryContract, "deleteWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
601+ if ((deleteWxEmissionLabelInv == deleteWxEmissionLabelInv))
610602 then {
611- let poolsListActions = if (if (wxEmission)
603+ let wxEmission = checkWxEmissionPoolLabel(pool)
604+ let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
605+ let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
606+ let share = if (if ((totalVotes == 0))
612607 then true
613- else force)
614- then nil
615- else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
616- $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
608+ else !(wxEmission))
609+ then 0
610+ else fraction(votingResult, poolWeightMult, totalVotes)
611+ let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
612+ if ((modifyWeightInv == modifyWeightInv))
613+ then {
614+ let poolsListActions = if (if (wxEmission)
615+ then true
616+ else force)
617+ then nil
618+ else ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolStr))
619+ $Tuple2(([IntegerEntry(keyPoolShare(pool, targetEpoch), share)] ++ poolsListActions), false)
620+ }
621+ else throw("Strict value is not equal to itself.")
617622 }
618623 else throw("Strict value is not equal to itself.")
619624 }
620625 else throw("Strict value is not equal to itself.")
621626 }
622627 else throw("Strict value is not equal to itself.")
623628 }
624629 else throw("Strict value is not equal to itself.")
625630 }
626631
627632
628633
629634 @Callable(i)
630635 func finalizeHelper () = {
631636 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
632637 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
633638 let previousEpoch = (epoch - 1)
634639 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
635640 let epochLength = getIntOrFail(this, keyEpochLength)
636641 let endHeight = (startHeight + epochLength)
637642 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
638643 if (if (if ((height >= endHeight))
639644 then (finalizationStageOrUnit == unit)
640645 else false)
641646 then !(force)
642647 else false)
643648 then {
644649 let newEpoch = (epoch + 1)
645650 let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
646651 let newEpochLengthActions = match newEpochLengthOption {
647652 case newEpochLength: Int =>
648653 [IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
649654 case _: Unit =>
650655 nil
651656 case _ =>
652657 throw("Match error")
653658 }
654659 $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
655660 }
656661 else if (if (force)
657662 then (finalizationStageOrUnit == unit)
658663 else false)
659664 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
660665 else if ((finalizationStageOrUnit == unit))
661666 then $Tuple2(nil, false)
662667 else if ((finalizationStageOrUnit == finalizationStageTotal))
663668 then {
664669 let poolOrUnit = getString(keyNextPool)
665670 let userOrUnit = getString(keyNextUser)
666671 match poolOrUnit {
667672 case _: Unit =>
668673 match getString(keyListHead(poolsListName)) {
669674 case _: Unit =>
670675 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
671676 case poolsHeadStr: String =>
672677 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
673678 case _ =>
674679 throw("Match error")
675680 }
676681 case poolStr: String =>
677682 let pool = stringToPool(poolStr)
678683 let nextUserOrUnit = match userOrUnit {
679684 case _: Unit =>
680685 getString(keyListHead(getVotesListName(pool)))
681686 case user: String =>
682687 let next = getString(keyListNext(getVotesListName(pool), user))
683688 if ((next == next))
684689 then {
685690 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
686691 if ((processVoteInv == processVoteInv))
687692 then next
688693 else throw("Strict value is not equal to itself.")
689694 }
690695 else throw("Strict value is not equal to itself.")
691696 case _ =>
692697 throw("Match error")
693698 }
694699 match nextUserOrUnit {
695700 case _: Unit =>
696701 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
697702 match nextPoolOrUnit {
698703 case _: Unit =>
699704 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
700705 case s: String =>
701706 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
702707 case _ =>
703708 throw("Match error")
704709 }
705710 case nextUser: String =>
706711 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
707712 case _ =>
708713 throw("Match error")
709714 }
710715 case _ =>
711716 throw("Match error")
712717 }
713718 }
714719 else if ((finalizationStageOrUnit == finalizationStageShares))
715720 then {
716721 let poolOrUnit = getString(keyNextPool)
717722 match poolOrUnit {
718723 case _: Unit =>
719724 match getString(keyListHead(poolsListName)) {
720725 case _: Unit =>
721726 let actions = if (force)
722727 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
723728 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
724729 let gwxRewardDepositInv = gwxRewardDeposit()
725730 if ((gwxRewardDepositInv == gwxRewardDepositInv))
726731 then $Tuple2(actions, true)
727732 else throw("Strict value is not equal to itself.")
728733 case nextPoolStr: String =>
729734 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
730735 case _ =>
731736 throw("Match error")
732737 }
733738 case poolStr: String =>
734739 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
735740 if ((nextPoolOrUnit == nextPoolOrUnit))
736741 then {
737742 let r = {
738743 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
739744 if ($isInstanceOf(@, "Boolean"))
740745 then @
741746 else throw(($getType(@) + " couldn't be cast to Boolean"))
742747 }
743748 if ((r == r))
744749 then if (r)
745750 then $Tuple2(nil, true)
746751 else match nextPoolOrUnit {
747752 case _: Unit =>
748753 let actions = if (force)
749754 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
750755 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
751756 let gwxRewardDepositInv = gwxRewardDeposit()
752757 if ((gwxRewardDepositInv == gwxRewardDepositInv))
753758 then $Tuple2(actions, true)
754759 else throw("Strict value is not equal to itself.")
755760 case nextPoolStr: String =>
756761 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
757762 case _ =>
758763 throw("Match error")
759764 }
760765 else throw("Strict value is not equal to itself.")
761766 }
762767 else throw("Strict value is not equal to itself.")
763768 case _ =>
764769 throw("Match error")
765770 }
766771 }
767772 else throwErr("finalization is broken")
768773 }
769774
770775
771776
772777 @Callable(i)
773778 func finalizeWrapper (counter) = {
774779 let votingEmissionRateContract = addressFromStringValue(getStringValue(this, keyVotingEmissionRateContract))
775780 let result = {
776781 let @ = invoke(this, "finalizeHelper", nil, nil)
777782 if ($isInstanceOf(@, "Boolean"))
778783 then @
779784 else throw(($getType(@) + " couldn't be cast to Boolean"))
780785 }
781786 if ((result == result))
782787 then if (!(result))
783788 then if ((counter == 0))
784789 then throwErr("Current voting is not over yet")
785790 else {
786791 let inv = invoke(votingEmissionRateContract, "finalize", nil, nil)
787792 if ((inv == inv))
788793 then $Tuple2(nil, unit)
789794 else throw("Strict value is not equal to itself.")
790795 }
791796 else {
792797 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
793798 if ((maxDepth > counter))
794799 then {
795800 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
796801 if ((inv == inv))
797802 then $Tuple2(nil, unit)
798803 else throw("Strict value is not equal to itself.")
799804 }
800805 else $Tuple2(nil, unit)
801806 }
802807 else throw("Strict value is not equal to itself.")
803808 }
804809
805810
806811
807812 @Callable(i)
808813 func finalize () = {
809814 let inv = invoke(this, "finalizeWrapper", [0], nil)
810815 if ((inv == inv))
811816 then $Tuple2(nil, unit)
812817 else throw("Strict value is not equal to itself.")
813818 }
814819
815820
816821
817822 @Callable(i)
818823 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
819824
820825
821826
822827 @Callable(i)
823828 func insertNode (listName,id) = {
824829 let checkCaller = mustManager(i)
825830 if ((checkCaller == checkCaller))
826831 then $Tuple2(insertNodeActions(listName, id), unit)
827832 else throw("Strict value is not equal to itself.")
828833 }
829834
830835
831836
832837 @Callable(i)
833838 func deleteNode (listName,id) = {
834839 let checkCaller = mustManager(i)
835840 if ((checkCaller == checkCaller))
836841 then $Tuple2(deleteNodeActions(listName, id), unit)
837842 else throw("Strict value is not equal to itself.")
838843 }
839844
840845
841846
842847 @Callable(i)
843848 func isFinalizationInProgress () = {
844849 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
845850 let finalizationInProgress = (finalizationStageOrUnit != unit)
846851 $Tuple2(nil, finalizationInProgress)
847852 }
848853
849854
850855
851856 @Callable(i)
852857 func deletePool (amountAssetId,priceAssetId) = {
853858 let checkCaller = if (if ((i.caller == factoryContract))
854859 then true
855860 else mustManager(i))
856861 then true
857862 else throwErr("Permission denied")
858863 if ((checkCaller == checkCaller))
859864 then {
860865 let listName = "pools"
861866 let pool = $Tuple2(amountAssetId, priceAssetId)
862867 let id = makeString([amountAssetId, priceAssetId], separator)
863868 let actions = if (containsNode(listName, id))
864869 then deleteNodeActions(listName, id)
865870 else nil
866871 ([DeleteEntry(keyInList(pool))] ++ actions)
867872 }
868873 else throw("Strict value is not equal to itself.")
869874 }
870875
871876
872877 @Verifier(tx)
873878 func verify () = {
874879 let targetPublicKey = match managerPublicKeyOrUnit() {
875880 case pk: ByteVector =>
876881 pk
877882 case _: Unit =>
878883 tx.senderPublicKey
879884 case _ =>
880885 throw("Match error")
881886 }
882887 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
883888 }
884889

github/deemru/w8io/169f3d6 
95.26 ms