2024.04.17 13:20 [3066620] smart account 3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr > SELF 0.00000000 Waves

{ "type": 13, "id": "KTryZkBiizn7FmoWa3HxgrzWHARH3brtXuWu8ijAznF", "fee": 2800000, "feeAssetId": null, "timestamp": 1713349251367, "version": 2, "chainId": 84, "sender": "3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr", "senderPublicKey": "GFbasS3jufhZkK4xR7tdTjjnP8K33KvJFEDHRtxXDkaJ", "proofs": [ "4SykNKhabRQCkjHbpSkYMXwETmyspdxF5A9jNa1eMHvSTcqDSbfmh5mRgyZm62RuenhD3V3dqBJisYiJnjrJRDgD" ], "script": "base64:BgLoHAgCEgQKAggBEgcKBQgICAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgMKAQESAwoBCBIECgIICBIECgIIBBIAEgMKAQESABIECgIICBIECgIICBIECgIICBIAEgQKAggIEgUKAwgIASIJc2VwYXJhdG9yIg5wb29sV2VpZ2h0TXVsdCIPbWF4RGVwdGhEZWZhdWx0IhlmaW5hbGl6YXRpb25TdGFnZUJhbGFuY2VzIhZmaW5hbGl6YXRpb25TdGFnZVRvdGFsIhdmaW5hbGl6YXRpb25TdGFnZVNoYXJlcyILd2F2ZXNTdHJpbmciDmtleUVwb2NoTGVuZ3RoIhFrZXlFcG9jaExlbmd0aE5ldyIVa2V5RXBvY2hMZW5ndGhCeUVwb2NoIgVlcG9jaCIPa2V5Q3VycmVudEVwb2NoIgtrZXlNYXhEZXB0aCIQa2V5UmVzdW1wdGlvbkZlZSIia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdCIda2V5Vm90aW5nRW1pc3Npb25SYXRlQ29udHJhY3QiEmtleUZhY3RvcnlDb250cmFjdCITa2V5Qm9vc3RpbmdDb250cmFjdCISa2V5U3Rha2luZ0NvbnRyYWN0IhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IhRrZXlGaW5hbGl6YXRpb25TdGFnZSILa2V5TmV4dFBvb2wiC2tleU5leHRVc2VyIg5rZXlTdGFydEhlaWdodCIRa2V5Q3VycmVudEVwb2NoVWkiEGtleVN0YXJ0SGVpZ2h0VWkiHWtleUZpbmFsaXphdGlvblNob3VsZEJlRm9yY2VkIhZrZXlBbGxvd2VkTHBTY3JpcHRIYXNoIhxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoIhVrZXlTdGFydEhlaWdodEJ5RXBvY2giDGtleUZpbmFsaXplZCIJa2V5SW5MaXN0IgRwb29sIgskdDAyMTI3MjE2NyINYW1vdW50QXNzZXRJZCIMcHJpY2VBc3NldElkIhdrZXlJbnN1ZmZpY2llbnRCYWxhbmNlcyILJHQwMjMxNjIzNTYiB2tleVVzZWQiB2FkZHJlc3MiB2tleVZvdGUiCyR0MDI2NjQyNzA0Ig9rZXlWb3RpbmdSZXN1bHQiCyR0MDI4ODYyOTI2IhVrZXlWb3RpbmdSZXN1bHRTdGFrZWQiDGxwQXNzZXRJZFN0ciIMa2V5UG9vbFNoYXJlIgskdDAzMjQ3MzI4NyINa2V5VG90YWxWb3RlcyIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIHd3JhcEVyciIDbXNnIgh0aHJvd0VyciIOZ2V0VmFsdWVPckZhaWwiA2tleSIEdHlwZSIFZXJyb3IiByRtYXRjaDAiA3N0ciIDaW50IgxnZXRTdHJPckZhaWwiAUAiDGdldEludE9yRmFpbCIMcG9vbFRvU3RyaW5nIgxzdHJpbmdUb1Bvb2wiBXBhcnRzIg9mYWN0b3J5Q29udHJhY3QiGklkeEZhY3RvcnlDZmdHd3hSZXdhcmREYXBwIg1rZXlGYWN0b3J5Q2ZnIhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIMcGFyc2VBc3NldElkIgVpbnB1dCIPYXNzZXRJZFRvU3RyaW5nIgtnZXRQb29sSW5mbyIOcG9vbEluZm9PcHRpb24iFmdldExwQXNzZXRCeVBvb2xBc3NldHMiH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQiDGJhc2VBc3NldFN0ciIpa2V5TWFwcGluZ1Bvb2xBc3NldHNUb1Bvb2xDb250cmFjdEFkZHJlc3MiGGludGVybmFsQW1vdW50QXNzZXRJZFN0ciIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIiH2tleU1hcHBpbmdQb29sQ29udHJhY3RUb0xQQXNzZXQiE3Bvb2xDb250cmFjdEFkZHJlc3MiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiCWxwQXNzZXRJZCIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsIgskdDA2NjQ3NjY4NyIQZ3d4UmV3YXJkRGVwb3NpdCISZ3d4UmV3YXJkc0NvbnRyYWN0Ig1wb29sc0xpc3ROYW1lIhBnZXRWb3Rlc0xpc3ROYW1lIgskdDA3MTA0NzE0NCILa2V5TGlzdEhlYWQiCGxpc3ROYW1lIgRtZXRhIgtrZXlMaXN0U2l6ZSILa2V5TGlzdFByZXYiAmlkIgtrZXlMaXN0TmV4dCIMY29udGFpbnNOb2RlIgpoZWFkT3JVbml0IgpwcmV2T3JVbml0IgpuZXh0T3JVbml0IhFpbnNlcnROb2RlQWN0aW9ucyIIbGlzdFNpemUiCWNoZWNrTm9kZSIRZGVsZXRlTm9kZUFjdGlvbnMiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiE2tleU1hbmFnZXJQdWJsaWNLZXkiHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiE21hbmFnZXJWYXVsdEFkZHJlc3MiCWlzTWFuYWdlciIBaSICcGsiC211c3RNYW5hZ2VyIghtdXN0VGhpcyILdXNlckFkZHJlc3MiDHRhcmdldEhlaWdodCIXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MiH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiD3N0YWtpbmdDb250cmFjdCILZXBvY2hMZW5ndGgiBmNoZWNrcyINaW5MaXN0QWN0aW9ucyIYY3VycmVudEVwb2NoSXNOb3REZWZpbmVkIhJzdGFydEhlaWdodEFjdGlvbnMiBmFtb3VudCILc3RhcnRIZWlnaHQiCWVuZEhlaWdodCIXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQiBHVzZWQiBHZvdGUiCnBvb2xSZXN1bHQiCnRvdGFsVm90ZXMiE2d3eEFtb3VudEF0RW5kVG90YWwiCWF2YWlsYWJsZSIHbmV3Vm90ZSIKd3hFbWlzc2lvbiINdm90ZXNMaXN0TmFtZSIQdm90ZXNMaXN0QWN0aW9ucyIObmV3RXBvY2hMZW5ndGgiC25ld01heERlcHRoIgdwb29sU3RyIgtjaGVja0NhbGxlciINZXBvY2hQcmV2aW91cyINJHQwMTczNjgxNzQwOCISYmFsYW5jZUlzT2tDdXJyZW50IhNiYWxhbmNlSXNPa1ByZXZpb3VzIgdhY3Rpb25zIhNkZWxldGVXeEVtaXNzaW9uSW52Ig9tb2RpZnlXZWlnaHRJbnYiC3Bvb2xBZGRyZXNzIgluZXdTdGF0dXMiEHNldFBvb2xTdGF0dXNJbnYiC2xpc3RBY3Rpb25zIhNzdGFydEhlaWdodFByZXZpb3VzIhNlcG9jaExlbmd0aFByZXZpb3VzIhFlbmRIZWlnaHRQcmV2aW91cyIQY2hlY2tUYXJnZXRFcG9jaCINJHQwMTk3NjExOTgwMSIbZ3d4QW1vdW50QXRFbmRUb3RhbFByZXZpb3VzIgx2b3RpbmdSZXN1bHQiDHZvdGVQcmV2aW91cyIadm90aW5nUmVzdWx0U3Rha2VkUHJldmlvdXMiDHN0YWtlZEJ5VXNlciIZdm90aW5nUmVzdWx0U3Rha2VkQWN0aW9ucyIFZm9yY2UiC3RhcmdldEVwb2NoIgxjdXJyZW50RXBvY2giDSR0MDIyMTY0MjIyMDQiAXIiE2Fzc2V0c1N0b3JlQ29udHJhY3QiBXNoYXJlIg1wcmV2aW91c0Vwb2NoIghuZXdFcG9jaCIUbmV3RXBvY2hMZW5ndGhPcHRpb24iFW5ld0Vwb2NoTGVuZ3RoQWN0aW9ucyIKcG9vbE9yVW5pdCIHJG1hdGNoMSILbmV4dFBvb2xTdHIiDm5leHRQb29sT3JVbml0Igp1c2VyT3JVbml0Igxwb29sc0hlYWRTdHIiDm5leHRVc2VyT3JVbml0IgR1c2VyIgRuZXh0Ig5wcm9jZXNzVm90ZUludiIHJG1hdGNoMiIIbmV4dFVzZXIiE2d3eFJld2FyZERlcG9zaXRJbnYiB2NvdW50ZXIiGnZvdGluZ0VtaXNzaW9uUmF0ZUNvbnRyYWN0IgZyZXN1bHQiA2ludiIIbWF4RGVwdGgiFmZpbmFsaXphdGlvbkluUHJvZ3Jlc3MiH3NsaXBwYWdlVG9sZXJhbmNlT3JNaW5PdXRBbW91bnQiDSR0MDMzMDg1MzMyMTUiCmZlZVBheW1lbnQiD2tCb29zdGluZ0NvbmZpZyINaWR4Q2ZnQXNzZXRJZCIJd3hBc3NldElkIhNhbW91bnRBc3NldFZlcmlmaWVkIhJwcmljZUFzc2V0VmVyaWZpZWQiDXJlc3VtcHRpb25GZWUiFGxwQXNzZXRCYWxhbmNlQmVmb3JlIglhdXRvU3Rha2UiA3B1dCILYmFsYW5jZUlzT2siDnBvb2xTY3JpcHRIYXNoIhFhbGxvd2VkU2NyaXB0SGFzaCIIaXNTdGFibGUiDGZ1bmN0aW9uTmFtZSITbHBBc3NldEJhbGFuY2VBZnRlciISbHBBc3NldEJhbGFuY2VEaWZmIhZscEFzc2V0VHJhbnNmZXJBY3Rpb25zIhBzZXRXeEVtaXNzaW9uSW52IgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXlJAAFhAgJfXwABYgCAwtcvAAFjAAoAAWQAAAABZQABAAFmAAIAAWcCBVdBVkVTAAFoCQC5CQIJAMwIAgICJXMJAMwIAgILZXBvY2hMZW5ndGgFA25pbAUBYQABaQkAuQkCCQDMCAICBCVzJXMJAMwIAgIQZXBvY2hMZW5ndGhfX25ldwUDbmlsBQFhAQFqAQFrCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtlcG9jaExlbmd0aAkAzAgCCQCkAwEFAWsFA25pbAUBYQABbAkAuQkCCQDMCAICAiVzCQDMCAICDGN1cnJlbnRFcG9jaAUDbmlsBQFhAAFtCQC5CQIJAMwIAgICJXMJAMwIAgIIbWF4RGVwdGgFA25pbAUBYQABbgkAuQkCCQDMCAICAiVzCQDMCAICDXJlc3VtcHRpb25GZWUFA25pbAUBYQABbwkAuQkCCQDMCAICAiVzCQDMCAICH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QFA25pbAUBYQABcAkAuQkCCQDMCAICAiVzCQDMCAICGnZvdGluZ0VtaXNzaW9uUmF0ZUNvbnRyYWN0BQNuaWwFAWEAAXEJALkJAgkAzAgCAgIlcwkAzAgCAg9mYWN0b3J5Q29udHJhY3QFA25pbAUBYQABcgkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUBYQABcwkAuQkCCQDMCAICAiVzCQDMCAICD3N0YWtpbmdDb250cmFjdAUDbmlsBQFhAAF0CQC5CQIJAMwIAgICJXMJAMwIAgITYXNzZXRzU3RvcmVDb250cmFjdAUDbmlsBQFhAAF1CQC5CQIJAMwIAgICJXMJAMwIAgIRZmluYWxpemF0aW9uU3RhZ2UFA25pbAUBYQABdgkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRQb29sBQNuaWwFAWEAAXcJALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0VXNlcgUDbmlsBQFhAAF4CQC5CQIJAMwIAgICJXMJAMwIAgILc3RhcnRIZWlnaHQFA25pbAUBYQABeQkAuQkCCQDMCAICAiVzCQDMCAICDmN1cnJlbnRFcG9jaFVpBQNuaWwFAWEAAXoJALkJAgkAzAgCAgIlcwkAzAgCAg1zdGFydEhlaWdodFVpBQNuaWwFAWEAAUEJALkJAgkAzAgCAgIlcwkAzAgCAgVmb3JjZQUDbmlsBQFhAQFCAAIXJXNfX2FsbG93ZWRMcFNjcmlwdEhhc2gBAUMAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAEBRAEBawkAuQkCCQDMCAICBCVzJWQJAMwIAgILc3RhcnRIZWlnaHQJAMwIAgkApAMBBQFrBQNuaWwFAWEBAUUBAWsJALkJAgkAzAgCAgQlcyVkCQDMCAICCWZpbmFsaXplZAkAzAgCCQCkAwEFAWsFA25pbAUBYQEBRgEBRwQBSAUBRwQBSQgFAUgCXzEEAUoIBQFIAl8yCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBmluTGlzdAkAzAgCBQFJCQDMCAIFAUoFA25pbAUBYQEBSwIBRwFrBAFMBQFHBAFJCAUBTAJfMQQBSggFAUwCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAhRpbnN1ZmZpY2llbnRCYWxhbmNlcwkAzAgCBQFJCQDMCAIFAUoJAMwIAgkApAMBBQFrBQNuaWwFAWEBAU0CAU4BawkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgR1c2VkCQDMCAIJAKUIAQUBTgkAzAgCCQCkAwEFAWsFA25pbAUBYQEBTwMBRwFOAWsEAVAFAUcEAUkIBQFQAl8xBAFKCAUBUAJfMgkAuQkCCQDMCAICCiVzJXMlcyVzJWQJAMwIAgIEdm90ZQkAzAgCBQFJCQDMCAIFAUoJAMwIAgkApQgBBQFOCQDMCAIJAKQDAQUBawUDbmlsBQFhAQFRAgFHAWsEAVIFAUcEAUkIBQFSAl8xBAFKCAUBUgJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICDHZvdGluZ1Jlc3VsdAkAzAgCBQFJCQDMCAIFAUoJAMwIAgkApAMBBQFrBQNuaWwFAWEBAVMCAVQBawkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhJ2b3RpbmdSZXN1bHRTdGFrZWQJAMwIAgUBVAkAzAgCCQCkAwEFAWsFA25pbAUBYQEBVQIBRwFrBAFWBQFHBAFJCAUBVgJfMQQBSggFAVYCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAglwb29sU2hhcmUJAMwIAgUBSQkAzAgCBQFKCQDMCAIJAKQDAQUBawUDbmlsBQFhAQFXAQFrCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgp0b3RhbFZvdGVzCQDMCAIJAKQDAQUBawUDbmlsBQFhAQFYAgFUAVkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGc3Rha2VkCQDMCAIFAVkJAMwIAgUBVAUDbmlsBQFhAQFaAQJhYQkAuQkCCQDMCAICFXZvdGluZ19lbWlzc2lvbi5yaWRlOgkAzAgCBQJhYQUDbmlsAgEgAQJhYgECYWEJAAIBCQEBWgEFAmFhAQJhYwMBTgJhZAJhZQQCYWYJAQFaAQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQFOCQDMCAICAS4JAMwIAgUCYWQJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBAJhZwUCYWUDCQABAgUCYWcCBlN0cmluZwQCYWgFAmFnCQCdCAIFAU4FAmFkAwkAAQIFAmFnAgNJbnQEAmFpBQJhZwkAmggCBQFOBQJhZAkBAmFiAQISaW52YWxpZCBlbnRyeSB0eXBlBQJhZgECYWoCAU4CYWQKAAJhawkBAmFjAwUBTgUCYWQCAAMJAAECBQJhawIGU3RyaW5nBQJhawkAAgEJAKwCAgkAAwEFAmFrAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcBAmFsAgFOAmFkCgACYWsJAQJhYwMFAU4FAmFkAAADCQABAgUCYWsCA0ludAUCYWsJAAIBCQCsAgIJAAMBBQJhawIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQJhbQEBRwkArAICCQCsAgIIBQFHAl8xBQFhCAUBRwJfMgECYW4BAmFoBAJhbwkAtQkCBQJhaAUBYQMJAAACCQCQAwEFAmFvAAIJAJQKAgkAkQMCBQJhbwAACQCRAwIFAmFvAAEJAQJhYgECE2ludmFsaWQgcG9vbCBzdHJpbmcAAmFwCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYWoCBQR0aGlzBQFxAAJhcQAKAQJhcgACESVzX19mYWN0b3J5Q29uZmlnAQJhcwECYXQJALUJAgkBAmFqAgUCYXQJAQJhcgAFAWEBAmF1AQJhdgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhdgUCYXEBAmF3AQJheAMJAAACBQJheAUBZwUEdW5pdAkA2QQBBQJheAECYXkBAmF4AwkAAAIFAmF4BQR1bml0BQFnCQDYBAEJAQV2YWx1ZQEFAmF4AQJhegIBSQFKBAJhQQoAAmFrCQD8BwQFAmFwAhBwb29sSW5mb1JFQURPTkxZCQDMCAIFAUkJAMwIAgUBSgUDbmlsBQNuaWwDCQABAgUCYWsCFShBZGRyZXNzLCBCeXRlVmVjdG9yKQUCYWsFBHVuaXQFAmFBAQJhQgIBSQFKCgECYUMBAmFECQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmFECgECYUUCAmFGAmFHCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18JAKQDAQUCYUYCAl9fCQCkAwEFAmFHAiNfX21hcHBpbmdzX19wb29sQXNzZXRzMlBvb2xDb250cmFjdAoBAmFIAQJhSQkArAICCQCsAgICCCVzJXMlc19fBQJhSQIgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQEAmFKCQECYWwCBQJhcAkBAmFDAQUBSQQCYUsJAQJhbAIFAmFwCQECYUMBBQFKBAJhSQkBAmFqAgUCYXAJAQJhRQIFAmFKBQJhSwQCYUwJAQJhagIFAmFwCQECYUgBBQJhSQUCYUwBAmFNAQFHBAJhTgUBRwQBSQgFAmFOAl8xBAFKCAUCYU4CXzIKAAJhawkA/AcEBQJhcAIYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAUkJAMwIAgUBSgUDbmlsBQNuaWwDCQABAgUCYWsCB0Jvb2xlYW4FAmFrCQACAQkArAICCQADAQUCYWsCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4BAmFPAAQCYXYJAQJhcwEFAmFwBAJhUAkBAmF1AQUCYXYJAPwHBAUCYVACB2RlcG9zaXQFA25pbAUDbmlsAAJhUQIFcG9vbHMBAmFSAQFHBAJhUwUBRwQBSQgFAmFTAl8xBAFKCAUCYVMCXzIJALkJAgkAzAgCAgV2b3RlcwkAzAgCBQFJCQDMCAIFAUoFA25pbAUBYQECYVQBAmFVBAJhVgMJAAACBQJhVQUCYVECBCVzJXMCCCVzJXMlcyVzCQC5CQIJAMwIAgUCYVYJAMwIAgUCYVUJAMwIAgIEaGVhZAUDbmlsBQFhAQJhVwECYVUEAmFWAwkAAAIFAmFVBQJhUQIEJXMlcwIIJXMlcyVzJXMJALkJAgkAzAgCBQJhVgkAzAgCBQJhVQkAzAgCAgRzaXplBQNuaWwFAWEBAmFYAgJhVQJhWQQCYVYDCQAAAgUCYVUFAmFRAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFAmFWCQDMCAIFAmFVCQDMCAIFAmFZCQDMCAICBHByZXYFA25pbAUBYQECYVoCAmFVAmFZBAJhVgMJAAACBQJhVQUCYVECCCVzJXMlcyVzAgolcyVzJXMlcyVzCQC5CQIJAMwIAgUCYVYJAMwIAgUCYVUJAMwIAgUCYVkJAMwIAgIEbmV4dAUDbmlsBQFhAQJiYQICYVUCYVkEAmJiCQCdCAIFBHRoaXMJAQJhVAEFAmFVBAJiYwkAnQgCBQR0aGlzCQECYVgCBQJhVQUCYVkEAmJkCQCdCAIFBHRoaXMJAQJhWgIFAmFVBQJhWQMDCQAAAgUCYVkJAQt2YWx1ZU9yRWxzZQIFAmJiAgAGCQECIT0CBQJiYwUEdW5pdAYJAQIhPQIFAmJkBQR1bml0AQJiZQICYVUCYVkEAmJiCQCdCAIFBHRoaXMJAQJhVAEFAmFVBAJiZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYVcBBQJhVQAABAJiZwMJAQEhAQkBAmJhAgUCYVUFAmFZBgkBAmFiAQILTm9kZSBleGlzdHMDCQAAAgUCYmcFAmJnCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFXAQUCYVUJAGQCBQJiZgABBQNuaWwDCQECIT0CBQJiYgUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYVoCBQJhVQUCYVkJAQV2YWx1ZQEFAmJiCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhWAIFAmFVCQEFdmFsdWUBBQJiYgUCYVkFA25pbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhVAEFAmFVBQJhWQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJiaAICYVUCYVkEAmJiCQCdCAIFBHRoaXMJAQJhVAEFAmFVBAJiZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYVcBBQJhVQAABAJiYwkAnQgCBQR0aGlzCQECYVgCBQJhVQUCYVkEAmJkCQCdCAIFBHRoaXMJAQJhWgIFAmFVBQJhWQkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYVcBBQJhVQkAZQIFAmJmAAEFA25pbAMDCQECIT0CBQJiYwUEdW5pdAkBAiE9AgUCYmQFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhWgIFAmFVCQEFdmFsdWUBBQJiYwkBBXZhbHVlAQUCYmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFYAgUCYVUJAQV2YWx1ZQEFAmJkCQEFdmFsdWUBBQJiYwkAzAgCCQELRGVsZXRlRW50cnkBCQECYVgCBQJhVQUCYVkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFaAgUCYVUFAmFZBQNuaWwDCQECIT0CBQJiZAUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYVQBBQJhVQkBBXZhbHVlAQUCYmQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFaAgUCYVUFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhWAIFAmFVCQEFdmFsdWUBBQJiZAUDbmlsAwkBAiE9AgUCYmMFBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFYAgUCYVUFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhWgIFAmFVCQEFdmFsdWUBBQJiYwUDbmlsAwkAAAIFAmFZCQELdmFsdWVPckVsc2UCBQJiYgIACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhVAEFAmFVBQNuaWwJAQJhYgEJAKwCAgkArAICCQCsAgICDmludmFsaWQgbm9kZTogBQJhVQIBLgUCYVkBAmJpAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBAmJqAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAmJrAAQCYWcJAKIIAQkBAmJpAAMJAAECBQJhZwIGU3RyaW5nBAJibAUCYWcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmJsBQR0aGlzAQJibQAEAmJuCQECYmsABAJhZwkAnQgCBQJibgkBAmJqAAMJAAECBQJhZwIGU3RyaW5nBAJibAUCYWcJANkEAQUCYmwDCQABAgUCYWcCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYm8BAmJwBAJhZwkBAmJtAAMJAAECBQJhZwIKQnl0ZVZlY3RvcgQCYnEFAmFnCQAAAggFAmJwD2NhbGxlclB1YmxpY0tleQUCYnEDCQABAgUCYWcCBFVuaXQJAAACCAUCYnAGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmJyAQJicAMJAQJibwEFAmJwBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkAQJicwECYnADCQAAAggFAmJwBmNhbGxlcgUEdGhpcwYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZBMCYnABGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAICYnQCYnUEAmJ2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBAmFqAgUEdGhpcwUBcgkBAVoBAiFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAJQKAgUDbmlsCgACYWsJAPwHBAUCYnYCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFAmJ0CQDMCAIFAmJ1BQNuaWwFA25pbAMJAAECBQJhawIDSW50BQJhawkAAgEJAKwCAgkAAwEFAmFrAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQCYnABC2NvbnN0cnVjdG9yBQJhcAJidwJieAJieQJiegQCYkEJAMwIAgkBAmJyAQUCYnAJAMwIAgMJAQIhPQIJAKYIAQUCYXAFBHVuaXQGAiBpbnZhbGlkIGZhY3RvcnkgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBAiE9AgkApggBBQJidwUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJ4BQR1bml0BgIhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJ5BQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQJiegAABgkBAmFiAQIUaW52YWxpZCBlcG9jaCBsZW5ndGgFA25pbAMJAAACBQJiQQUCYkEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQFxBQJhcAkAzAgCCQELU3RyaW5nRW50cnkCBQFvBQJidwkAzAgCCQELU3RyaW5nRW50cnkCBQFyBQJieAkAzAgCCQELU3RyaW5nRW50cnkCBQFzBQJieQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBaAUCYnoFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJicAEGY3JlYXRlAgFJAUoEAmJBCQDMCAIDCQAAAgkA2AQBCAgFAmJwBmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQFvAgAGCQECYnIBBQJicAUDbmlsAwkAAAIFAmJBBQJiQQQBRwkAlAoCBQFJBQFKBAJiQgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBRgEFAUcGBQNuaWwJAQJiZQIFAmFRCQECYW0BBQFHBAJiQwkAAAIJAJoIAgUEdGhpcwUBbAUEdW5pdAQCYkQDBQJiQwQBawAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFsBQFrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRAEFAWsFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBeAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF5BQFrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF6BQZoZWlnaHQFA25pbAUDbmlsCQCUCgIJAM4IAgUCYkIFAmJEBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJwAQR2b3RlAwFJAUoCYkUEAUcJAJQKAgUBSQUBSgQBawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFsAAAEAmJGCQECYWwCBQR0aGlzCQEBRAEFAWsEAmJ6CQECYWwCBQR0aGlzBQFoBAJiRwkAZAIFAmJGBQJiegQCYkgJAJoIAgUEdGhpcwUBdQQCYkkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAU0CCAUCYnAGY2FsbGVyBQFrAAAEAmJKCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFPAwUBRwgFAmJwBmNhbGxlcgUBawAABAJiSwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBUQIFAUcFAWsAAAQCYkwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAVcBBQFrAAAEAmJNCgACYWsJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIJANgEAQgIBQJicAZjYWxsZXIFYnl0ZXMJAMwIAgUCYkcFA25pbAUDbmlsAwkAAQIFAmFrAgNJbnQFAmFrCQACAQkArAICCQADAQUCYWsCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYk4JAGUCBQJiTQUCYkkEAmJPCQBkAgUCYkoFAmJFBAJiUAkBAmFNAQUBRwQCYkEJAMwIAgMJAQIhPQIJAKAIAQkBAUYBBQFHBQR1bml0BgkBAmFiAQIOaW52YWxpZCBhc3NldHMJAMwIAgMJAGYCBQJiRwUGaGVpZ2h0BgkBAmFiAQIOaW52YWxpZCBoZWlnaHQJAMwIAgMJAAACBQJiSAUEdW5pdAYJAQJhYgECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFAmJNAAAGCQECYWIBAhN5b3UgZG8gbm90IGhhdmUgZ1dYCQDMCAIDAwkAZgIFAmJFAAAJAGcCBQJiTgUCYkUHBgkBAmFiAQIOaW52YWxpZCBhbW91bnQJAMwIAgMFAmJQBgkBAmFiAQIdcG9vbCBoYXNuJ3QgV1hfRU1JU1NJT04gbGFiZWwFA25pbAMJAAACBQJiQQUCYkEEAmJRCQECYVIBBQFHBAFZCQClCAEIBQJicAZjYWxsZXIEAmJSAwkBAmJhAgUCYlEFAVkFA25pbAkBAmJlAgUCYlEFAVkJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTQIIBQJicAZjYWxsZXIFAWsJAGQCBQJiSQUCYkUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFPAwUBRwgFAmJwBmNhbGxlcgUBawUCYk8JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAgUBRwUBawkAZAIFAmJLBQJiRQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcBBQFrCQBkAgUCYkwFAmJFBQNuaWwFAmJSBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJwAQpjYW5jZWxWb3RlAgFJAUoEAUcJAJQKAgUBSQUBSgQBawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFsAAAEAmJGCQECYWwCBQR0aGlzCQEBRAEFAWsEAmJ6CQECYWwCBQR0aGlzBQFoBAJiRwkAZAIFAmJGBQJiegQCYkgJAJoIAgUEdGhpcwUBdQQCYkkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAU0CCAUCYnAGY2FsbGVyBQFrAAAEAmJKCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFPAwUBRwgFAmJwBmNhbGxlcgUBawAABAJiSwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBUQIFAUcFAWsAAAQCYkwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAVcBBQFrAAAEAmJBCQDMCAIDCQECIT0CCQCgCAEJAQFGAQUBRwUEdW5pdAYJAQJhYgECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYkcFBmhlaWdodAYJAQJhYgECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUCYkgFBHVuaXQGCQECYWIBAhhmaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MJAMwIAgMJAGYCBQJiSgAABgkBAmFiAQIHbm8gdm90ZQUDbmlsAwkAAAIFAmJBBQJiQQQCYlEJAQJhUgEFAUcEAVkJAKUIAQgFAmJwBmNhbGxlcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFNAggFAmJwBmNhbGxlcgUBawkAlgMBCQDMCAIJAGUCBQJiSQUCYkoJAMwIAgAABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAU8DBQFHCAUCYnAGY2FsbGVyBQFrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQIFAUcFAWsJAGUCBQJiSwUCYkoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFXAQUBawkAZQIFAmJMBQJiSgUDbmlsCQECYmgCBQJiUQUBWQUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJicAEOc2V0RXBvY2hMZW5ndGgBAmJTBAJiQQkAzAgCCQECYnIBBQJicAkAzAgCAwkAZgIFAmJTAAAGCQECYWIBAhRpbnZhbGlkIGVwb2NoIGxlbmd0aAUDbmlsAwkAAAIFAmJBBQJiQQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFpBQJiUwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJwAQtzZXRNYXhEZXB0aAECYlQEAmJBCQDMCAIJAQJicgEFAmJwCQDMCAIDCQBmAgUCYlQAAAYJAQJhYgECEWludmFsaWQgbWF4IGRlcHRoBQNuaWwDCQAAAgUCYkEFAmJBCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAW0FAmJUBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnABGnByb2Nlc3NQb29sQmFsYW5jZUlOVEVSTkFMAQJiVQQCYlYJAQJicwEFAmJwAwkAAAIFAmJWBQJiVgQBawkBAmFsAgUEdGhpcwUBbAQCYlcJAGUCBQFrAAEEAUcJAQJhbgEFAmJVBAJiWAUBRwQBSQgFAmJYAl8xBAFKCAUCYlgCXzIEAmFMCQECYUICBQFJBQFKBAJiWQoAAmFrCQD8BwQFAmFwAgxjaGVja0JhbGFuY2UJAMwIAgUCYUwFA25pbAUDbmlsAwkAAQIFAmFrAgdCb29sZWFuBQJhawkAAgEJAKwCAgkAAwEFAmFrAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJiWgkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQFLAgUBRwkAZQIFAmJXAAEHBAJjYQMJAQEhAQUCYlkDCQEBIQEFAmJaBAJjYgkA/AcEBQJhcAIZZGVsZXRlV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQFJCQDMCAIFAUoFA25pbAUDbmlsAwkAAAIFAmNiBQJjYgQCY2MJAPwHBAUCYXACDG1vZGlmeVdlaWdodAkAzAgCBQJhTAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAmNjBQJjYwQCY2QICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQJhegIFAUkFAUoJAQFaAQIOaW52YWxpZCBhc3NldHMCXzEEAmNlAAMEAmNmCQD8BwQFAmFwAgptYW5hZ2VQb29sCQDMCAIJAKUIAQUCY2QJAMwIAgUCY2UFA25pbAUDbmlsAwkAAAIFAmNmBQJjZgQCY2cJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEBRgEFAUcFA25pbAkBAmJoAgUCYVEJAQJhbQEFAUcJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQFHBQJiVwAABQNuaWwFAmNnCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBSwIFAUcFAmJXBgUDbmlsBQNuaWwJAJQKAgUCY2EFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnABE3Byb2Nlc3NWb3RlSU5URVJOQUwCAmJVAVkEAmJWCQECYnMBBQJicAMJAAACBQJiVgUCYlYEAmJ0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBWQkBAVoBCQCsAgICKnByb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzIAUBWQQBawkBAmFsAgUEdGhpcwUBbAQCYlcJAGUCBQFrAAEEAmJ6CQECYWwCBQR0aGlzBQFoBAJiRgkBAmFsAgUEdGhpcwkBAUQBBQFrBAJiRwkAZAIFAmJGBQJiegQCY2gJAQJhbAIFBHRoaXMJAQFEAQUCYlcEAmNpCQECYWwCBQR0aGlzCQEBagEFAmJXBAJjagkAZAIFAmNoBQJjaQQCY2sDCQBnAgUCYlcAAAYJAQJhYgECK3Byb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgcHJldmlvdXMgZXBvY2gDCQAAAgUCY2sFAmNrBAFHCQECYW4BBQJiVQQCY2wFAUcEAUkIBQJjbAJfMQQBSggFAmNsAl8yBAJiTQoAAmFrCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCBQFZCQDMCAIFAmJHBQNuaWwFA25pbAMJAAECBQJhawIDSW50BQJhawkAAgEJAKwCAgkAAwEFAmFrAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmNtCgACYWsJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAVkJAMwIAgUCY2oFA25pbAUDbmlsAwkAAQIFAmFrAgNJbnQFAmFrCQACAQkArAICCQADAQUCYWsCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYkwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAVcBBQFrAAAEAmNuCQELdmFsdWVPckVsc2UCCQCfCAEJAQFRAgUBRwUBawAABAJjbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQFPAwUBRwUCYnQFAmJXCQEBWgEJAKwCAgkArAICCQCsAgIJAKwCAgIUcHJvY2Vzc1ZvdGVJTlRFUk5BTCAFAmJVAgEgBQFZAhI6IG5vIHByZXZpb3VzIHZvdGUEAmJJCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFNAgUCYnQFAWsAAAQBVAkBAmFCAgUBSQUBSgQCY3AJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAVMCBQFUBQJiVwAABAJieQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFqAgUEdGhpcwUBcwQCY3EJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYnkJAQFYAgUBVAUBWQAABAJjcgMJAAACBQJjcQAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFTAgUBVAUCYlcJAGQCBQJjcAUCY28FA25pbAQCYUwJAQJhQgIFAUkFAUoEAmJPAwkAZgIFAmNtAAAJAGsDBQJjbwUCYk0FAmNtAAAEAmNhAwkAZgIFAmJPAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFPAwUBRwUCYnQFAWsFAmJPCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwEFAWsJAGQCBQJiTAUCYk8JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAgUBRwUBawkAZAIFAmNuBQJiTwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAU0CBQJidAUBawkAZAIFAmJJBQJiTwUDbmlsCQECYmgCCQECYVIBBQFHBQFZCQCUCgIJAM4IAgUCY2EFAmNyBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJwARNwcm9jZXNzUG9vbElOVEVSTkFMAgJiVQJjcwQCYlYJAQJicwEFAmJwAwkAAAIFAmJWBQJiVgQCY3QEAmN1CQECYWwCBQR0aGlzBQFsAwUCY3MFAmN1CQBlAgUCY3UAAQQCY2sDCQBnAgUCY3QAAAYJAQJhYgECKXByb2Nlc3NQb29sSU5URVJOQUw6IGludmFsaWQgdGFyZ2V0IGVwb2NoAwkAAAIFAmNrBQJjawQBRwkBAmFuAQUCYlUEAmN2BQFHBAFJCAUCY3YCXzEEAUoIBQJjdgJfMgQCYnkJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhagIFBHRoaXMFAXMEAmFMCQECYUICBQFJBQFKBAJjdwoAAmFrCQD8BwQFAmJ5AhJ1c2Vyc0xpc3RUcmF2ZXJzYWwJAMwIAgUCYUwFA25pbAUDbmlsAwkAAQIFAmFrAgdCb29sZWFuBQJhawkAAgEJAKwCAgkAAwEFAmFrAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmN3BQJjdwMFAmN3CQCUCgIFA25pbAYEAmN4CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXAFAXQCHWludmFsaWQgYXNzZXRzIHN0b3JlIGNvbnRyYWN0BAJiTAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBVwEFAmN0AAAEAmNuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFRAgUBRwUCY3QAAAQCY3kDCQAAAgUCYkwAAAAACQBrAwUCY24FAWIFAmJMBAJjYwkA/AcEBQJhcAIMbW9kaWZ5V2VpZ2h0CQDMCAIFAmFMCQDMCAIFAmN5BQNuaWwFA25pbAMJAAACBQJjYwUCY2MJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQFHBQJjdAUCY3kFA25pbAcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnABDmZpbmFsaXplSGVscGVyAAQCY3MJAQt2YWx1ZU9yRWxzZQIJAKAIAQUBQQcEAWsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBbAAABAJjegkAZQIFAWsAAQQCYkYJAQJhbAIFBHRoaXMJAQFEAQUBawQCYnoJAQJhbAIFBHRoaXMFAWgEAmJHCQBkAgUCYkYFAmJ6BAJiSAkAmggCBQR0aGlzBQF1AwMDCQBnAgUGaGVpZ2h0BQJiRwkAAAIFAmJIBQR1bml0BwkBASEBBQJjcwcEAmNBCQBkAgUBawABBAJjQgkAmggCBQR0aGlzBQFpBAJjQwQCYWcFAmNCAwkAAQIFAmFnAgNJbnQEAmJTBQJhZwkAzAgCCQEMSW50ZWdlckVudHJ5AgUBaAUCYlMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBaQUDbmlsAwkAAQIFAmFnAgRVbml0BQNuaWwJAAIBAgtNYXRjaCBlcnJvcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFEAQUCY0EFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBeAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFsBQJjQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdQUBZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAWoBBQFrBQJiegUDbmlsBQJjQwYDAwUCY3MJAAACBQJiSAUEdW5pdAcJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdQUBZgUDbmlsBgMJAAACBQJiSAUEdW5pdAkAlAoCBQNuaWwHAwkAAAIFAmJIBQFkBAJjRAkAoggBBQF2BAJhZwUCY0QDCQABAgUCYWcCBFVuaXQEAmNFCQCiCAEJAQJhVAEFAmFRAwkAAQIFAmNFAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXUFAWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdgUDbmlsBgMJAAECBQJjRQIGU3RyaW5nBAJjRgUCY0UJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQF2BQJjRgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAmFnAgZTdHJpbmcEAmJVBQJhZwQCY0cJAKIIAQkBAmFaAgUCYVEFAmJVAwkAAAIFAmNHBQJjRwQCY3cJAPwHBAUEdGhpcwIacHJvY2Vzc1Bvb2xCYWxhbmNlSU5URVJOQUwJAMwIAgUCYlUFA25pbAUDbmlsAwkAAAIFAmN3BQJjdwQCY0UFAmNHAwkAAQIFAmNFAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXUFAWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdgUDbmlsBgMJAAECBQJjRQIGU3RyaW5nBAJjRgUCY0UJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQF2BQJjRgUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUCYkgFAWUEAmNECQCiCAEFAXYEAmNICQCiCAEFAXcEAmFnBQJjRAMJAAECBQJhZwIEVW5pdAQCY0UJAKIIAQkBAmFUAQUCYVEDCQABAgUCY0UCBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdQUBZgkAzAgCCQELRGVsZXRlRW50cnkBBQF2CQDMCAIJAQtEZWxldGVFbnRyeQEFAXcFA25pbAYDCQABAgUCY0UCBlN0cmluZwQCY0kFAmNFCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBdgUCY0kFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQJhZwIGU3RyaW5nBAJiVQUCYWcEAUcJAQJhbgEFAmJVBAJjSgQCY0UFAmNIAwkAAQIFAmNFAgRVbml0CQCiCAEJAQJhVAEJAQJhUgEFAUcDCQABAgUCY0UCBlN0cmluZwQCY0sFAmNFBAJjTAkAoggBCQECYVoCCQECYVIBBQFHBQJjSwMJAAACBQJjTAUCY0wEAmNNCQD8BwQFBHRoaXMCE3Byb2Nlc3NWb3RlSU5URVJOQUwJAMwIAgUCYlUJAMwIAgUCY0sFA25pbAUDbmlsAwkAAAIFAmNNBQJjTQUCY0wJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgQCY0UFAmNKAwkAAQIFAmNFAgRVbml0BAJjRwkAoggBCQECYVoCBQJhUQUCYlUEAmNOBQJjRwMJAAECBQJjTgIEVW5pdAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF1BQFmCQDMCAIJAQtEZWxldGVFbnRyeQEFAXYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdwUDbmlsBgMJAAECBQJjTgIGU3RyaW5nBAJibAUCY04JAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQF2BQJibAkAzAgCCQELRGVsZXRlRW50cnkBBQF3BQNuaWwGCQACAQILTWF0Y2ggZXJyb3IDCQABAgUCY0UCBlN0cmluZwQCY08FAmNFCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBdwUCY08FA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECC01hdGNoIGVycm9yAwkAAAIFAmJIBQFmBAJjRAkAoggBBQF2BAJhZwUCY0QDCQABAgUCYWcCBFVuaXQEAmNFCQCiCAEJAQJhVAEFAmFRAwkAAQIFAmNFAgRVbml0BAJjYQMFAmNzCQDMCAIJAQtEZWxldGVFbnRyeQEFAXUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBQQUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAXUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFFAQUCY3oGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF5BQFrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF6BQJiRgUDbmlsBAJjUAkBAmFPAAMJAAACBQJjUAUCY1AJAJQKAgUCY2EGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAQIFAmNFAgZTdHJpbmcEAmNGBQJjRQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXYFAmNGBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IDCQABAgUCYWcCBlN0cmluZwQCYlUFAmFnBAJjRwkAoggBCQECYVoCBQJhUQUCYlUDCQAAAgUCY0cFAmNHBAJjdwoAAmFrCQD8BwQFBHRoaXMCE3Byb2Nlc3NQb29sSU5URVJOQUwJAMwIAgUCYlUJAMwIAgUCY3MFA25pbAUDbmlsAwkAAQIFAmFrAgdCb29sZWFuBQJhawkAAgEJAKwCAgkAAwEFAmFrAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmN3BQJjdwMFAmN3CQCUCgIFA25pbAYEAmNFBQJjRwMJAAECBQJjRQIEVW5pdAQCY2EDBQJjcwkAzAgCCQELRGVsZXRlRW50cnkBBQF1CQDMCAIJAQtEZWxldGVFbnRyeQEFAUEJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdgUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAXUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFFAQUCY3oGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF5BQFrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF6BQJiRgkAzAgCCQELRGVsZXRlRW50cnkBBQF2BQNuaWwEAmNQCQECYU8AAwkAAAIFAmNQBQJjUAkAlAoCBQJjYQYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQABAgUCY0UCBlN0cmluZwQCY0YFAmNFCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBdgUCY0YFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yCQECYWIBAhZmaW5hbGl6YXRpb24gaXMgYnJva2VuAmJwAQ9maW5hbGl6ZVdyYXBwZXIBAmNRBAJjUgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUBcAQCY1MKAAJhawkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUCYWsCB0Jvb2xlYW4FAmFrCQACAQkArAICCQADAQUCYWsCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCY1MFAmNTAwkBASEBBQJjUwMJAAACBQJjUQAACQECYWIBAh5DdXJyZW50IHZvdGluZyBpcyBub3Qgb3ZlciB5ZXQEAmNUCQD8BwQFAmNSAghmaW5hbGl6ZQUDbmlsBQNuaWwDCQAAAgUCY1QFAmNUCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCY1UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBbQUBYwMJAGYCBQJjVQUCY1EEAmNUCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBkAgUCY1EAAQUDbmlsBQNuaWwDCQAAAgUCY1QFAmNUCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnABCGZpbmFsaXplAAQCY1QJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCY1QFAmNUCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJicAEUY29udGFpbnNOb2RlUkVBRE9OTFkCAmFVAmFZCQCUCgIFA25pbAkBAmJhAgUCYVUFAmFZAmJwAQppbnNlcnROb2RlAgJhVQJhWQQCYlYJAQJicgEFAmJwAwkAAAIFAmJWBQJiVgkAlAoCCQECYmUCBQJhVQUCYVkFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnABCmRlbGV0ZU5vZGUCAmFVAmFZBAJiVgkBAmJyAQUCYnADCQAAAgUCYlYFAmJWCQCUCgIJAQJiaAIFAmFVBQJhWQUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJicAEYaXNGaW5hbGl6YXRpb25JblByb2dyZXNzAAQCYkgJAJoIAgUEdGhpcwUBdQQCY1YJAQIhPQIFAmJIBQR1bml0CQCUCgIFA25pbAUCY1YCYnABCmRlbGV0ZVBvb2wCAUkBSgQCYlYDAwkAAAIIBQJicAZjYWxsZXIFAmFwBgkBAmJyAQUCYnAGCQECYWIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAAACBQJiVgUCYlYEAmFVAgVwb29scwQBRwkAlAoCBQFJBQFKBAJhWQkAuQkCCQDMCAIFAUkJAMwIAgUBSgUDbmlsBQFhBAJjYQMJAQJiYQIFAmFVBQJhWQkBAmJoAgUCYVUFAmFZBQNuaWwJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEBRgEFAUcFA25pbAUCY2EJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnABBnJlc3VtZQMBSQFKAmNXBAJjWAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQECYXoCBQFJBQFKCQEBWgECDmludmFsaWQgYXNzZXRzBAJjZAgFAmNYAl8xBAJhTAgFAmNYAl8yBAJjWQkAkQMCCAUCYnAIcGF5bWVudHMAAAQCY3gJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFAXQEAmNaAgolc19fY29uZmlnBAJkYQABBAJieAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFqAgUEdGhpcwUBcgQCZGIJANkEAQkAkQMCCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAmJ4BQJjWgUBYQUCZGEEAmRjCgACYWsJAPwHBAUCY3gCEmlzVmVyaWZpZWRSRUFET05MWQkAzAgCBQFJBQNuaWwFA25pbAMJAAECBQJhawIHQm9vbGVhbgUCYWsJAAIBCQCsAgIJAAMBBQJhawIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZGQKAAJhawkA/AcEBQJjeAISaXNWZXJpZmllZFJFQURPTkxZCQDMCAIFAUoFA25pbAUDbmlsAwkAAQIFAmFrAgdCb29sZWFuBQJhawkAAgEJAKwCAgkAAwEFAmFrAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJkZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAW4CFmludmFsaWQgcmVzdW1wdGlvbiBmZWUEAmJBCQDMCAIDCQAAAggFAmNZB2Fzc2V0SWQFAmRiBgkBAmFiAQIcaW52YWxpZCBmZWUgcGF5bWVudCBhc3NldCBpZAkAzAgCAwkAAAIIBQJjWQZhbW91bnQFAmRlBgkBAmFiAQIaaW52YWxpZCBmZWUgcGF5bWVudCBhbW91bnQJAMwIAgMDBQJkYwUCZGQHBgkBAmFiAQIeYm90aCBhc3NldHMgc2hvdWxkIGJlIHZlcmlmaWVkBQNuaWwDCQAAAgUCYkEFAmJBBAJkZgkA8AcCBQR0aGlzBQJhTAMJAAACBQJkZgUCZGYEAmRnBwQCZGgDCQAAAgkAkAMBCAUCYnAIcGF5bWVudHMAAQQCZGkKAAJhawkA/AcEBQJhcAIMY2hlY2tCYWxhbmNlCQDMCAIJAQJheQEFAmFMBQNuaWwFA25pbAMJAAECBQJhawIHQm9vbGVhbgUCYWsJAAIBCQCsAgIJAAMBBQJhawIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMFAmRpBgkBAmFiAQIZYXNzZXRzIHNob3VsZCBiZSBhdHRhY2hlZAMJAAACCQCQAwEIBQJicAhwYXltZW50cwACBAJkagkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDxBwEFAmNkCQEBWgECHHBvb2wgYWRkcmVzcyBpcyBub3Qgc2NyaXB0ZWQEAmRrCQDbBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhcAkBAUMACQEBWgECKGFsbG93ZWQgbHAgc3RhYmxlIHNjcmlwdCBoYXNoIGlzIG5vdCBzZXQEAmRsCQAAAgUCZGoFAmRrBAJkbQMFAmRsAgtwdXRPbmVUa25WMgIJcHV0T25lVGtuCQD8BwQFAmNkBQJkbQkAzAgCBQJjVwkAzAgCBQJkZwUDbmlsCQDMCAIJAJEDAggFAmJwCHBheW1lbnRzAAEFA25pbAMJAAACCQCQAwEIBQJicAhwYXltZW50cwADCQD8BwQFAmNkAgNwdXQJAMwIAgUCY1cJAMwIAgUCZGcFA25pbAkAzAgCCQCRAwIIBQJicAhwYXltZW50cwABCQDMCAIJAJEDAggFAmJwCHBheW1lbnRzAAIFA25pbAkBAmFiAQIVaW52YWxpZCBwYXltZW50cyBzaXplAwkAAAIFAmRoBQJkaAQCZG4JAPAHAgUEdGhpcwUCYUwDCQAAAgUCZG4FAmRuBAJkbwkAZQIFAmRuBQJkZgQCZHADCQBmAgUCZG8AAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCYnAGY2FsbGVyBQJkbwUCYUwFA25pbAUDbmlsBAJkcQkA/AcEBQJhcAIWc2V0V3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQFJCQDMCAIFAUoFA25pbAUDbmlsAwkAAAIFAmRxBQJkcQQBRwkAlAoCBQFJBQFKBAJiQgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBRgEFAUcGBQNuaWwJAQJiZQIFAmFRCQECYW0BBQFHCQCUCgIJAM4IAgUCYkIFAmRwBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJkcgECZHMABAJkdAQCYWcJAQJibQADCQABAgUCYWcCCkJ5dGVWZWN0b3IEAmJxBQJhZwUCYnEDCQABAgUCYWcCBFVuaXQIBQJkcg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCZHIJYm9keUJ5dGVzCQCRAwIIBQJkcgZwcm9vZnMAAAUCZHSTI/2E", "height": 3066620, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HMhuth8E4erWybLPu7ULFa7bpB7QgAw6YLn3amCMAga4 Next: BL3oJzDQxq8t8jLPudSUKH8mn4h5SHVfixt7y6njYRmi Diff:
OldNewDifferences
1212 let finalizationStageTotal = 1
1313
1414 let finalizationStageShares = 2
15+
16+let wavesString = "WAVES"
1517
1618 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1719
5254
5355 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
5456
57+func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
58+
59+
60+func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
61+
62+
5563 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
5664
5765
5967
6068
6169 func keyInList (pool) = {
62- let $t019722012 = pool
63- let amountAssetId = $t019722012._1
64- let priceAssetId = $t019722012._2
70+ let $t021272167 = pool
71+ let amountAssetId = $t021272167._1
72+ let priceAssetId = $t021272167._2
6573 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6674 }
6775
6876
6977 func keyInsufficientBalances (pool,epoch) = {
70- let $t021612201 = pool
71- let amountAssetId = $t021612201._1
72- let priceAssetId = $t021612201._2
78+ let $t023162356 = pool
79+ let amountAssetId = $t023162356._1
80+ let priceAssetId = $t023162356._2
7381 makeString(["%s%s%s%d", "insufficientBalances", amountAssetId, priceAssetId, toString(epoch)], separator)
7482 }
7583
7886
7987
8088 func keyVote (pool,address,epoch) = {
81- let $t025092549 = pool
82- let amountAssetId = $t025092549._1
83- let priceAssetId = $t025092549._2
89+ let $t026642704 = pool
90+ let amountAssetId = $t026642704._1
91+ let priceAssetId = $t026642704._2
8492 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
8593 }
8694
8795
8896 func keyVotingResult (pool,epoch) = {
89- let $t027312771 = pool
90- let amountAssetId = $t027312771._1
91- let priceAssetId = $t027312771._2
97+ let $t028862926 = pool
98+ let amountAssetId = $t028862926._1
99+ let priceAssetId = $t028862926._2
92100 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
93101 }
94102
97105
98106
99107 func keyPoolShare (pool,epoch) = {
100- let $t030923132 = pool
101- let amountAssetId = $t030923132._1
102- let priceAssetId = $t030923132._2
108+ let $t032473287 = pool
109+ let amountAssetId = $t032473287._1
110+ let priceAssetId = $t032473287._2
103111 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
104112 }
105113
169177 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
170178
171179
180+func parseAssetId (input) = if ((input == wavesString))
181+ then unit
182+ else fromBase58String(input)
183+
184+
185+func assetIdToString (input) = if ((input == unit))
186+ then wavesString
187+ else toBase58String(value(input))
188+
189+
172190 func getPoolInfo (amountAssetId,priceAssetId) = {
173191 let poolInfoOption = {
174192 let @ = invoke(factoryContract, "poolInfoREADONLY", [amountAssetId, priceAssetId], nil)
196214
197215
198216 func checkWxEmissionPoolLabel (pool) = {
199- let $t062586298 = pool
200- let amountAssetId = $t062586298._1
201- let priceAssetId = $t062586298._2
217+ let $t066476687 = pool
218+ let amountAssetId = $t066476687._1
219+ let priceAssetId = $t066476687._2
202220 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
203221 if ($isInstanceOf(@, "Boolean"))
204222 then @
216234 let poolsListName = "pools"
217235
218236 func getVotesListName (pool) = {
219- let $t067156755 = pool
220- let amountAssetId = $t067156755._1
221- let priceAssetId = $t067156755._2
237+ let $t071047144 = pool
238+ let amountAssetId = $t071047144._1
239+ let priceAssetId = $t071047144._2
222240 makeString(["votes", amountAssetId, priceAssetId], separator)
223241 }
224242
517535 let epoch = getIntOrFail(this, keyCurrentEpoch)
518536 let epochPrevious = (epoch - 1)
519537 let pool = stringToPool(poolStr)
520- let $t01697917019 = pool
521- let amountAssetId = $t01697917019._1
522- let priceAssetId = $t01697917019._2
538+ let $t01736817408 = pool
539+ let amountAssetId = $t01736817408._1
540+ let priceAssetId = $t01736817408._2
523541 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
524542 let balanceIsOkCurrent = {
525543 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
580598 if ((checkTargetEpoch == checkTargetEpoch))
581599 then {
582600 let pool = stringToPool(poolStr)
583- let $t01937219412 = pool
584- let amountAssetId = $t01937219412._1
585- let priceAssetId = $t01937219412._2
601+ let $t01976119801 = pool
602+ let amountAssetId = $t01976119801._1
603+ let priceAssetId = $t01976119801._2
586604 let gwxAmountAtEndTotal = {
587605 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
588606 if ($isInstanceOf(@, "Int"))
639657 if ((checkTargetEpoch == checkTargetEpoch))
640658 then {
641659 let pool = stringToPool(poolStr)
642- let $t02177521815 = pool
643- let amountAssetId = $t02177521815._1
644- let priceAssetId = $t02177521815._2
660+ let $t02216422204 = pool
661+ let amountAssetId = $t02216422204._1
662+ let priceAssetId = $t02216422204._2
645663 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
646664 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
647665 let r = {
953971
954972
955973 @Callable(i)
956-func resume (amountAssetId,priceAssetId) = {
957- let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
958- let balanceIsOk = {
959- let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
960- if ($isInstanceOf(@, "Boolean"))
961- then @
962- else throw(($getType(@) + " couldn't be cast to Boolean"))
963- }
964- let payment = i.payments[0]
974+func resume (amountAssetId,priceAssetId,slippageToleranceOrMinOutAmount) = {
975+ let $t03308533215 = valueOrErrorMessage(getPoolInfo(amountAssetId, priceAssetId), wrapErr("invalid assets"))
976+ let poolAddress = $t03308533215._1
977+ let lpAssetId = $t03308533215._2
978+ let feePayment = i.payments[0]
965979 let assetsStoreContract = addressFromStringValue(getStringValue(this, keyAssetsStoreContract))
966980 let kBoostingConfig = "%s__config"
967981 let idxCfgAssetId = 1
980994 else throw(($getType(@) + " couldn't be cast to Boolean"))
981995 }
982996 let resumptionFee = valueOrErrorMessage(getInteger(this, keyResumptionFee), "invalid resumption fee")
983- let checks = [if (balanceIsOk)
997+ let checks = [if ((feePayment.assetId == wxAssetId))
984998 then true
985- else throwErr("insufficient balances"), if ((size(i.payments) == 1))
999+ else throwErr("invalid fee payment asset id"), if ((feePayment.amount == resumptionFee))
9861000 then true
987- else throwErr("1 payment is required"), if ((payment.assetId == wxAssetId))
988- then true
989- else throwErr("invalid payment asset id"), if ((payment.amount == resumptionFee))
990- then true
991- else throwErr("invalid payment amount"), if (if (amountAssetVerified)
1001+ else throwErr("invalid fee payment amount"), if (if (amountAssetVerified)
9921002 then priceAssetVerified
9931003 else false)
9941004 then true
9951005 else throwErr("both assets should be verified")]
9961006 if ((checks == checks))
9971007 then {
998- let setWxEmissionInv = invoke(factoryContract, "setWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
999- if ((setWxEmissionInv == setWxEmissionInv))
1008+ let lpAssetBalanceBefore = assetBalance(this, lpAssetId)
1009+ if ((lpAssetBalanceBefore == lpAssetBalanceBefore))
10001010 then {
1001- let pool = $Tuple2(amountAssetId, priceAssetId)
1002- let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
1003- $Tuple2(inListActions, unit)
1011+ let autoStake = false
1012+ let put = if ((size(i.payments) == 1))
1013+ then {
1014+ let balanceIsOk = {
1015+ let @ = invoke(factoryContract, "checkBalance", [assetIdToString(lpAssetId)], nil)
1016+ if ($isInstanceOf(@, "Boolean"))
1017+ then @
1018+ else throw(($getType(@) + " couldn't be cast to Boolean"))
1019+ }
1020+ if (balanceIsOk)
1021+ then true
1022+ else throwErr("assets should be attached")
1023+ }
1024+ else if ((size(i.payments) == 2))
1025+ then {
1026+ let poolScriptHash = valueOrErrorMessage(scriptHash(poolAddress), wrapErr("pool address is not scripted"))
1027+ let allowedScriptHash = fromBase64String(valueOrErrorMessage(getString(factoryContract, keyAllowedLpStableScriptHash()), wrapErr("allowed lp stable script hash is not set")))
1028+ let isStable = (poolScriptHash == allowedScriptHash)
1029+ let functionName = if (isStable)
1030+ then "putOneTknV2"
1031+ else "putOneTkn"
1032+ invoke(poolAddress, functionName, [slippageToleranceOrMinOutAmount, autoStake], [i.payments[1]])
1033+ }
1034+ else if ((size(i.payments) == 3))
1035+ then invoke(poolAddress, "put", [slippageToleranceOrMinOutAmount, autoStake], [i.payments[1], i.payments[2]])
1036+ else throwErr("invalid payments size")
1037+ if ((put == put))
1038+ then {
1039+ let lpAssetBalanceAfter = assetBalance(this, lpAssetId)
1040+ if ((lpAssetBalanceAfter == lpAssetBalanceAfter))
1041+ then {
1042+ let lpAssetBalanceDiff = (lpAssetBalanceAfter - lpAssetBalanceBefore)
1043+ let lpAssetTransferActions = if ((lpAssetBalanceDiff > 0))
1044+ then [ScriptTransfer(i.caller, lpAssetBalanceDiff, lpAssetId)]
1045+ else nil
1046+ let setWxEmissionInv = invoke(factoryContract, "setWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
1047+ if ((setWxEmissionInv == setWxEmissionInv))
1048+ then {
1049+ let pool = $Tuple2(amountAssetId, priceAssetId)
1050+ let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
1051+ $Tuple2((inListActions ++ lpAssetTransferActions), unit)
1052+ }
1053+ else throw("Strict value is not equal to itself.")
1054+ }
1055+ else throw("Strict value is not equal to itself.")
1056+ }
1057+ else throw("Strict value is not equal to itself.")
10041058 }
10051059 else throw("Strict value is not equal to itself.")
10061060 }
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 finalizationStageBalances = 0
1111
1212 let finalizationStageTotal = 1
1313
1414 let finalizationStageShares = 2
15+
16+let wavesString = "WAVES"
1517
1618 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1719
1820 let keyEpochLengthNew = makeString(["%s%s", "epochLength__new"], separator)
1921
2022 func keyEpochLengthByEpoch (epoch) = makeString(["%s%d", "epochLength", toString(epoch)], separator)
2123
2224
2325 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
2426
2527 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
2628
2729 let keyResumptionFee = makeString(["%s", "resumptionFee"], separator)
2830
2931 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
3032
3133 let keyVotingEmissionRateContract = makeString(["%s", "votingEmissionRateContract"], separator)
3234
3335 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
3436
3537 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3638
3739 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
3840
3941 let keyAssetsStoreContract = makeString(["%s", "assetsStoreContract"], separator)
4042
4143 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
4244
4345 let keyNextPool = makeString(["%s", "nextPool"], separator)
4446
4547 let keyNextUser = makeString(["%s", "nextUser"], separator)
4648
4749 let keyStartHeight = makeString(["%s", "startHeight"], separator)
4850
4951 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
5052
5153 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
5254
5355 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
5456
57+func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
58+
59+
60+func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
61+
62+
5563 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
5664
5765
5866 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
5967
6068
6169 func keyInList (pool) = {
62- let $t019722012 = pool
63- let amountAssetId = $t019722012._1
64- let priceAssetId = $t019722012._2
70+ let $t021272167 = pool
71+ let amountAssetId = $t021272167._1
72+ let priceAssetId = $t021272167._2
6573 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6674 }
6775
6876
6977 func keyInsufficientBalances (pool,epoch) = {
70- let $t021612201 = pool
71- let amountAssetId = $t021612201._1
72- let priceAssetId = $t021612201._2
78+ let $t023162356 = pool
79+ let amountAssetId = $t023162356._1
80+ let priceAssetId = $t023162356._2
7381 makeString(["%s%s%s%d", "insufficientBalances", amountAssetId, priceAssetId, toString(epoch)], separator)
7482 }
7583
7684
7785 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
7886
7987
8088 func keyVote (pool,address,epoch) = {
81- let $t025092549 = pool
82- let amountAssetId = $t025092549._1
83- let priceAssetId = $t025092549._2
89+ let $t026642704 = pool
90+ let amountAssetId = $t026642704._1
91+ let priceAssetId = $t026642704._2
8492 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
8593 }
8694
8795
8896 func keyVotingResult (pool,epoch) = {
89- let $t027312771 = pool
90- let amountAssetId = $t027312771._1
91- let priceAssetId = $t027312771._2
97+ let $t028862926 = pool
98+ let amountAssetId = $t028862926._1
99+ let priceAssetId = $t028862926._2
92100 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
93101 }
94102
95103
96104 func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], separator)
97105
98106
99107 func keyPoolShare (pool,epoch) = {
100- let $t030923132 = pool
101- let amountAssetId = $t030923132._1
102- let priceAssetId = $t030923132._2
108+ let $t032473287 = pool
109+ let amountAssetId = $t032473287._1
110+ let priceAssetId = $t032473287._2
103111 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
104112 }
105113
106114
107115 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
108116
109117
110118 func keyStakedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], separator)
111119
112120
113121 func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
114122
115123
116124 func throwErr (msg) = throw(wrapErr(msg))
117125
118126
119127 func getValueOrFail (address,key,type) = {
120128 let error = wrapErr(makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
121129 valueOrErrorMessage( match type {
122130 case str: String =>
123131 getString(address, key)
124132 case int: Int =>
125133 getInteger(address, key)
126134 case _ =>
127135 throwErr("invalid entry type")
128136 }, error)
129137 }
130138
131139
132140 func getStrOrFail (address,key) = {
133141 let @ = getValueOrFail(address, key, "")
134142 if ($isInstanceOf(@, "String"))
135143 then @
136144 else throw(($getType(@) + " couldn't be cast to String"))
137145 }
138146
139147
140148 func getIntOrFail (address,key) = {
141149 let @ = getValueOrFail(address, key, 0)
142150 if ($isInstanceOf(@, "Int"))
143151 then @
144152 else throw(($getType(@) + " couldn't be cast to Int"))
145153 }
146154
147155
148156 func poolToString (pool) = ((pool._1 + separator) + pool._2)
149157
150158
151159 func stringToPool (str) = {
152160 let parts = split(str, separator)
153161 if ((size(parts) == 2))
154162 then $Tuple2(parts[0], parts[1])
155163 else throwErr("invalid pool string")
156164 }
157165
158166
159167 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
160168
161169 let IdxFactoryCfgGwxRewardDapp = 10
162170
163171 func keyFactoryCfg () = "%s__factoryConfig"
164172
165173
166174 func readFactoryCfgOrFail (factory) = split(getStrOrFail(factory, keyFactoryCfg()), separator)
167175
168176
169177 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
170178
171179
180+func parseAssetId (input) = if ((input == wavesString))
181+ then unit
182+ else fromBase58String(input)
183+
184+
185+func assetIdToString (input) = if ((input == unit))
186+ then wavesString
187+ else toBase58String(value(input))
188+
189+
172190 func getPoolInfo (amountAssetId,priceAssetId) = {
173191 let poolInfoOption = {
174192 let @ = invoke(factoryContract, "poolInfoREADONLY", [amountAssetId, priceAssetId], nil)
175193 if ($isInstanceOf(@, "(Address, ByteVector)"))
176194 then @
177195 else unit
178196 }
179197 poolInfoOption
180198 }
181199
182200
183201 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
184202 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
185203
186204 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
187205
188206 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
189207
190208 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
191209 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
192210 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
193211 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
194212 lpAssetId
195213 }
196214
197215
198216 func checkWxEmissionPoolLabel (pool) = {
199- let $t062586298 = pool
200- let amountAssetId = $t062586298._1
201- let priceAssetId = $t062586298._2
217+ let $t066476687 = pool
218+ let amountAssetId = $t066476687._1
219+ let priceAssetId = $t066476687._2
202220 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
203221 if ($isInstanceOf(@, "Boolean"))
204222 then @
205223 else throw(($getType(@) + " couldn't be cast to Boolean"))
206224 }
207225
208226
209227 func gwxRewardDeposit () = {
210228 let factoryCfg = readFactoryCfgOrFail(factoryContract)
211229 let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
212230 invoke(gwxRewardsContract, "deposit", nil, nil)
213231 }
214232
215233
216234 let poolsListName = "pools"
217235
218236 func getVotesListName (pool) = {
219- let $t067156755 = pool
220- let amountAssetId = $t067156755._1
221- let priceAssetId = $t067156755._2
237+ let $t071047144 = pool
238+ let amountAssetId = $t071047144._1
239+ let priceAssetId = $t071047144._2
222240 makeString(["votes", amountAssetId, priceAssetId], separator)
223241 }
224242
225243
226244 func keyListHead (listName) = {
227245 let meta = if ((listName == poolsListName))
228246 then "%s%s"
229247 else "%s%s%s%s"
230248 makeString([meta, listName, "head"], separator)
231249 }
232250
233251
234252 func keyListSize (listName) = {
235253 let meta = if ((listName == poolsListName))
236254 then "%s%s"
237255 else "%s%s%s%s"
238256 makeString([meta, listName, "size"], separator)
239257 }
240258
241259
242260 func keyListPrev (listName,id) = {
243261 let meta = if ((listName == poolsListName))
244262 then "%s%s%s%s"
245263 else "%s%s%s%s%s"
246264 makeString([meta, listName, id, "prev"], separator)
247265 }
248266
249267
250268 func keyListNext (listName,id) = {
251269 let meta = if ((listName == poolsListName))
252270 then "%s%s%s%s"
253271 else "%s%s%s%s%s"
254272 makeString([meta, listName, id, "next"], separator)
255273 }
256274
257275
258276 func containsNode (listName,id) = {
259277 let headOrUnit = getString(this, keyListHead(listName))
260278 let prevOrUnit = getString(this, keyListPrev(listName, id))
261279 let nextOrUnit = getString(this, keyListNext(listName, id))
262280 if (if ((id == valueOrElse(headOrUnit, "")))
263281 then true
264282 else (prevOrUnit != unit))
265283 then true
266284 else (nextOrUnit != unit)
267285 }
268286
269287
270288 func insertNodeActions (listName,id) = {
271289 let headOrUnit = getString(this, keyListHead(listName))
272290 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
273291 let checkNode = if (!(containsNode(listName, id)))
274292 then true
275293 else throwErr("Node exists")
276294 if ((checkNode == checkNode))
277295 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
278296 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
279297 else nil)) ++ [StringEntry(keyListHead(listName), id)])
280298 else throw("Strict value is not equal to itself.")
281299 }
282300
283301
284302 func deleteNodeActions (listName,id) = {
285303 let headOrUnit = getString(this, keyListHead(listName))
286304 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
287305 let prevOrUnit = getString(this, keyListPrev(listName, id))
288306 let nextOrUnit = getString(this, keyListNext(listName, id))
289307 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
290308 then (nextOrUnit != unit)
291309 else false)
292310 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
293311 else if ((nextOrUnit != unit))
294312 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
295313 else if ((prevOrUnit != unit))
296314 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
297315 else if ((id == valueOrElse(headOrUnit, "")))
298316 then [DeleteEntry(keyListHead(listName))]
299317 else throwErr(((("invalid node: " + listName) + ".") + id))))
300318 }
301319
302320
303321 func keyManagerVaultAddress () = "%s__managerVaultAddress"
304322
305323
306324 func keyManagerPublicKey () = "%s__managerPublicKey"
307325
308326
309327 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
310328 case s: String =>
311329 addressFromStringValue(s)
312330 case _ =>
313331 this
314332 }
315333
316334
317335 func managerPublicKeyOrUnit () = {
318336 let managerVaultAddress = getManagerVaultAddressOrThis()
319337 match getString(managerVaultAddress, keyManagerPublicKey()) {
320338 case s: String =>
321339 fromBase58String(s)
322340 case _: Unit =>
323341 unit
324342 case _ =>
325343 throw("Match error")
326344 }
327345 }
328346
329347
330348 func isManager (i) = match managerPublicKeyOrUnit() {
331349 case pk: ByteVector =>
332350 (i.callerPublicKey == pk)
333351 case _: Unit =>
334352 (i.caller == this)
335353 case _ =>
336354 throw("Match error")
337355 }
338356
339357
340358 func mustManager (i) = if (isManager(i))
341359 then true
342360 else throw("permission denied")
343361
344362
345363 func mustThis (i) = if ((i.caller == this))
346364 then true
347365 else throw("permission denied")
348366
349367
350368 @Callable(i)
351369 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
352370 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), wrapErr("invalid boosting contract address"))
353371 $Tuple2(nil, {
354372 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
355373 if ($isInstanceOf(@, "Int"))
356374 then @
357375 else throw(($getType(@) + " couldn't be cast to Int"))
358376 })
359377 }
360378
361379
362380
363381 @Callable(i)
364382 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
365383 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
366384 then true
367385 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
368386 then true
369387 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
370388 then true
371389 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
372390 then true
373391 else "invalid staking contract address", if ((epochLength > 0))
374392 then true
375393 else throwErr("invalid epoch length")]
376394 if ((checks == checks))
377395 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
378396 else throw("Strict value is not equal to itself.")
379397 }
380398
381399
382400
383401 @Callable(i)
384402 func create (amountAssetId,priceAssetId) = {
385403 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
386404 then true
387405 else mustManager(i)]
388406 if ((checks == checks))
389407 then {
390408 let pool = $Tuple2(amountAssetId, priceAssetId)
391409 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
392410 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
393411 let startHeightActions = if (currentEpochIsNotDefined)
394412 then {
395413 let epoch = 0
396414 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
397415 }
398416 else nil
399417 $Tuple2((inListActions ++ startHeightActions), unit)
400418 }
401419 else throw("Strict value is not equal to itself.")
402420 }
403421
404422
405423
406424 @Callable(i)
407425 func vote (amountAssetId,priceAssetId,amount) = {
408426 let pool = $Tuple2(amountAssetId, priceAssetId)
409427 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
410428 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
411429 let epochLength = getIntOrFail(this, keyEpochLength)
412430 let endHeight = (startHeight + epochLength)
413431 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
414432 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
415433 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
416434 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
417435 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
418436 let gwxAmountAtEndTotal = {
419437 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
420438 if ($isInstanceOf(@, "Int"))
421439 then @
422440 else throw(($getType(@) + " couldn't be cast to Int"))
423441 }
424442 let available = (gwxAmountAtEndTotal - used)
425443 let newVote = (vote + amount)
426444 let wxEmission = checkWxEmissionPoolLabel(pool)
427445 let checks = [if ((getBoolean(keyInList(pool)) != unit))
428446 then true
429447 else throwErr("invalid assets"), if ((endHeight > height))
430448 then true
431449 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
432450 then true
433451 else throwErr("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
434452 then true
435453 else throwErr("you do not have gWX"), if (if ((amount > 0))
436454 then (available >= amount)
437455 else false)
438456 then true
439457 else throwErr("invalid amount"), if (wxEmission)
440458 then true
441459 else throwErr("pool hasn't WX_EMISSION label")]
442460 if ((checks == checks))
443461 then {
444462 let votesListName = getVotesListName(pool)
445463 let userAddressStr = toString(i.caller)
446464 let votesListActions = if (containsNode(votesListName, userAddressStr))
447465 then nil
448466 else insertNodeActions(votesListName, userAddressStr)
449467 $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)
450468 }
451469 else throw("Strict value is not equal to itself.")
452470 }
453471
454472
455473
456474 @Callable(i)
457475 func cancelVote (amountAssetId,priceAssetId) = {
458476 let pool = $Tuple2(amountAssetId, priceAssetId)
459477 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
460478 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
461479 let epochLength = getIntOrFail(this, keyEpochLength)
462480 let endHeight = (startHeight + epochLength)
463481 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
464482 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
465483 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
466484 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
467485 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
468486 let checks = [if ((getBoolean(keyInList(pool)) != unit))
469487 then true
470488 else throwErr("invalid assets"), if ((endHeight > height))
471489 then true
472490 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
473491 then true
474492 else throwErr("finalization in progress"), if ((vote > 0))
475493 then true
476494 else throwErr("no vote")]
477495 if ((checks == checks))
478496 then {
479497 let votesListName = getVotesListName(pool)
480498 let userAddressStr = toString(i.caller)
481499 $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)
482500 }
483501 else throw("Strict value is not equal to itself.")
484502 }
485503
486504
487505
488506 @Callable(i)
489507 func setEpochLength (newEpochLength) = {
490508 let checks = [mustManager(i), if ((newEpochLength > 0))
491509 then true
492510 else throwErr("invalid epoch length")]
493511 if ((checks == checks))
494512 then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
495513 else throw("Strict value is not equal to itself.")
496514 }
497515
498516
499517
500518 @Callable(i)
501519 func setMaxDepth (newMaxDepth) = {
502520 let checks = [mustManager(i), if ((newMaxDepth > 0))
503521 then true
504522 else throwErr("invalid max depth")]
505523 if ((checks == checks))
506524 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
507525 else throw("Strict value is not equal to itself.")
508526 }
509527
510528
511529
512530 @Callable(i)
513531 func processPoolBalanceINTERNAL (poolStr) = {
514532 let checkCaller = mustThis(i)
515533 if ((checkCaller == checkCaller))
516534 then {
517535 let epoch = getIntOrFail(this, keyCurrentEpoch)
518536 let epochPrevious = (epoch - 1)
519537 let pool = stringToPool(poolStr)
520- let $t01697917019 = pool
521- let amountAssetId = $t01697917019._1
522- let priceAssetId = $t01697917019._2
538+ let $t01736817408 = pool
539+ let amountAssetId = $t01736817408._1
540+ let priceAssetId = $t01736817408._2
523541 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
524542 let balanceIsOkCurrent = {
525543 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
526544 if ($isInstanceOf(@, "Boolean"))
527545 then @
528546 else throw(($getType(@) + " couldn't be cast to Boolean"))
529547 }
530548 let balanceIsOkPrevious = !(valueOrElse(getBoolean(this, keyInsufficientBalances(pool, (epochPrevious - 1))), false))
531549 let actions = if (!(balanceIsOkCurrent))
532550 then if (!(balanceIsOkPrevious))
533551 then {
534552 let deleteWxEmissionInv = invoke(factoryContract, "deleteWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
535553 if ((deleteWxEmissionInv == deleteWxEmissionInv))
536554 then {
537555 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, 0], nil)
538556 if ((modifyWeightInv == modifyWeightInv))
539557 then {
540558 let poolAddress = valueOrErrorMessage(getPoolInfo(amountAssetId, priceAssetId), wrapErr("invalid assets"))._1
541559 let newStatus = 3
542560 let setPoolStatusInv = invoke(factoryContract, "managePool", [toString(poolAddress), newStatus], nil)
543561 if ((setPoolStatusInv == setPoolStatusInv))
544562 then {
545563 let listActions = ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolToString(pool)))
546564 ([IntegerEntry(keyPoolShare(pool, epochPrevious), 0)] ++ listActions)
547565 }
548566 else throw("Strict value is not equal to itself.")
549567 }
550568 else throw("Strict value is not equal to itself.")
551569 }
552570 else throw("Strict value is not equal to itself.")
553571 }
554572 else [BooleanEntry(keyInsufficientBalances(pool, epochPrevious), true)]
555573 else nil
556574 $Tuple2(actions, unit)
557575 }
558576 else throw("Strict value is not equal to itself.")
559577 }
560578
561579
562580
563581 @Callable(i)
564582 func processVoteINTERNAL (poolStr,userAddressStr) = {
565583 let checkCaller = mustThis(i)
566584 if ((checkCaller == checkCaller))
567585 then {
568586 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr(("processVoteINTERNAL: invalid user address " + userAddressStr)))
569587 let epoch = getIntOrFail(this, keyCurrentEpoch)
570588 let epochPrevious = (epoch - 1)
571589 let epochLength = getIntOrFail(this, keyEpochLength)
572590 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
573591 let endHeight = (startHeight + epochLength)
574592 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
575593 let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
576594 let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
577595 let checkTargetEpoch = if ((epochPrevious >= 0))
578596 then true
579597 else throwErr("processVoteINTERNAL: invalid previous epoch")
580598 if ((checkTargetEpoch == checkTargetEpoch))
581599 then {
582600 let pool = stringToPool(poolStr)
583- let $t01937219412 = pool
584- let amountAssetId = $t01937219412._1
585- let priceAssetId = $t01937219412._2
601+ let $t01976119801 = pool
602+ let amountAssetId = $t01976119801._1
603+ let priceAssetId = $t01976119801._2
586604 let gwxAmountAtEndTotal = {
587605 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
588606 if ($isInstanceOf(@, "Int"))
589607 then @
590608 else throw(($getType(@) + " couldn't be cast to Int"))
591609 }
592610 let gwxAmountAtEndTotalPrevious = {
593611 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
594612 if ($isInstanceOf(@, "Int"))
595613 then @
596614 else throw(($getType(@) + " couldn't be cast to Int"))
597615 }
598616 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
599617 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
600618 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), wrapErr((((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote")))
601619 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
602620 let lpAssetIdStr = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
603621 let votingResultStakedPrevious = valueOrElse(getInteger(keyVotingResultStaked(lpAssetIdStr, epochPrevious)), 0)
604622 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
605623 let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(lpAssetIdStr, userAddressStr)), 0)
606624 let votingResultStakedActions = if ((stakedByUser == 0))
607625 then nil
608626 else [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, epochPrevious), (votingResultStakedPrevious + votePrevious))]
609627 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
610628 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
611629 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
612630 else 0
613631 let actions = if ((newVote > 0))
614632 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
615633 else deleteNodeActions(getVotesListName(pool), userAddressStr)
616634 $Tuple2((actions ++ votingResultStakedActions), unit)
617635 }
618636 else throw("Strict value is not equal to itself.")
619637 }
620638 else throw("Strict value is not equal to itself.")
621639 }
622640
623641
624642
625643 @Callable(i)
626644 func processPoolINTERNAL (poolStr,force) = {
627645 let checkCaller = mustThis(i)
628646 if ((checkCaller == checkCaller))
629647 then {
630648 let targetEpoch = {
631649 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
632650 if (force)
633651 then currentEpoch
634652 else (currentEpoch - 1)
635653 }
636654 let checkTargetEpoch = if ((targetEpoch >= 0))
637655 then true
638656 else throwErr("processPoolINTERNAL: invalid target epoch")
639657 if ((checkTargetEpoch == checkTargetEpoch))
640658 then {
641659 let pool = stringToPool(poolStr)
642- let $t02177521815 = pool
643- let amountAssetId = $t02177521815._1
644- let priceAssetId = $t02177521815._2
660+ let $t02216422204 = pool
661+ let amountAssetId = $t02216422204._1
662+ let priceAssetId = $t02216422204._2
645663 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
646664 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
647665 let r = {
648666 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
649667 if ($isInstanceOf(@, "Boolean"))
650668 then @
651669 else throw(($getType(@) + " couldn't be cast to Boolean"))
652670 }
653671 if ((r == r))
654672 then if (r)
655673 then $Tuple2(nil, true)
656674 else {
657675 let assetsStoreContract = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyAssetsStoreContract), "invalid assets store contract"))
658676 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
659677 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
660678 let share = if ((totalVotes == 0))
661679 then 0
662680 else fraction(votingResult, poolWeightMult, totalVotes)
663681 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
664682 if ((modifyWeightInv == modifyWeightInv))
665683 then $Tuple2([IntegerEntry(keyPoolShare(pool, targetEpoch), share)], false)
666684 else throw("Strict value is not equal to itself.")
667685 }
668686 else throw("Strict value is not equal to itself.")
669687 }
670688 else throw("Strict value is not equal to itself.")
671689 }
672690 else throw("Strict value is not equal to itself.")
673691 }
674692
675693
676694
677695 @Callable(i)
678696 func finalizeHelper () = {
679697 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
680698 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
681699 let previousEpoch = (epoch - 1)
682700 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
683701 let epochLength = getIntOrFail(this, keyEpochLength)
684702 let endHeight = (startHeight + epochLength)
685703 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
686704 if (if (if ((height >= endHeight))
687705 then (finalizationStageOrUnit == unit)
688706 else false)
689707 then !(force)
690708 else false)
691709 then {
692710 let newEpoch = (epoch + 1)
693711 let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
694712 let newEpochLengthActions = match newEpochLengthOption {
695713 case newEpochLength: Int =>
696714 [IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
697715 case _: Unit =>
698716 nil
699717 case _ =>
700718 throw("Match error")
701719 }
702720 $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageBalances), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
703721 }
704722 else if (if (force)
705723 then (finalizationStageOrUnit == unit)
706724 else false)
707725 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
708726 else if ((finalizationStageOrUnit == unit))
709727 then $Tuple2(nil, false)
710728 else if ((finalizationStageOrUnit == finalizationStageBalances))
711729 then {
712730 let poolOrUnit = getString(keyNextPool)
713731 match poolOrUnit {
714732 case _: Unit =>
715733 match getString(keyListHead(poolsListName)) {
716734 case _: Unit =>
717735 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageTotal), DeleteEntry(keyNextPool)], true)
718736 case nextPoolStr: String =>
719737 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
720738 case _ =>
721739 throw("Match error")
722740 }
723741 case poolStr: String =>
724742 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
725743 if ((nextPoolOrUnit == nextPoolOrUnit))
726744 then {
727745 let r = invoke(this, "processPoolBalanceINTERNAL", [poolStr], nil)
728746 if ((r == r))
729747 then match nextPoolOrUnit {
730748 case _: Unit =>
731749 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageTotal), DeleteEntry(keyNextPool)], true)
732750 case nextPoolStr: String =>
733751 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
734752 case _ =>
735753 throw("Match error")
736754 }
737755 else throw("Strict value is not equal to itself.")
738756 }
739757 else throw("Strict value is not equal to itself.")
740758 case _ =>
741759 throw("Match error")
742760 }
743761 }
744762 else if ((finalizationStageOrUnit == finalizationStageTotal))
745763 then {
746764 let poolOrUnit = getString(keyNextPool)
747765 let userOrUnit = getString(keyNextUser)
748766 match poolOrUnit {
749767 case _: Unit =>
750768 match getString(keyListHead(poolsListName)) {
751769 case _: Unit =>
752770 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
753771 case poolsHeadStr: String =>
754772 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
755773 case _ =>
756774 throw("Match error")
757775 }
758776 case poolStr: String =>
759777 let pool = stringToPool(poolStr)
760778 let nextUserOrUnit = match userOrUnit {
761779 case _: Unit =>
762780 getString(keyListHead(getVotesListName(pool)))
763781 case user: String =>
764782 let next = getString(keyListNext(getVotesListName(pool), user))
765783 if ((next == next))
766784 then {
767785 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
768786 if ((processVoteInv == processVoteInv))
769787 then next
770788 else throw("Strict value is not equal to itself.")
771789 }
772790 else throw("Strict value is not equal to itself.")
773791 case _ =>
774792 throw("Match error")
775793 }
776794 match nextUserOrUnit {
777795 case _: Unit =>
778796 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
779797 match nextPoolOrUnit {
780798 case _: Unit =>
781799 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
782800 case s: String =>
783801 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
784802 case _ =>
785803 throw("Match error")
786804 }
787805 case nextUser: String =>
788806 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
789807 case _ =>
790808 throw("Match error")
791809 }
792810 case _ =>
793811 throw("Match error")
794812 }
795813 }
796814 else if ((finalizationStageOrUnit == finalizationStageShares))
797815 then {
798816 let poolOrUnit = getString(keyNextPool)
799817 match poolOrUnit {
800818 case _: Unit =>
801819 match getString(keyListHead(poolsListName)) {
802820 case _: Unit =>
803821 let actions = if (force)
804822 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
805823 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
806824 let gwxRewardDepositInv = gwxRewardDeposit()
807825 if ((gwxRewardDepositInv == gwxRewardDepositInv))
808826 then $Tuple2(actions, true)
809827 else throw("Strict value is not equal to itself.")
810828 case nextPoolStr: String =>
811829 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
812830 case _ =>
813831 throw("Match error")
814832 }
815833 case poolStr: String =>
816834 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
817835 if ((nextPoolOrUnit == nextPoolOrUnit))
818836 then {
819837 let r = {
820838 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
821839 if ($isInstanceOf(@, "Boolean"))
822840 then @
823841 else throw(($getType(@) + " couldn't be cast to Boolean"))
824842 }
825843 if ((r == r))
826844 then if (r)
827845 then $Tuple2(nil, true)
828846 else match nextPoolOrUnit {
829847 case _: Unit =>
830848 let actions = if (force)
831849 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
832850 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
833851 let gwxRewardDepositInv = gwxRewardDeposit()
834852 if ((gwxRewardDepositInv == gwxRewardDepositInv))
835853 then $Tuple2(actions, true)
836854 else throw("Strict value is not equal to itself.")
837855 case nextPoolStr: String =>
838856 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
839857 case _ =>
840858 throw("Match error")
841859 }
842860 else throw("Strict value is not equal to itself.")
843861 }
844862 else throw("Strict value is not equal to itself.")
845863 case _ =>
846864 throw("Match error")
847865 }
848866 }
849867 else throwErr("finalization is broken")
850868 }
851869
852870
853871
854872 @Callable(i)
855873 func finalizeWrapper (counter) = {
856874 let votingEmissionRateContract = addressFromStringValue(getStringValue(this, keyVotingEmissionRateContract))
857875 let result = {
858876 let @ = invoke(this, "finalizeHelper", nil, nil)
859877 if ($isInstanceOf(@, "Boolean"))
860878 then @
861879 else throw(($getType(@) + " couldn't be cast to Boolean"))
862880 }
863881 if ((result == result))
864882 then if (!(result))
865883 then if ((counter == 0))
866884 then throwErr("Current voting is not over yet")
867885 else {
868886 let inv = invoke(votingEmissionRateContract, "finalize", nil, nil)
869887 if ((inv == inv))
870888 then $Tuple2(nil, unit)
871889 else throw("Strict value is not equal to itself.")
872890 }
873891 else {
874892 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
875893 if ((maxDepth > counter))
876894 then {
877895 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
878896 if ((inv == inv))
879897 then $Tuple2(nil, unit)
880898 else throw("Strict value is not equal to itself.")
881899 }
882900 else $Tuple2(nil, unit)
883901 }
884902 else throw("Strict value is not equal to itself.")
885903 }
886904
887905
888906
889907 @Callable(i)
890908 func finalize () = {
891909 let inv = invoke(this, "finalizeWrapper", [0], nil)
892910 if ((inv == inv))
893911 then $Tuple2(nil, unit)
894912 else throw("Strict value is not equal to itself.")
895913 }
896914
897915
898916
899917 @Callable(i)
900918 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
901919
902920
903921
904922 @Callable(i)
905923 func insertNode (listName,id) = {
906924 let checkCaller = mustManager(i)
907925 if ((checkCaller == checkCaller))
908926 then $Tuple2(insertNodeActions(listName, id), unit)
909927 else throw("Strict value is not equal to itself.")
910928 }
911929
912930
913931
914932 @Callable(i)
915933 func deleteNode (listName,id) = {
916934 let checkCaller = mustManager(i)
917935 if ((checkCaller == checkCaller))
918936 then $Tuple2(deleteNodeActions(listName, id), unit)
919937 else throw("Strict value is not equal to itself.")
920938 }
921939
922940
923941
924942 @Callable(i)
925943 func isFinalizationInProgress () = {
926944 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
927945 let finalizationInProgress = (finalizationStageOrUnit != unit)
928946 $Tuple2(nil, finalizationInProgress)
929947 }
930948
931949
932950
933951 @Callable(i)
934952 func deletePool (amountAssetId,priceAssetId) = {
935953 let checkCaller = if (if ((i.caller == factoryContract))
936954 then true
937955 else mustManager(i))
938956 then true
939957 else throwErr("Permission denied")
940958 if ((checkCaller == checkCaller))
941959 then {
942960 let listName = "pools"
943961 let pool = $Tuple2(amountAssetId, priceAssetId)
944962 let id = makeString([amountAssetId, priceAssetId], separator)
945963 let actions = if (containsNode(listName, id))
946964 then deleteNodeActions(listName, id)
947965 else nil
948966 ([DeleteEntry(keyInList(pool))] ++ actions)
949967 }
950968 else throw("Strict value is not equal to itself.")
951969 }
952970
953971
954972
955973 @Callable(i)
956-func resume (amountAssetId,priceAssetId) = {
957- let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
958- let balanceIsOk = {
959- let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
960- if ($isInstanceOf(@, "Boolean"))
961- then @
962- else throw(($getType(@) + " couldn't be cast to Boolean"))
963- }
964- let payment = i.payments[0]
974+func resume (amountAssetId,priceAssetId,slippageToleranceOrMinOutAmount) = {
975+ let $t03308533215 = valueOrErrorMessage(getPoolInfo(amountAssetId, priceAssetId), wrapErr("invalid assets"))
976+ let poolAddress = $t03308533215._1
977+ let lpAssetId = $t03308533215._2
978+ let feePayment = i.payments[0]
965979 let assetsStoreContract = addressFromStringValue(getStringValue(this, keyAssetsStoreContract))
966980 let kBoostingConfig = "%s__config"
967981 let idxCfgAssetId = 1
968982 let boostingContract = addressFromStringValue(getStrOrFail(this, keyBoostingContract))
969983 let wxAssetId = fromBase58String(split(getStringValue(boostingContract, kBoostingConfig), separator)[idxCfgAssetId])
970984 let amountAssetVerified = {
971985 let @ = invoke(assetsStoreContract, "isVerifiedREADONLY", [amountAssetId], nil)
972986 if ($isInstanceOf(@, "Boolean"))
973987 then @
974988 else throw(($getType(@) + " couldn't be cast to Boolean"))
975989 }
976990 let priceAssetVerified = {
977991 let @ = invoke(assetsStoreContract, "isVerifiedREADONLY", [priceAssetId], nil)
978992 if ($isInstanceOf(@, "Boolean"))
979993 then @
980994 else throw(($getType(@) + " couldn't be cast to Boolean"))
981995 }
982996 let resumptionFee = valueOrErrorMessage(getInteger(this, keyResumptionFee), "invalid resumption fee")
983- let checks = [if (balanceIsOk)
997+ let checks = [if ((feePayment.assetId == wxAssetId))
984998 then true
985- else throwErr("insufficient balances"), if ((size(i.payments) == 1))
999+ else throwErr("invalid fee payment asset id"), if ((feePayment.amount == resumptionFee))
9861000 then true
987- else throwErr("1 payment is required"), if ((payment.assetId == wxAssetId))
988- then true
989- else throwErr("invalid payment asset id"), if ((payment.amount == resumptionFee))
990- then true
991- else throwErr("invalid payment amount"), if (if (amountAssetVerified)
1001+ else throwErr("invalid fee payment amount"), if (if (amountAssetVerified)
9921002 then priceAssetVerified
9931003 else false)
9941004 then true
9951005 else throwErr("both assets should be verified")]
9961006 if ((checks == checks))
9971007 then {
998- let setWxEmissionInv = invoke(factoryContract, "setWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
999- if ((setWxEmissionInv == setWxEmissionInv))
1008+ let lpAssetBalanceBefore = assetBalance(this, lpAssetId)
1009+ if ((lpAssetBalanceBefore == lpAssetBalanceBefore))
10001010 then {
1001- let pool = $Tuple2(amountAssetId, priceAssetId)
1002- let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
1003- $Tuple2(inListActions, unit)
1011+ let autoStake = false
1012+ let put = if ((size(i.payments) == 1))
1013+ then {
1014+ let balanceIsOk = {
1015+ let @ = invoke(factoryContract, "checkBalance", [assetIdToString(lpAssetId)], nil)
1016+ if ($isInstanceOf(@, "Boolean"))
1017+ then @
1018+ else throw(($getType(@) + " couldn't be cast to Boolean"))
1019+ }
1020+ if (balanceIsOk)
1021+ then true
1022+ else throwErr("assets should be attached")
1023+ }
1024+ else if ((size(i.payments) == 2))
1025+ then {
1026+ let poolScriptHash = valueOrErrorMessage(scriptHash(poolAddress), wrapErr("pool address is not scripted"))
1027+ let allowedScriptHash = fromBase64String(valueOrErrorMessage(getString(factoryContract, keyAllowedLpStableScriptHash()), wrapErr("allowed lp stable script hash is not set")))
1028+ let isStable = (poolScriptHash == allowedScriptHash)
1029+ let functionName = if (isStable)
1030+ then "putOneTknV2"
1031+ else "putOneTkn"
1032+ invoke(poolAddress, functionName, [slippageToleranceOrMinOutAmount, autoStake], [i.payments[1]])
1033+ }
1034+ else if ((size(i.payments) == 3))
1035+ then invoke(poolAddress, "put", [slippageToleranceOrMinOutAmount, autoStake], [i.payments[1], i.payments[2]])
1036+ else throwErr("invalid payments size")
1037+ if ((put == put))
1038+ then {
1039+ let lpAssetBalanceAfter = assetBalance(this, lpAssetId)
1040+ if ((lpAssetBalanceAfter == lpAssetBalanceAfter))
1041+ then {
1042+ let lpAssetBalanceDiff = (lpAssetBalanceAfter - lpAssetBalanceBefore)
1043+ let lpAssetTransferActions = if ((lpAssetBalanceDiff > 0))
1044+ then [ScriptTransfer(i.caller, lpAssetBalanceDiff, lpAssetId)]
1045+ else nil
1046+ let setWxEmissionInv = invoke(factoryContract, "setWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
1047+ if ((setWxEmissionInv == setWxEmissionInv))
1048+ then {
1049+ let pool = $Tuple2(amountAssetId, priceAssetId)
1050+ let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
1051+ $Tuple2((inListActions ++ lpAssetTransferActions), unit)
1052+ }
1053+ else throw("Strict value is not equal to itself.")
1054+ }
1055+ else throw("Strict value is not equal to itself.")
1056+ }
1057+ else throw("Strict value is not equal to itself.")
10041058 }
10051059 else throw("Strict value is not equal to itself.")
10061060 }
10071061 else throw("Strict value is not equal to itself.")
10081062 }
10091063
10101064
10111065 @Verifier(tx)
10121066 func verify () = {
10131067 let targetPublicKey = match managerPublicKeyOrUnit() {
10141068 case pk: ByteVector =>
10151069 pk
10161070 case _: Unit =>
10171071 tx.senderPublicKey
10181072 case _ =>
10191073 throw("Match error")
10201074 }
10211075 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
10221076 }
10231077

github/deemru/w8io/786bc32 
107.85 ms