2024.04.17 11:31 [3066519] smart account 3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr > SELF 0.00000000 Waves

{ "type": 13, "id": "HMhuth8E4erWybLPu7ULFa7bpB7QgAw6YLn3amCMAga4", "fee": 2700000, "feeAssetId": null, "timestamp": 1713342701286, "version": 2, "chainId": 84, "sender": "3N9Zi6AcWcGbM23jQJ4fnzFsoHoTsxYDznr", "senderPublicKey": "GFbasS3jufhZkK4xR7tdTjjnP8K33KvJFEDHRtxXDkaJ", "proofs": [ "5Lfqso3XowxmzVNVoER4pesJLCR72BFmFLDaqcGVLPpeFnbEaHxN9XtqfybZf14R6cbzs7wBGE5641FUx29zp9wA" ], "script": "base64:BgKpGggCEgQKAggBEgcKBQgICAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgMKAQESAwoBCBIECgIICBIECgIIBBIAEgMKAQESABIECgIICBIECgIICBIECgIICBIAEgQKAggIEgQKAggIIglzZXBhcmF0b3IiDnBvb2xXZWlnaHRNdWx0Ig9tYXhEZXB0aERlZmF1bHQiGWZpbmFsaXphdGlvblN0YWdlQmFsYW5jZXMiFmZpbmFsaXphdGlvblN0YWdlVG90YWwiF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzIg5rZXlFcG9jaExlbmd0aCIRa2V5RXBvY2hMZW5ndGhOZXciFWtleUVwb2NoTGVuZ3RoQnlFcG9jaCIFZXBvY2giD2tleUN1cnJlbnRFcG9jaCILa2V5TWF4RGVwdGgiEGtleVJlc3VtcHRpb25GZWUiImtleVZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiHWtleVZvdGluZ0VtaXNzaW9uUmF0ZUNvbnRyYWN0IhJrZXlGYWN0b3J5Q29udHJhY3QiE2tleUJvb3N0aW5nQ29udHJhY3QiEmtleVN0YWtpbmdDb250cmFjdCIWa2V5QXNzZXRzU3RvcmVDb250cmFjdCIUa2V5RmluYWxpemF0aW9uU3RhZ2UiC2tleU5leHRQb29sIgtrZXlOZXh0VXNlciIOa2V5U3RhcnRIZWlnaHQiEWtleUN1cnJlbnRFcG9jaFVpIhBrZXlTdGFydEhlaWdodFVpIh1rZXlGaW5hbGl6YXRpb25TaG91bGRCZUZvcmNlZCIVa2V5U3RhcnRIZWlnaHRCeUVwb2NoIgxrZXlGaW5hbGl6ZWQiCWtleUluTGlzdCIEcG9vbCILJHQwMTk3MjIwMTIiDWFtb3VudEFzc2V0SWQiDHByaWNlQXNzZXRJZCIXa2V5SW5zdWZmaWNpZW50QmFsYW5jZXMiCyR0MDIxNjEyMjAxIgdrZXlVc2VkIgdhZGRyZXNzIgdrZXlWb3RlIgskdDAyNTA5MjU0OSIPa2V5Vm90aW5nUmVzdWx0IgskdDAyNzMxMjc3MSIVa2V5Vm90aW5nUmVzdWx0U3Rha2VkIgxscEFzc2V0SWRTdHIiDGtleVBvb2xTaGFyZSILJHQwMzA5MjMxMzIiDWtleVRvdGFsVm90ZXMiD2tleVN0YWtlZEJ5VXNlciIOdXNlckFkZHJlc3NTdHIiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiDmdldFZhbHVlT3JGYWlsIgNrZXkiBHR5cGUiBWVycm9yIgckbWF0Y2gwIgNzdHIiA2ludCIMZ2V0U3RyT3JGYWlsIgFAIgxnZXRJbnRPckZhaWwiDHBvb2xUb1N0cmluZyIMc3RyaW5nVG9Qb29sIgVwYXJ0cyIPZmFjdG9yeUNvbnRyYWN0IhpJZHhGYWN0b3J5Q2ZnR3d4UmV3YXJkRGFwcCINa2V5RmFjdG9yeUNmZyIUcmVhZEZhY3RvcnlDZmdPckZhaWwiB2ZhY3RvcnkiGWdldEd3eFJld2FyZEFkZHJlc3NPckZhaWwiCmZhY3RvcnlDZmciC2dldFBvb2xJbmZvIg5wb29sSW5mb09wdGlvbiIWZ2V0THBBc3NldEJ5UG9vbEFzc2V0cyIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyIhdpbnRlcm5hbFByaWNlQXNzZXRJZFN0ciIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCITcG9vbENvbnRyYWN0QWRkcmVzcyIVYW1vdW50QXNzZXRJbnRlcm5hbElkIhRwcmljZUFzc2V0SW50ZXJuYWxJZCIJbHBBc3NldElkIhhjaGVja1d4RW1pc3Npb25Qb29sTGFiZWwiCyR0MDYyNTg2Mjk4IhBnd3hSZXdhcmREZXBvc2l0IhJnd3hSZXdhcmRzQ29udHJhY3QiDXBvb2xzTGlzdE5hbWUiEGdldFZvdGVzTGlzdE5hbWUiCyR0MDY3MTU2NzU1IgtrZXlMaXN0SGVhZCIIbGlzdE5hbWUiBG1ldGEiC2tleUxpc3RTaXplIgtrZXlMaXN0UHJldiICaWQiC2tleUxpc3ROZXh0Igxjb250YWluc05vZGUiCmhlYWRPclVuaXQiCnByZXZPclVuaXQiCm5leHRPclVuaXQiEWluc2VydE5vZGVBY3Rpb25zIghsaXN0U2l6ZSIJY2hlY2tOb2RlIhFkZWxldGVOb2RlQWN0aW9ucyIWa2V5TWFuYWdlclZhdWx0QWRkcmVzcyITa2V5TWFuYWdlclB1YmxpY0tleSIcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcyIBcyIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyIJaXNNYW5hZ2VyIgFpIgJwayILbXVzdE1hbmFnZXIiCG11c3RUaGlzIgt1c2VyQWRkcmVzcyIMdGFyZ2V0SGVpZ2h0Ihdib29zdGluZ0NvbnRyYWN0QWRkcmVzcyIfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdCIQYm9vc3RpbmdDb250cmFjdCIPc3Rha2luZ0NvbnRyYWN0IgtlcG9jaExlbmd0aCIGY2hlY2tzIg1pbkxpc3RBY3Rpb25zIhhjdXJyZW50RXBvY2hJc05vdERlZmluZWQiEnN0YXJ0SGVpZ2h0QWN0aW9ucyIGYW1vdW50IgtzdGFydEhlaWdodCIJZW5kSGVpZ2h0IhdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdCIEdXNlZCIEdm90ZSIKcG9vbFJlc3VsdCIKdG90YWxWb3RlcyITZ3d4QW1vdW50QXRFbmRUb3RhbCIJYXZhaWxhYmxlIgduZXdWb3RlIgp3eEVtaXNzaW9uIg12b3Rlc0xpc3ROYW1lIhB2b3Rlc0xpc3RBY3Rpb25zIg5uZXdFcG9jaExlbmd0aCILbmV3TWF4RGVwdGgiB3Bvb2xTdHIiC2NoZWNrQ2FsbGVyIg1lcG9jaFByZXZpb3VzIg0kdDAxNjk3OTE3MDE5IhJiYWxhbmNlSXNPa0N1cnJlbnQiE2JhbGFuY2VJc09rUHJldmlvdXMiB2FjdGlvbnMiE2RlbGV0ZVd4RW1pc3Npb25JbnYiD21vZGlmeVdlaWdodEludiILcG9vbEFkZHJlc3MiCW5ld1N0YXR1cyIQc2V0UG9vbFN0YXR1c0ludiILbGlzdEFjdGlvbnMiE3N0YXJ0SGVpZ2h0UHJldmlvdXMiE2Vwb2NoTGVuZ3RoUHJldmlvdXMiEWVuZEhlaWdodFByZXZpb3VzIhBjaGVja1RhcmdldEVwb2NoIg0kdDAxOTM3MjE5NDEyIhtnd3hBbW91bnRBdEVuZFRvdGFsUHJldmlvdXMiDHZvdGluZ1Jlc3VsdCIMdm90ZVByZXZpb3VzIhp2b3RpbmdSZXN1bHRTdGFrZWRQcmV2aW91cyIMc3Rha2VkQnlVc2VyIhl2b3RpbmdSZXN1bHRTdGFrZWRBY3Rpb25zIgVmb3JjZSILdGFyZ2V0RXBvY2giDGN1cnJlbnRFcG9jaCINJHQwMjE3NzUyMTgxNSIBciITYXNzZXRzU3RvcmVDb250cmFjdCIFc2hhcmUiDXByZXZpb3VzRXBvY2giCG5ld0Vwb2NoIhRuZXdFcG9jaExlbmd0aE9wdGlvbiIVbmV3RXBvY2hMZW5ndGhBY3Rpb25zIgpwb29sT3JVbml0IgckbWF0Y2gxIgtuZXh0UG9vbFN0ciIObmV4dFBvb2xPclVuaXQiCnVzZXJPclVuaXQiDHBvb2xzSGVhZFN0ciIObmV4dFVzZXJPclVuaXQiBHVzZXIiBG5leHQiDnByb2Nlc3NWb3RlSW52IgckbWF0Y2gyIghuZXh0VXNlciITZ3d4UmV3YXJkRGVwb3NpdEludiIHY291bnRlciIadm90aW5nRW1pc3Npb25SYXRlQ29udHJhY3QiBnJlc3VsdCIDaW52IghtYXhEZXB0aCIWZmluYWxpemF0aW9uSW5Qcm9ncmVzcyILYmFsYW5jZUlzT2siB3BheW1lbnQiD2tCb29zdGluZ0NvbmZpZyINaWR4Q2ZnQXNzZXRJZCIJd3hBc3NldElkIhNhbW91bnRBc3NldFZlcmlmaWVkIhJwcmljZUFzc2V0VmVyaWZpZWQiDXJlc3VtcHRpb25GZWUiEHNldFd4RW1pc3Npb25JbnYiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleUQAAWECAl9fAAFiAIDC1y8AAWMACgABZAAAAAFlAAEAAWYAAgABZwkAuQkCCQDMCAICAiVzCQDMCAICC2Vwb2NoTGVuZ3RoBQNuaWwFAWEAAWgJALkJAgkAzAgCAgQlcyVzCQDMCAICEGVwb2NoTGVuZ3RoX19uZXcFA25pbAUBYQEBaQEBagkAuQkCCQDMCAICBCVzJWQJAMwIAgILZXBvY2hMZW5ndGgJAMwIAgkApAMBBQFqBQNuaWwFAWEAAWsJALkJAgkAzAgCAgIlcwkAzAgCAgxjdXJyZW50RXBvY2gFA25pbAUBYQABbAkAuQkCCQDMCAICAiVzCQDMCAICCG1heERlcHRoBQNuaWwFAWEAAW0JALkJAgkAzAgCAgIlcwkAzAgCAg1yZXN1bXB0aW9uRmVlBQNuaWwFAWEAAW4JALkJAgkAzAgCAgIlcwkAzAgCAh92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQNuaWwFAWEAAW8JALkJAgkAzAgCAgIlcwkAzAgCAhp2b3RpbmdFbWlzc2lvblJhdGVDb250cmFjdAUDbmlsBQFhAAFwCQC5CQIJAMwIAgICJXMJAMwIAgIPZmFjdG9yeUNvbnRyYWN0BQNuaWwFAWEAAXEJALkJAgkAzAgCAgIlcwkAzAgCAhBib29zdGluZ0NvbnRyYWN0BQNuaWwFAWEAAXIJALkJAgkAzAgCAgIlcwkAzAgCAg9zdGFraW5nQ29udHJhY3QFA25pbAUBYQABcwkAuQkCCQDMCAICAiVzCQDMCAICE2Fzc2V0c1N0b3JlQ29udHJhY3QFA25pbAUBYQABdAkAuQkCCQDMCAICAiVzCQDMCAICEWZpbmFsaXphdGlvblN0YWdlBQNuaWwFAWEAAXUJALkJAgkAzAgCAgIlcwkAzAgCAghuZXh0UG9vbAUDbmlsBQFhAAF2CQC5CQIJAMwIAgICJXMJAMwIAgIIbmV4dFVzZXIFA25pbAUBYQABdwkAuQkCCQDMCAICAiVzCQDMCAICC3N0YXJ0SGVpZ2h0BQNuaWwFAWEAAXgJALkJAgkAzAgCAgIlcwkAzAgCAg5jdXJyZW50RXBvY2hVaQUDbmlsBQFhAAF5CQC5CQIJAMwIAgICJXMJAMwIAgINc3RhcnRIZWlnaHRVaQUDbmlsBQFhAAF6CQC5CQIJAMwIAgICJXMJAMwIAgIFZm9yY2UFA25pbAUBYQEBQQEBagkAuQkCCQDMCAICBCVzJWQJAMwIAgILc3RhcnRIZWlnaHQJAMwIAgkApAMBBQFqBQNuaWwFAWEBAUIBAWoJALkJAgkAzAgCAgQlcyVkCQDMCAICCWZpbmFsaXplZAkAzAgCCQCkAwEFAWoFA25pbAUBYQEBQwEBRAQBRQUBRAQBRggFAUUCXzEEAUcIBQFFAl8yCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBmluTGlzdAkAzAgCBQFGCQDMCAIFAUcFA25pbAUBYQEBSAIBRAFqBAFJBQFEBAFGCAUBSQJfMQQBRwgFAUkCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAhRpbnN1ZmZpY2llbnRCYWxhbmNlcwkAzAgCBQFGCQDMCAIFAUcJAMwIAgkApAMBBQFqBQNuaWwFAWEBAUoCAUsBagkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgR1c2VkCQDMCAIJAKUIAQUBSwkAzAgCCQCkAwEFAWoFA25pbAUBYQEBTAMBRAFLAWoEAU0FAUQEAUYIBQFNAl8xBAFHCAUBTQJfMgkAuQkCCQDMCAICCiVzJXMlcyVzJWQJAMwIAgIEdm90ZQkAzAgCBQFGCQDMCAIFAUcJAMwIAgkApQgBBQFLCQDMCAIJAKQDAQUBagUDbmlsBQFhAQFOAgFEAWoEAU8FAUQEAUYIBQFPAl8xBAFHCAUBTwJfMgkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAICDHZvdGluZ1Jlc3VsdAkAzAgCBQFGCQDMCAIFAUcJAMwIAgkApAMBBQFqBQNuaWwFAWEBAVACAVEBagkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhJ2b3RpbmdSZXN1bHRTdGFrZWQJAMwIAgUBUQkAzAgCCQCkAwEFAWoFA25pbAUBYQEBUgIBRAFqBAFTBQFEBAFGCAUBUwJfMQQBRwgFAVMCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAglwb29sU2hhcmUJAMwIAgUBRgkAzAgCBQFHCQDMCAIJAKQDAQUBagUDbmlsBQFhAQFUAQFqCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgp0b3RhbFZvdGVzCQDMCAIJAKQDAQUBagUDbmlsBQFhAQFVAgFRAVYJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGc3Rha2VkCQDMCAIFAVYJAMwIAgUBUQUDbmlsBQFhAQFXAQFYCQC5CQIJAMwIAgIVdm90aW5nX2VtaXNzaW9uLnJpZGU6CQDMCAIFAVgFA25pbAIBIAEBWQEBWAkAAgEJAQFXAQUBWAEBWgMBSwJhYQJhYgQCYWMJAQFXAQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQFLCQDMCAICAS4JAMwIAgUCYWEJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBAJhZAUCYWIDCQABAgUCYWQCBlN0cmluZwQCYWUFAmFkCQCdCAIFAUsFAmFhAwkAAQIFAmFkAgNJbnQEAmFmBQJhZAkAmggCBQFLBQJhYQkBAVkBAhJpbnZhbGlkIGVudHJ5IHR5cGUFAmFjAQJhZwIBSwJhYQoAAmFoCQEBWgMFAUsFAmFhAgADCQABAgUCYWgCBlN0cmluZwUCYWgJAAIBCQCsAgIJAAMBBQJhaAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAQJhaQIBSwJhYQoAAmFoCQEBWgMFAUsFAmFhAAADCQABAgUCYWgCA0ludAUCYWgJAAIBCQCsAgIJAAMBBQJhaAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQJhagEBRAkArAICCQCsAgIIBQFEAl8xBQFhCAUBRAJfMgECYWsBAmFlBAJhbAkAtQkCBQJhZQUBYQMJAAACCQCQAwEFAmFsAAIJAJQKAgkAkQMCBQJhbAAACQCRAwIFAmFsAAEJAQFZAQITaW52YWxpZCBwb29sIHN0cmluZwACYW0JARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhZwIFBHRoaXMFAXAAAmFuAAoBAmFvAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFwAQJhcQkAtQkCCQECYWcCBQJhcQkBAmFvAAUBYQECYXIBAmFzCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFzBQJhbgECYXQCAUYBRwQCYXUKAAJhaAkA/AcEBQJhbQIQcG9vbEluZm9SRUFET05MWQkAzAgCBQFGCQDMCAIFAUcFA25pbAUDbmlsAwkAAQIFAmFoAhUoQWRkcmVzcywgQnl0ZVZlY3RvcikFAmFoBQR1bml0BQJhdQECYXYCAUYBRwoBAmF3AQJheAkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJheAoBAmF5AgJhegJhQQkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fCQCkAwEFAmF6AgJfXwkApAMBBQJhQQIjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QKAQJhQgECYUMJAKwCAgkArAICAgglcyVzJXNfXwUCYUMCIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0BAJhRAkBAmFpAgUCYW0JAQJhdwEFAUYEAmFFCQECYWkCBQJhbQkBAmF3AQUBRwQCYUMJAQJhZwIFAmFtCQECYXkCBQJhRAUCYUUEAmFGCQECYWcCBQJhbQkBAmFCAQUCYUMFAmFGAQJhRwEBRAQCYUgFAUQEAUYIBQJhSAJfMQQBRwgFAmFIAl8yCgACYWgJAPwHBAUCYW0CGGNoZWNrV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQFGCQDMCAIFAUcFA25pbAUDbmlsAwkAAQIFAmFoAgdCb29sZWFuBQJhaAkAAgEJAKwCAgkAAwEFAmFoAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAQJhSQAEAmFzCQECYXABBQJhbQQCYUoJAQJhcgEFAmFzCQD8BwQFAmFKAgdkZXBvc2l0BQNuaWwFA25pbAACYUsCBXBvb2xzAQJhTAEBRAQCYU0FAUQEAUYIBQJhTQJfMQQBRwgFAmFNAl8yCQC5CQIJAMwIAgIFdm90ZXMJAMwIAgUBRgkAzAgCBQFHBQNuaWwFAWEBAmFOAQJhTwQCYVADCQAAAgUCYU8FAmFLAgQlcyVzAgglcyVzJXMlcwkAuQkCCQDMCAIFAmFQCQDMCAIFAmFPCQDMCAICBGhlYWQFA25pbAUBYQECYVEBAmFPBAJhUAMJAAACBQJhTwUCYUsCBCVzJXMCCCVzJXMlcyVzCQC5CQIJAMwIAgUCYVAJAMwIAgUCYU8JAMwIAgIEc2l6ZQUDbmlsBQFhAQJhUgICYU8CYVMEAmFQAwkAAAIFAmFPBQJhSwIIJXMlcyVzJXMCCiVzJXMlcyVzJXMJALkJAgkAzAgCBQJhUAkAzAgCBQJhTwkAzAgCBQJhUwkAzAgCAgRwcmV2BQNuaWwFAWEBAmFUAgJhTwJhUwQCYVADCQAAAgUCYU8FAmFLAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFAmFQCQDMCAIFAmFPCQDMCAIFAmFTCQDMCAICBG5leHQFA25pbAUBYQECYVUCAmFPAmFTBAJhVgkAnQgCBQR0aGlzCQECYU4BBQJhTwQCYVcJAJ0IAgUEdGhpcwkBAmFSAgUCYU8FAmFTBAJhWAkAnQgCBQR0aGlzCQECYVQCBQJhTwUCYVMDAwkAAAIFAmFTCQELdmFsdWVPckVsc2UCBQJhVgIABgkBAiE9AgUCYVcFBHVuaXQGCQECIT0CBQJhWAUEdW5pdAECYVkCAmFPAmFTBAJhVgkAnQgCBQR0aGlzCQECYU4BBQJhTwQCYVoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFRAQUCYU8AAAQCYmEDCQEBIQEJAQJhVQIFAmFPBQJhUwYJAQFZAQILTm9kZSBleGlzdHMDCQAAAgUCYmEFAmJhCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFRAQUCYU8JAGQCBQJhWgABBQNuaWwDCQECIT0CBQJhVgUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYVQCBQJhTwUCYVMJAQV2YWx1ZQEFAmFWCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhUgIFAmFPCQEFdmFsdWUBBQJhVgUCYVMFA25pbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhTgEFAmFPBQJhUwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJiYgICYU8CYVMEAmFWCQCdCAIFBHRoaXMJAQJhTgEFAmFPBAJhWgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYVEBBQJhTwAABAJhVwkAnQgCBQR0aGlzCQECYVICBQJhTwUCYVMEAmFYCQCdCAIFBHRoaXMJAQJhVAIFAmFPBQJhUwkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYVEBBQJhTwkAZQIFAmFaAAEFA25pbAMDCQECIT0CBQJhVwUEdW5pdAkBAiE9AgUCYVgFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhVAIFAmFPCQEFdmFsdWUBBQJhVwkBBXZhbHVlAQUCYVgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFSAgUCYU8JAQV2YWx1ZQEFAmFYCQEFdmFsdWUBBQJhVwkAzAgCCQELRGVsZXRlRW50cnkBCQECYVICBQJhTwUCYVMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFUAgUCYU8FAmFTBQNuaWwDCQECIT0CBQJhWAUEdW5pdAkAzAgCCQELU3RyaW5nRW50cnkCCQECYU4BBQJhTwkBBXZhbHVlAQUCYVgJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFUAgUCYU8FAmFTCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhUgIFAmFPCQEFdmFsdWUBBQJhWAUDbmlsAwkBAiE9AgUCYVcFBHVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFSAgUCYU8FAmFTCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhVAIFAmFPCQEFdmFsdWUBBQJhVwUDbmlsAwkAAAIFAmFTCQELdmFsdWVPckVsc2UCBQJhVgIACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhTgEFAmFPBQNuaWwJAQFZAQkArAICCQCsAgIJAKwCAgIOaW52YWxpZCBub2RlOiAFAmFPAgEuBQJhUwECYmMAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwECYmQAAhQlc19fbWFuYWdlclB1YmxpY0tleQECYmUABAJhZAkAoggBCQECYmMAAwkAAQIFAmFkAgZTdHJpbmcEAmJmBQJhZAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYmYFBHRoaXMBAmJnAAQCYmgJAQJiZQAEAmFkCQCdCAIFAmJoCQECYmQAAwkAAQIFAmFkAgZTdHJpbmcEAmJmBQJhZAkA2QQBBQJiZgMJAAECBQJhZAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJiaQECYmoEAmFkCQECYmcAAwkAAQIFAmFkAgpCeXRlVmVjdG9yBAJiawUCYWQJAAACCAUCYmoPY2FsbGVyUHVibGljS2V5BQJiawMJAAECBQJhZAIEVW5pdAkAAAIIBQJiagZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECYmwBAmJqAwkBAmJpAQUCYmoGCQACAQIRcGVybWlzc2lvbiBkZW5pZWQBAmJtAQJiagMJAAACCAUCYmoGY2FsbGVyBQR0aGlzBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkEwJiagEYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0AgJibgJibwQCYnAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQECYWcCBQR0aGlzBQFxCQEBVwECIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAlAoCBQNuaWwKAAJhaAkA/AcEBQJicAIgZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0UkVBRE9OTFkJAMwIAgUCYm4JAMwIAgUCYm8FA25pbAUDbmlsAwkAAQIFAmFoAgNJbnQFAmFoCQACAQkArAICCQADAQUCYWgCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAJiagELY29uc3RydWN0b3IFAmFtAmJxAmJyAmJzAmJ0BAJidQkAzAgCCQECYmwBBQJiagkAzAgCAwkBAiE9AgkApggBBQJhbQUEdW5pdAYCIGludmFsaWQgZmFjdG9yeSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFAmJxBQR1bml0BgIyaW52YWxpZCB2b3RpbmcgZW1pc3Npb24gY2FuZGlkYXRlIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUCYnIFBHVuaXQGAiFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUCYnMFBHVuaXQGAiBpbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkAZgIFAmJ0AAAGCQEBWQECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUCYnUFAmJ1CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcAUCYW0JAMwIAgkBC1N0cmluZ0VudHJ5AgUBbgUCYnEJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcQUCYnIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBcgUCYnMJAMwIAgkBDEludGVnZXJFbnRyeQIFAWcFAmJ0BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmoBBmNyZWF0ZQIBRgFHBAJidQkAzAgCAwkAAAIJANgEAQgIBQJiagZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBbgIABgkBAmJsAQUCYmoFA25pbAMJAAACBQJidQUCYnUEAUQJAJQKAgUBRgUBRwQCYnYJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAUMBBQFEBgUDbmlsCQECYVkCBQJhSwkBAmFqAQUBRAQCYncJAAACCQCaCAIFBHRoaXMFAWsFBHVuaXQEAmJ4AwUCYncEAWoAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBawUBagkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUEBBQFqBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAXcFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBeAUBagkAzAgCCQEMSW50ZWdlckVudHJ5AgUBeQUGaGVpZ2h0BQNuaWwFA25pbAkAlAoCCQDOCAIFAmJ2BQJieAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEEdm90ZQMBRgFHAmJ5BAFECQCUCgIFAUYFAUcEAWoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawAABAJiegkBAmFpAgUEdGhpcwkBAUEBBQFqBAJidAkBAmFpAgUEdGhpcwUBZwQCYkEJAGQCBQJiegUCYnQEAmJCCQCaCAIFBHRoaXMFAXQEAmJDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFKAggFAmJqBmNhbGxlcgUBagAABAJiRAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTAMFAUQIBQJiagZjYWxsZXIFAWoAAAQCYkUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAU4CBQFEBQFqAAAEAmJGCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFUAQUBagAABAJiRwoAAmFoCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCCQDYBAEICAUCYmoGY2FsbGVyBWJ5dGVzCQDMCAIFAmJBBQNuaWwFA25pbAMJAAECBQJhaAIDSW50BQJhaAkAAgEJAKwCAgkAAwEFAmFoAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJICQBlAgUCYkcFAmJDBAJiSQkAZAIFAmJEBQJieQQCYkoJAQJhRwEFAUQEAmJ1CQDMCAIDCQECIT0CCQCgCAEJAQFDAQUBRAUEdW5pdAYJAQFZAQIOaW52YWxpZCBhc3NldHMJAMwIAgMJAGYCBQJiQQUGaGVpZ2h0BgkBAVkBAg5pbnZhbGlkIGhlaWdodAkAzAgCAwkAAAIFAmJCBQR1bml0BgkBAVkBAhhmaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MJAMwIAgMJAGYCBQJiRwAABgkBAVkBAhN5b3UgZG8gbm90IGhhdmUgZ1dYCQDMCAIDAwkAZgIFAmJ5AAAJAGcCBQJiSAUCYnkHBgkBAVkBAg5pbnZhbGlkIGFtb3VudAkAzAgCAwUCYkoGCQEBWQECHXBvb2wgaGFzbid0IFdYX0VNSVNTSU9OIGxhYmVsBQNuaWwDCQAAAgUCYnUFAmJ1BAJiSwkBAmFMAQUBRAQBVgkApQgBCAUCYmoGY2FsbGVyBAJiTAMJAQJhVQIFAmJLBQFWBQNuaWwJAQJhWQIFAmJLBQFWCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUoCCAUCYmoGY2FsbGVyBQFqCQBkAgUCYkMFAmJ5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTAMFAUQIBQJiagZjYWxsZXIFAWoFAmJJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTgIFAUQFAWoJAGQCBQJiRQUCYnkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFUAQUBagkAZAIFAmJGBQJieQUDbmlsBQJiTAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEKY2FuY2VsVm90ZQIBRgFHBAFECQCUCgIFAUYFAUcEAWoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawAABAJiegkBAmFpAgUEdGhpcwkBAUEBBQFqBAJidAkBAmFpAgUEdGhpcwUBZwQCYkEJAGQCBQJiegUCYnQEAmJCCQCaCAIFBHRoaXMFAXQEAmJDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFKAggFAmJqBmNhbGxlcgUBagAABAJiRAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBTAMFAUQIBQJiagZjYWxsZXIFAWoAAAQCYkUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAU4CBQFEBQFqAAAEAmJGCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFUAQUBagAABAJidQkAzAgCAwkBAiE9AgkAoAgBCQEBQwEFAUQFBHVuaXQGCQEBWQECDmludmFsaWQgYXNzZXRzCQDMCAIDCQBmAgUCYkEFBmhlaWdodAYJAQFZAQIOaW52YWxpZCBoZWlnaHQJAMwIAgMJAAACBQJiQgUEdW5pdAYJAQFZAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUCYkQAAAYJAQFZAQIHbm8gdm90ZQUDbmlsAwkAAAIFAmJ1BQJidQQCYksJAQJhTAEFAUQEAVYJAKUIAQgFAmJqBmNhbGxlcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFKAggFAmJqBmNhbGxlcgUBagkAlgMBCQDMCAIJAGUCBQJiQwUCYkQJAMwIAgAABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAUwDBQFECAUCYmoGY2FsbGVyBQFqCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTgIFAUQFAWoJAGUCBQJiRQUCYkQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFUAQUBagkAZQIFAmJGBQJiRAUDbmlsCQECYmICBQJiSwUBVgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEOc2V0RXBvY2hMZW5ndGgBAmJNBAJidQkAzAgCCQECYmwBBQJiagkAzAgCAwkAZgIFAmJNAAAGCQEBWQECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUCYnUFAmJ1CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAWgFAmJNBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmoBC3NldE1heERlcHRoAQJiTgQCYnUJAMwIAgkBAmJsAQUCYmoJAMwIAgMJAGYCBQJiTgAABgkBAVkBAhFpbnZhbGlkIG1heCBkZXB0aAUDbmlsAwkAAAIFAmJ1BQJidQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFsBQJiTgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJqARpwcm9jZXNzUG9vbEJhbGFuY2VJTlRFUk5BTAECYk8EAmJQCQECYm0BBQJiagMJAAACBQJiUAUCYlAEAWoJAQJhaQIFBHRoaXMFAWsEAmJRCQBlAgUBagABBAFECQECYWsBBQJiTwQCYlIFAUQEAUYIBQJiUgJfMQQBRwgFAmJSAl8yBAJhRgkBAmF2AgUBRgUBRwQCYlMKAAJhaAkA/AcEBQJhbQIMY2hlY2tCYWxhbmNlCQDMCAIFAmFGBQNuaWwFA25pbAMJAAECBQJhaAIHQm9vbGVhbgUCYWgJAAIBCQCsAgIJAAMBBQJhaAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCYlQJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEBSAIFAUQJAGUCBQJiUQABBwQCYlUDCQEBIQEFAmJTAwkBASEBBQJiVAQCYlYJAPwHBAUCYW0CGWRlbGV0ZVd4RW1pc3Npb25Qb29sTGFiZWwJAMwIAgUBRgkAzAgCBQFHBQNuaWwFA25pbAMJAAACBQJiVgUCYlYEAmJXCQD8BwQFAmFtAgxtb2RpZnlXZWlnaHQJAMwIAgUCYUYJAMwIAgAABQNuaWwFA25pbAMJAAACBQJiVwUCYlcEAmJYCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQECYXQCBQFGBQFHCQEBVwECDmludmFsaWQgYXNzZXRzAl8xBAJiWQADBAJiWgkA/AcEBQJhbQIKbWFuYWdlUG9vbAkAzAgCCQClCAEFAmJYCQDMCAIFAmJZBQNuaWwFA25pbAMJAAACBQJiWgUCYloEAmNhCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAUMBBQFEBQNuaWwJAQJiYgIFAmFLCQECYWoBBQFECQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUBRAUCYlEAAAUDbmlsBQJjYQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAUgCBQFEBQJiUQYFA25pbAUDbmlsCQCUCgIFAmJVBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJqARNwcm9jZXNzVm90ZUlOVEVSTkFMAgJiTwFWBAJiUAkBAmJtAQUCYmoDCQAAAgUCYlAFAmJQBAJibgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAVYJAQFXAQkArAICAipwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHVzZXIgYWRkcmVzcyAFAVYEAWoJAQJhaQIFBHRoaXMFAWsEAmJRCQBlAgUBagABBAJidAkBAmFpAgUEdGhpcwUBZwQCYnoJAQJhaQIFBHRoaXMJAQFBAQUBagQCYkEJAGQCBQJiegUCYnQEAmNiCQECYWkCBQR0aGlzCQEBQQEFAmJRBAJjYwkBAmFpAgUEdGhpcwkBAWkBBQJiUQQCY2QJAGQCBQJjYgUCY2MEAmNlAwkAZwIFAmJRAAAGCQEBWQECK3Byb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgcHJldmlvdXMgZXBvY2gDCQAAAgUCY2UFAmNlBAFECQECYWsBBQJiTwQCY2YFAUQEAUYIBQJjZgJfMQQBRwgFAmNmAl8yBAJiRwoAAmFoCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCBQFWCQDMCAIFAmJBBQNuaWwFA25pbAMJAAECBQJhaAIDSW50BQJhaAkAAgEJAKwCAgkAAwEFAmFoAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmNnCgACYWgJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFAVYJAMwIAgUCY2QFA25pbAUDbmlsAwkAAQIFAmFoAgNJbnQFAmFoCQACAQkArAICCQADAQUCYWgCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYkYJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAVQBBQFqAAAEAmNoCQELdmFsdWVPckVsc2UCCQCfCAEJAQFOAgUBRAUBagAABAJjaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQFMAwUBRAUCYm4FAmJRCQEBVwEJAKwCAgkArAICCQCsAgIJAKwCAgIUcHJvY2Vzc1ZvdGVJTlRFUk5BTCAFAmJPAgEgBQFWAhI6IG5vIHByZXZpb3VzIHZvdGUEAmJDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFKAgUCYm4FAWoAAAQBUQkBAmF2AgUBRgUBRwQCY2oJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAVACBQFRBQJiUQAABAJicwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFnAgUEdGhpcwUBcgQCY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYnMJAQFVAgUBUQUBVgAABAJjbAMJAAACBQJjawAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFQAgUBUQUCYlEJAGQCBQJjagUCY2kFA25pbAQCYUYJAQJhdgIFAUYFAUcEAmJJAwkAZgIFAmNnAAAJAGsDBQJjaQUCYkcFAmNnAAAEAmJVAwkAZgIFAmJJAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFMAwUBRAUCYm4FAWoFAmJJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVAEFAWoJAGQCBQJiRgUCYkkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFOAgUBRAUBagkAZAIFAmNoBQJiSQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUoCBQJibgUBagkAZAIFAmJDBQJiSQUDbmlsCQECYmICCQECYUwBBQFEBQFWCQCUCgIJAM4IAgUCYlUFAmNsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJqARNwcm9jZXNzUG9vbElOVEVSTkFMAgJiTwJjbQQCYlAJAQJibQEFAmJqAwkAAAIFAmJQBQJiUAQCY24EAmNvCQECYWkCBQR0aGlzBQFrAwUCY20FAmNvCQBlAgUCY28AAQQCY2UDCQBnAgUCY24AAAYJAQFZAQIpcHJvY2Vzc1Bvb2xJTlRFUk5BTDogaW52YWxpZCB0YXJnZXQgZXBvY2gDCQAAAgUCY2UFAmNlBAFECQECYWsBBQJiTwQCY3AFAUQEAUYIBQJjcAJfMQQBRwgFAmNwAl8yBAJicwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFnAgUEdGhpcwUBcgQCYUYJAQJhdgIFAUYFAUcEAmNxCgACYWgJAPwHBAUCYnMCEnVzZXJzTGlzdFRyYXZlcnNhbAkAzAgCBQJhRgUDbmlsBQNuaWwDCQABAgUCYWgCB0Jvb2xlYW4FAmFoCQACAQkArAICCQADAQUCYWgCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCY3EFAmNxAwUCY3EJAJQKAgUDbmlsBgQCY3IJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhbQUBcwIdaW52YWxpZCBhc3NldHMgc3RvcmUgY29udHJhY3QEAmJGCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFUAQUCY24AAAQCY2gJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAU4CBQFEBQJjbgAABAJjcwMJAAACBQJiRgAAAAAJAGsDBQJjaAUBYgUCYkYEAmJXCQD8BwQFAmFtAgxtb2RpZnlXZWlnaHQJAMwIAgUCYUYJAMwIAgUCY3MFA25pbAUDbmlsAwkAAAIFAmJXBQJiVwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFAUQFAmNuBQJjcwUDbmlsBwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEOZmluYWxpemVIZWxwZXIABAJjbQkBC3ZhbHVlT3JFbHNlAgkAoAgBBQF6BwQBagkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrAAAEAmN0CQBlAgUBagABBAJiegkBAmFpAgUEdGhpcwkBAUEBBQFqBAJidAkBAmFpAgUEdGhpcwUBZwQCYkEJAGQCBQJiegUCYnQEAmJCCQCaCAIFBHRoaXMFAXQDAwMJAGcCBQZoZWlnaHQFAmJBCQAAAgUCYkIFBHVuaXQHCQEBIQEFAmNtBwQCY3UJAGQCBQFqAAEEAmN2CQCaCAIFBHRoaXMFAWgEAmN3BAJhZAUCY3YDCQABAgUCYWQCA0ludAQCYk0FAmFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFnBQJiTQkAzAgCCQELRGVsZXRlRW50cnkBBQFoBQNuaWwDCQABAgUCYWQCBFVuaXQFA25pbAkAAgECC01hdGNoIGVycm9yCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUEBBQJjdQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF3BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAWsFAmN1CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBaQEFAWoFAmJ0BQNuaWwFAmN3BgMDBQJjbQkAAAIFAmJCBQR1bml0BwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFmBQNuaWwGAwkAAAIFAmJCBQR1bml0CQCUCgIFA25pbAcDCQAAAgUCYkIFAWQEAmN4CQCiCAEFAXUEAmFkBQJjeAMJAAECBQJhZAIEVW5pdAQCY3kJAKIIAQkBAmFOAQUCYUsDCQABAgUCY3kCBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdAUBZQkAzAgCCQELRGVsZXRlRW50cnkBBQF1BQNuaWwGAwkAAQIFAmN5AgZTdHJpbmcEAmN6BQJjeQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXUFAmN6BQNuaWwGCQACAQILTWF0Y2ggZXJyb3IDCQABAgUCYWQCBlN0cmluZwQCYk8FAmFkBAJjQQkAoggBCQECYVQCBQJhSwUCYk8DCQAAAgUCY0EFAmNBBAJjcQkA/AcEBQR0aGlzAhpwcm9jZXNzUG9vbEJhbGFuY2VJTlRFUk5BTAkAzAgCBQJiTwUDbmlsBQNuaWwDCQAAAgUCY3EFAmNxBAJjeQUCY0EDCQABAgUCY3kCBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBdAUBZQkAzAgCCQELRGVsZXRlRW50cnkBBQF1BQNuaWwGAwkAAQIFAmN5AgZTdHJpbmcEAmN6BQJjeQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXUFAmN6BQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgMJAAACBQJiQgUBZQQCY3gJAKIIAQUBdQQCY0IJAKIIAQUBdgQCYWQFAmN4AwkAAQIFAmFkAgRVbml0BAJjeQkAoggBCQECYU4BBQJhSwMJAAECBQJjeQIEVW5pdAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQF0BQFmCQDMCAIJAQtEZWxldGVFbnRyeQEFAXUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdgUDbmlsBgMJAAECBQJjeQIGU3RyaW5nBAJjQwUCY3kJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQF1BQJjQwUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAmFkAgZTdHJpbmcEAmJPBQJhZAQBRAkBAmFrAQUCYk8EAmNEBAJjeQUCY0IDCQABAgUCY3kCBFVuaXQJAKIIAQkBAmFOAQkBAmFMAQUBRAMJAAECBQJjeQIGU3RyaW5nBAJjRQUCY3kEAmNGCQCiCAEJAQJhVAIJAQJhTAEFAUQFAmNFAwkAAAIFAmNGBQJjRgQCY0cJAPwHBAUEdGhpcwITcHJvY2Vzc1ZvdGVJTlRFUk5BTAkAzAgCBQJiTwkAzAgCBQJjRQUDbmlsBQNuaWwDCQAAAgUCY0cFAmNHBQJjRgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yBAJjeQUCY0QDCQABAgUCY3kCBFVuaXQEAmNBCQCiCAEJAQJhVAIFAmFLBQJiTwQCY0gFAmNBAwkAAQIFAmNIAgRVbml0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAXQFAWYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdQkAzAgCCQELRGVsZXRlRW50cnkBBQF2BQNuaWwGAwkAAQIFAmNIAgZTdHJpbmcEAmJmBQJjSAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAXUFAmJmCQDMCAIJAQtEZWxldGVFbnRyeQEFAXYFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQJjeQIGU3RyaW5nBAJjSQUCY3kJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQF2BQJjSQUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUCYkIFAWYEAmN4CQCiCAEFAXUEAmFkBQJjeAMJAAECBQJhZAIEVW5pdAQCY3kJAKIIAQkBAmFOAQUCYUsDCQABAgUCY3kCBFVuaXQEAmJVAwUCY20JAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdAkAzAgCCQELRGVsZXRlRW50cnkBBQF6BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAUIBBQJjdAYJAMwIAgkBDEludGVnZXJFbnRyeQIFAXgFAWoJAMwIAgkBDEludGVnZXJFbnRyeQIFAXkFAmJ6BQNuaWwEAmNKCQECYUkAAwkAAAIFAmNKBQJjSgkAlAoCBQJiVQYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQABAgUCY3kCBlN0cmluZwQCY3oFAmN5CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBdQUCY3oFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQJhZAIGU3RyaW5nBAJiTwUCYWQEAmNBCQCiCAEJAQJhVAIFAmFLBQJiTwMJAAACBQJjQQUCY0EEAmNxCgACYWgJAPwHBAUEdGhpcwITcHJvY2Vzc1Bvb2xJTlRFUk5BTAkAzAgCBQJiTwkAzAgCBQJjbQUDbmlsBQNuaWwDCQABAgUCYWgCB0Jvb2xlYW4FAmFoCQACAQkArAICCQADAQUCYWgCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCY3EFAmNxAwUCY3EJAJQKAgUDbmlsBgQCY3kFAmNBAwkAAQIFAmN5AgRVbml0BAJiVQMFAmNtCQDMCAIJAQtEZWxldGVFbnRyeQEFAXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBegkAzAgCCQELRGVsZXRlRW50cnkBBQF1BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUBdAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAUIBBQJjdAYJAMwIAgkBDEludGVnZXJFbnRyeQIFAXgFAWoJAMwIAgkBDEludGVnZXJFbnRyeQIFAXkFAmJ6CQDMCAIJAQtEZWxldGVFbnRyeQEFAXUFA25pbAQCY0oJAQJhSQADCQAAAgUCY0oFAmNKCQCUCgIFAmJVBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAECBQJjeQIGU3RyaW5nBAJjegUCY3kJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQF1BQJjegUDbmlsBgkAAgECC01hdGNoIGVycm9yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQILTWF0Y2ggZXJyb3IJAQFZAQIWZmluYWxpemF0aW9uIGlzIGJyb2tlbgJiagEPZmluYWxpemVXcmFwcGVyAQJjSwQCY0wJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFAW8EAmNNCgACYWgJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAmFoAgdCb29sZWFuBQJhaAkAAgEJAKwCAgkAAwEFAmFoAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmNNBQJjTQMJAQEhAQUCY00DCQAAAgUCY0sAAAkBAVkBAh5DdXJyZW50IHZvdGluZyBpcyBub3Qgb3ZlciB5ZXQEAmNOCQD8BwQFAmNMAghmaW5hbGl6ZQUDbmlsBQNuaWwDCQAAAgUCY04FAmNOCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCY08JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBbAUBYwMJAGYCBQJjTwUCY0sEAmNOCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBkAgUCY0sAAQUDbmlsBQNuaWwDCQAAAgUCY04FAmNOCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmoBCGZpbmFsaXplAAQCY04JAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCY04FAmNOCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEUY29udGFpbnNOb2RlUkVBRE9OTFkCAmFPAmFTCQCUCgIFA25pbAkBAmFVAgUCYU8FAmFTAmJqAQppbnNlcnROb2RlAgJhTwJhUwQCYlAJAQJibAEFAmJqAwkAAAIFAmJQBQJiUAkAlAoCCQECYVkCBQJhTwUCYVMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmoBCmRlbGV0ZU5vZGUCAmFPAmFTBAJiUAkBAmJsAQUCYmoDCQAAAgUCYlAFAmJQCQCUCgIJAQJiYgIFAmFPBQJhUwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEYaXNGaW5hbGl6YXRpb25JblByb2dyZXNzAAQCYkIJAJoIAgUEdGhpcwUBdAQCY1AJAQIhPQIFAmJCBQR1bml0CQCUCgIFA25pbAUCY1ACYmoBCmRlbGV0ZVBvb2wCAUYBRwQCYlADAwkAAAIIBQJiagZjYWxsZXIFAmFtBgkBAmJsAQUCYmoGCQEBWQECEVBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmJQBQJiUAQCYU8CBXBvb2xzBAFECQCUCgIFAUYFAUcEAmFTCQC5CQIJAMwIAgUBRgkAzAgCBQFHBQNuaWwFAWEEAmJVAwkBAmFVAgUCYU8FAmFTCQECYmICBQJhTwUCYVMFA25pbAkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFDAQUBRAUDbmlsBQJiVQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiagEGcmVzdW1lAgFGAUcEAmFGCQECYXYCBQFGBQFHBAJjUQoAAmFoCQD8BwQFAmFtAgxjaGVja0JhbGFuY2UJAMwIAgUCYUYFA25pbAUDbmlsAwkAAQIFAmFoAgdCb29sZWFuBQJhaAkAAgEJAKwCAgkAAwEFAmFoAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJjUgkAkQMCCAUCYmoIcGF5bWVudHMAAAQCY3IJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFAXMEAmNTAgolc19fY29uZmlnBAJjVAABBAJicgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFnAgUEdGhpcwUBcQQCY1UJANkEAQkAkQMCCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAmJyBQJjUwUBYQUCY1QEAmNWCgACYWgJAPwHBAUCY3ICEmlzVmVyaWZpZWRSRUFET05MWQkAzAgCBQFGBQNuaWwFA25pbAMJAAECBQJhaAIHQm9vbGVhbgUCYWgJAAIBCQCsAgIJAAMBBQJhaAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCY1cKAAJhaAkA/AcEBQJjcgISaXNWZXJpZmllZFJFQURPTkxZCQDMCAIFAUcFA25pbAUDbmlsAwkAAQIFAmFoAgdCb29sZWFuBQJhaAkAAgEJAKwCAgkAAwEFAmFoAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJjWAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAW0CFmludmFsaWQgcmVzdW1wdGlvbiBmZWUEAmJ1CQDMCAIDBQJjUQYJAQFZAQIVaW5zdWZmaWNpZW50IGJhbGFuY2VzCQDMCAIDCQAAAgkAkAMBCAUCYmoIcGF5bWVudHMAAQYJAQFZAQIVMSBwYXltZW50IGlzIHJlcXVpcmVkCQDMCAIDCQAAAggFAmNSB2Fzc2V0SWQFAmNVBgkBAVkBAhhpbnZhbGlkIHBheW1lbnQgYXNzZXQgaWQJAMwIAgMJAAACCAUCY1IGYW1vdW50BQJjWAYJAQFZAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAzAgCAwMFAmNWBQJjVwcGCQEBWQECHmJvdGggYXNzZXRzIHNob3VsZCBiZSB2ZXJpZmllZAUDbmlsAwkAAAIFAmJ1BQJidQQCY1kJAPwHBAUCYW0CFnNldFd4RW1pc3Npb25Qb29sTGFiZWwJAMwIAgUBRgkAzAgCBQFHBQNuaWwFA25pbAMJAAACBQJjWQUCY1kEAUQJAJQKAgUBRgUBRwQCYnYJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAUMBBQFEBgUDbmlsCQECYVkCBQJhSwkBAmFqAQUBRAkAlAoCBQJidgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY1oBAmRhAAQCZGIEAmFkCQECYmcAAwkAAQIFAmFkAgpCeXRlVmVjdG9yBAJiawUCYWQFAmJrAwkAAQIFAmFkAgRVbml0CAUCY1oPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmNaCWJvZHlCeXRlcwkAkQMCCAUCY1oGcHJvb2ZzAAAFAmRiPUiPew==", "height": 3066519, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GSPTD42ZfJuujPW4kMVGFUbmJF82gZzGM2p1WJ26e4mc Next: KTryZkBiizn7FmoWa3HxgrzWHARH3brtXuWu8ijAznF Diff:
OldNewDifferences
1212 let finalizationStageTotal = 1
1313
1414 let finalizationStageShares = 2
15-
16-let resumptionFeeDefault = 500000000000
1715
1816 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1917
6159
6260
6361 func keyInList (pool) = {
64- let $t020132053 = pool
65- let amountAssetId = $t020132053._1
66- let priceAssetId = $t020132053._2
62+ let $t019722012 = pool
63+ let amountAssetId = $t019722012._1
64+ let priceAssetId = $t019722012._2
6765 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6866 }
6967
7068
7169 func keyInsufficientBalances (pool,epoch) = {
72- let $t022022242 = pool
73- let amountAssetId = $t022022242._1
74- let priceAssetId = $t022022242._2
70+ let $t021612201 = pool
71+ let amountAssetId = $t021612201._1
72+ let priceAssetId = $t021612201._2
7573 makeString(["%s%s%s%d", "insufficientBalances", amountAssetId, priceAssetId, toString(epoch)], separator)
7674 }
7775
8078
8179
8280 func keyVote (pool,address,epoch) = {
83- let $t025502590 = pool
84- let amountAssetId = $t025502590._1
85- let priceAssetId = $t025502590._2
81+ let $t025092549 = pool
82+ let amountAssetId = $t025092549._1
83+ let priceAssetId = $t025092549._2
8684 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
8785 }
8886
8987
9088 func keyVotingResult (pool,epoch) = {
91- let $t027722812 = pool
92- let amountAssetId = $t027722812._1
93- let priceAssetId = $t027722812._2
89+ let $t027312771 = pool
90+ let amountAssetId = $t027312771._1
91+ let priceAssetId = $t027312771._2
9492 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
9593 }
9694
9997
10098
10199 func keyPoolShare (pool,epoch) = {
102- let $t031333173 = pool
103- let amountAssetId = $t031333173._1
104- let priceAssetId = $t031333173._2
100+ let $t030923132 = pool
101+ let amountAssetId = $t030923132._1
102+ let priceAssetId = $t030923132._2
105103 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
106104 }
107105
198196
199197
200198 func checkWxEmissionPoolLabel (pool) = {
201- let $t062996339 = pool
202- let amountAssetId = $t062996339._1
203- let priceAssetId = $t062996339._2
199+ let $t062586298 = pool
200+ let amountAssetId = $t062586298._1
201+ let priceAssetId = $t062586298._2
204202 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
205203 if ($isInstanceOf(@, "Boolean"))
206204 then @
218216 let poolsListName = "pools"
219217
220218 func getVotesListName (pool) = {
221- let $t067566796 = pool
222- let amountAssetId = $t067566796._1
223- let priceAssetId = $t067566796._2
219+ let $t067156755 = pool
220+ let amountAssetId = $t067156755._1
221+ let priceAssetId = $t067156755._2
224222 makeString(["votes", amountAssetId, priceAssetId], separator)
225223 }
226224
519517 let epoch = getIntOrFail(this, keyCurrentEpoch)
520518 let epochPrevious = (epoch - 1)
521519 let pool = stringToPool(poolStr)
522- let $t01702017060 = pool
523- let amountAssetId = $t01702017060._1
524- let priceAssetId = $t01702017060._2
520+ let $t01697917019 = pool
521+ let amountAssetId = $t01697917019._1
522+ let priceAssetId = $t01697917019._2
525523 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
526524 let balanceIsOkCurrent = {
527525 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
582580 if ((checkTargetEpoch == checkTargetEpoch))
583581 then {
584582 let pool = stringToPool(poolStr)
585- let $t01941319453 = pool
586- let amountAssetId = $t01941319453._1
587- let priceAssetId = $t01941319453._2
583+ let $t01937219412 = pool
584+ let amountAssetId = $t01937219412._1
585+ let priceAssetId = $t01937219412._2
588586 let gwxAmountAtEndTotal = {
589587 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
590588 if ($isInstanceOf(@, "Int"))
641639 if ((checkTargetEpoch == checkTargetEpoch))
642640 then {
643641 let pool = stringToPool(poolStr)
644- let $t02181621856 = pool
645- let amountAssetId = $t02181621856._1
646- let priceAssetId = $t02181621856._2
642+ let $t02177521815 = pool
643+ let amountAssetId = $t02177521815._1
644+ let priceAssetId = $t02177521815._2
647645 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
648646 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
649647 let r = {
981979 then @
982980 else throw(($getType(@) + " couldn't be cast to Boolean"))
983981 }
984- let resumptionFee = valueOrElse(getInteger(this, keyResumptionFee), resumptionFeeDefault)
982+ let resumptionFee = valueOrErrorMessage(getInteger(this, keyResumptionFee), "invalid resumption fee")
985983 let checks = [if (balanceIsOk)
986984 then true
987985 else throwErr("insufficient balances"), if ((size(i.payments) == 1))
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 resumptionFeeDefault = 500000000000
1715
1816 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1917
2018 let keyEpochLengthNew = makeString(["%s%s", "epochLength__new"], separator)
2119
2220 func keyEpochLengthByEpoch (epoch) = makeString(["%s%d", "epochLength", toString(epoch)], separator)
2321
2422
2523 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
2624
2725 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
2826
2927 let keyResumptionFee = makeString(["%s", "resumptionFee"], separator)
3028
3129 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
3230
3331 let keyVotingEmissionRateContract = makeString(["%s", "votingEmissionRateContract"], separator)
3432
3533 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
3634
3735 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3836
3937 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
4038
4139 let keyAssetsStoreContract = makeString(["%s", "assetsStoreContract"], separator)
4240
4341 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
4442
4543 let keyNextPool = makeString(["%s", "nextPool"], separator)
4644
4745 let keyNextUser = makeString(["%s", "nextUser"], separator)
4846
4947 let keyStartHeight = makeString(["%s", "startHeight"], separator)
5048
5149 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
5250
5351 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
5452
5553 let keyFinalizationShouldBeForced = makeString(["%s", "force"], separator)
5654
5755 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
5856
5957
6058 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
6159
6260
6361 func keyInList (pool) = {
64- let $t020132053 = pool
65- let amountAssetId = $t020132053._1
66- let priceAssetId = $t020132053._2
62+ let $t019722012 = pool
63+ let amountAssetId = $t019722012._1
64+ let priceAssetId = $t019722012._2
6765 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
6866 }
6967
7068
7169 func keyInsufficientBalances (pool,epoch) = {
72- let $t022022242 = pool
73- let amountAssetId = $t022022242._1
74- let priceAssetId = $t022022242._2
70+ let $t021612201 = pool
71+ let amountAssetId = $t021612201._1
72+ let priceAssetId = $t021612201._2
7573 makeString(["%s%s%s%d", "insufficientBalances", amountAssetId, priceAssetId, toString(epoch)], separator)
7674 }
7775
7876
7977 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
8078
8179
8280 func keyVote (pool,address,epoch) = {
83- let $t025502590 = pool
84- let amountAssetId = $t025502590._1
85- let priceAssetId = $t025502590._2
81+ let $t025092549 = pool
82+ let amountAssetId = $t025092549._1
83+ let priceAssetId = $t025092549._2
8684 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
8785 }
8886
8987
9088 func keyVotingResult (pool,epoch) = {
91- let $t027722812 = pool
92- let amountAssetId = $t027722812._1
93- let priceAssetId = $t027722812._2
89+ let $t027312771 = pool
90+ let amountAssetId = $t027312771._1
91+ let priceAssetId = $t027312771._2
9492 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
9593 }
9694
9795
9896 func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], separator)
9997
10098
10199 func keyPoolShare (pool,epoch) = {
102- let $t031333173 = pool
103- let amountAssetId = $t031333173._1
104- let priceAssetId = $t031333173._2
100+ let $t030923132 = pool
101+ let amountAssetId = $t030923132._1
102+ let priceAssetId = $t030923132._2
105103 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
106104 }
107105
108106
109107 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
110108
111109
112110 func keyStakedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s", "staked", userAddressStr, lpAssetIdStr], separator)
113111
114112
115113 func wrapErr (msg) = makeString(["voting_emission.ride:", msg], " ")
116114
117115
118116 func throwErr (msg) = throw(wrapErr(msg))
119117
120118
121119 func getValueOrFail (address,key,type) = {
122120 let error = wrapErr(makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
123121 valueOrErrorMessage( match type {
124122 case str: String =>
125123 getString(address, key)
126124 case int: Int =>
127125 getInteger(address, key)
128126 case _ =>
129127 throwErr("invalid entry type")
130128 }, error)
131129 }
132130
133131
134132 func getStrOrFail (address,key) = {
135133 let @ = getValueOrFail(address, key, "")
136134 if ($isInstanceOf(@, "String"))
137135 then @
138136 else throw(($getType(@) + " couldn't be cast to String"))
139137 }
140138
141139
142140 func getIntOrFail (address,key) = {
143141 let @ = getValueOrFail(address, key, 0)
144142 if ($isInstanceOf(@, "Int"))
145143 then @
146144 else throw(($getType(@) + " couldn't be cast to Int"))
147145 }
148146
149147
150148 func poolToString (pool) = ((pool._1 + separator) + pool._2)
151149
152150
153151 func stringToPool (str) = {
154152 let parts = split(str, separator)
155153 if ((size(parts) == 2))
156154 then $Tuple2(parts[0], parts[1])
157155 else throwErr("invalid pool string")
158156 }
159157
160158
161159 let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
162160
163161 let IdxFactoryCfgGwxRewardDapp = 10
164162
165163 func keyFactoryCfg () = "%s__factoryConfig"
166164
167165
168166 func readFactoryCfgOrFail (factory) = split(getStrOrFail(factory, keyFactoryCfg()), separator)
169167
170168
171169 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
172170
173171
174172 func getPoolInfo (amountAssetId,priceAssetId) = {
175173 let poolInfoOption = {
176174 let @ = invoke(factoryContract, "poolInfoREADONLY", [amountAssetId, priceAssetId], nil)
177175 if ($isInstanceOf(@, "(Address, ByteVector)"))
178176 then @
179177 else unit
180178 }
181179 poolInfoOption
182180 }
183181
184182
185183 func getLpAssetByPoolAssets (amountAssetId,priceAssetId) = {
186184 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
187185
188186 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
189187
190188 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
191189
192190 let amountAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amountAssetId))
193191 let priceAssetInternalId = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAssetId))
194192 let poolContractAddress = getStrOrFail(factoryContract, keyMappingPoolAssetsToPoolContractAddress(amountAssetInternalId, priceAssetInternalId))
195193 let lpAssetId = getStrOrFail(factoryContract, keyMappingPoolContractToLPAsset(poolContractAddress))
196194 lpAssetId
197195 }
198196
199197
200198 func checkWxEmissionPoolLabel (pool) = {
201- let $t062996339 = pool
202- let amountAssetId = $t062996339._1
203- let priceAssetId = $t062996339._2
199+ let $t062586298 = pool
200+ let amountAssetId = $t062586298._1
201+ let priceAssetId = $t062586298._2
204202 let @ = invoke(factoryContract, "checkWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
205203 if ($isInstanceOf(@, "Boolean"))
206204 then @
207205 else throw(($getType(@) + " couldn't be cast to Boolean"))
208206 }
209207
210208
211209 func gwxRewardDeposit () = {
212210 let factoryCfg = readFactoryCfgOrFail(factoryContract)
213211 let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
214212 invoke(gwxRewardsContract, "deposit", nil, nil)
215213 }
216214
217215
218216 let poolsListName = "pools"
219217
220218 func getVotesListName (pool) = {
221- let $t067566796 = pool
222- let amountAssetId = $t067566796._1
223- let priceAssetId = $t067566796._2
219+ let $t067156755 = pool
220+ let amountAssetId = $t067156755._1
221+ let priceAssetId = $t067156755._2
224222 makeString(["votes", amountAssetId, priceAssetId], separator)
225223 }
226224
227225
228226 func keyListHead (listName) = {
229227 let meta = if ((listName == poolsListName))
230228 then "%s%s"
231229 else "%s%s%s%s"
232230 makeString([meta, listName, "head"], separator)
233231 }
234232
235233
236234 func keyListSize (listName) = {
237235 let meta = if ((listName == poolsListName))
238236 then "%s%s"
239237 else "%s%s%s%s"
240238 makeString([meta, listName, "size"], separator)
241239 }
242240
243241
244242 func keyListPrev (listName,id) = {
245243 let meta = if ((listName == poolsListName))
246244 then "%s%s%s%s"
247245 else "%s%s%s%s%s"
248246 makeString([meta, listName, id, "prev"], separator)
249247 }
250248
251249
252250 func keyListNext (listName,id) = {
253251 let meta = if ((listName == poolsListName))
254252 then "%s%s%s%s"
255253 else "%s%s%s%s%s"
256254 makeString([meta, listName, id, "next"], separator)
257255 }
258256
259257
260258 func containsNode (listName,id) = {
261259 let headOrUnit = getString(this, keyListHead(listName))
262260 let prevOrUnit = getString(this, keyListPrev(listName, id))
263261 let nextOrUnit = getString(this, keyListNext(listName, id))
264262 if (if ((id == valueOrElse(headOrUnit, "")))
265263 then true
266264 else (prevOrUnit != unit))
267265 then true
268266 else (nextOrUnit != unit)
269267 }
270268
271269
272270 func insertNodeActions (listName,id) = {
273271 let headOrUnit = getString(this, keyListHead(listName))
274272 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
275273 let checkNode = if (!(containsNode(listName, id)))
276274 then true
277275 else throwErr("Node exists")
278276 if ((checkNode == checkNode))
279277 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
280278 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
281279 else nil)) ++ [StringEntry(keyListHead(listName), id)])
282280 else throw("Strict value is not equal to itself.")
283281 }
284282
285283
286284 func deleteNodeActions (listName,id) = {
287285 let headOrUnit = getString(this, keyListHead(listName))
288286 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
289287 let prevOrUnit = getString(this, keyListPrev(listName, id))
290288 let nextOrUnit = getString(this, keyListNext(listName, id))
291289 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
292290 then (nextOrUnit != unit)
293291 else false)
294292 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
295293 else if ((nextOrUnit != unit))
296294 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
297295 else if ((prevOrUnit != unit))
298296 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
299297 else if ((id == valueOrElse(headOrUnit, "")))
300298 then [DeleteEntry(keyListHead(listName))]
301299 else throwErr(((("invalid node: " + listName) + ".") + id))))
302300 }
303301
304302
305303 func keyManagerVaultAddress () = "%s__managerVaultAddress"
306304
307305
308306 func keyManagerPublicKey () = "%s__managerPublicKey"
309307
310308
311309 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
312310 case s: String =>
313311 addressFromStringValue(s)
314312 case _ =>
315313 this
316314 }
317315
318316
319317 func managerPublicKeyOrUnit () = {
320318 let managerVaultAddress = getManagerVaultAddressOrThis()
321319 match getString(managerVaultAddress, keyManagerPublicKey()) {
322320 case s: String =>
323321 fromBase58String(s)
324322 case _: Unit =>
325323 unit
326324 case _ =>
327325 throw("Match error")
328326 }
329327 }
330328
331329
332330 func isManager (i) = match managerPublicKeyOrUnit() {
333331 case pk: ByteVector =>
334332 (i.callerPublicKey == pk)
335333 case _: Unit =>
336334 (i.caller == this)
337335 case _ =>
338336 throw("Match error")
339337 }
340338
341339
342340 func mustManager (i) = if (isManager(i))
343341 then true
344342 else throw("permission denied")
345343
346344
347345 func mustThis (i) = if ((i.caller == this))
348346 then true
349347 else throw("permission denied")
350348
351349
352350 @Callable(i)
353351 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
354352 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), wrapErr("invalid boosting contract address"))
355353 $Tuple2(nil, {
356354 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
357355 if ($isInstanceOf(@, "Int"))
358356 then @
359357 else throw(($getType(@) + " couldn't be cast to Int"))
360358 })
361359 }
362360
363361
364362
365363 @Callable(i)
366364 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
367365 let checks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
368366 then true
369367 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
370368 then true
371369 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
372370 then true
373371 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
374372 then true
375373 else "invalid staking contract address", if ((epochLength > 0))
376374 then true
377375 else throwErr("invalid epoch length")]
378376 if ((checks == checks))
379377 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
380378 else throw("Strict value is not equal to itself.")
381379 }
382380
383381
384382
385383 @Callable(i)
386384 func create (amountAssetId,priceAssetId) = {
387385 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
388386 then true
389387 else mustManager(i)]
390388 if ((checks == checks))
391389 then {
392390 let pool = $Tuple2(amountAssetId, priceAssetId)
393391 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
394392 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
395393 let startHeightActions = if (currentEpochIsNotDefined)
396394 then {
397395 let epoch = 0
398396 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
399397 }
400398 else nil
401399 $Tuple2((inListActions ++ startHeightActions), unit)
402400 }
403401 else throw("Strict value is not equal to itself.")
404402 }
405403
406404
407405
408406 @Callable(i)
409407 func vote (amountAssetId,priceAssetId,amount) = {
410408 let pool = $Tuple2(amountAssetId, priceAssetId)
411409 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
412410 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
413411 let epochLength = getIntOrFail(this, keyEpochLength)
414412 let endHeight = (startHeight + epochLength)
415413 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
416414 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
417415 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
418416 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
419417 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
420418 let gwxAmountAtEndTotal = {
421419 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
422420 if ($isInstanceOf(@, "Int"))
423421 then @
424422 else throw(($getType(@) + " couldn't be cast to Int"))
425423 }
426424 let available = (gwxAmountAtEndTotal - used)
427425 let newVote = (vote + amount)
428426 let wxEmission = checkWxEmissionPoolLabel(pool)
429427 let checks = [if ((getBoolean(keyInList(pool)) != unit))
430428 then true
431429 else throwErr("invalid assets"), if ((endHeight > height))
432430 then true
433431 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
434432 then true
435433 else throwErr("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
436434 then true
437435 else throwErr("you do not have gWX"), if (if ((amount > 0))
438436 then (available >= amount)
439437 else false)
440438 then true
441439 else throwErr("invalid amount"), if (wxEmission)
442440 then true
443441 else throwErr("pool hasn't WX_EMISSION label")]
444442 if ((checks == checks))
445443 then {
446444 let votesListName = getVotesListName(pool)
447445 let userAddressStr = toString(i.caller)
448446 let votesListActions = if (containsNode(votesListName, userAddressStr))
449447 then nil
450448 else insertNodeActions(votesListName, userAddressStr)
451449 $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)
452450 }
453451 else throw("Strict value is not equal to itself.")
454452 }
455453
456454
457455
458456 @Callable(i)
459457 func cancelVote (amountAssetId,priceAssetId) = {
460458 let pool = $Tuple2(amountAssetId, priceAssetId)
461459 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
462460 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
463461 let epochLength = getIntOrFail(this, keyEpochLength)
464462 let endHeight = (startHeight + epochLength)
465463 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
466464 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
467465 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
468466 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
469467 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
470468 let checks = [if ((getBoolean(keyInList(pool)) != unit))
471469 then true
472470 else throwErr("invalid assets"), if ((endHeight > height))
473471 then true
474472 else throwErr("invalid height"), if ((finalizationStageOrUnit == unit))
475473 then true
476474 else throwErr("finalization in progress"), if ((vote > 0))
477475 then true
478476 else throwErr("no vote")]
479477 if ((checks == checks))
480478 then {
481479 let votesListName = getVotesListName(pool)
482480 let userAddressStr = toString(i.caller)
483481 $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)
484482 }
485483 else throw("Strict value is not equal to itself.")
486484 }
487485
488486
489487
490488 @Callable(i)
491489 func setEpochLength (newEpochLength) = {
492490 let checks = [mustManager(i), if ((newEpochLength > 0))
493491 then true
494492 else throwErr("invalid epoch length")]
495493 if ((checks == checks))
496494 then $Tuple2([IntegerEntry(keyEpochLengthNew, newEpochLength)], unit)
497495 else throw("Strict value is not equal to itself.")
498496 }
499497
500498
501499
502500 @Callable(i)
503501 func setMaxDepth (newMaxDepth) = {
504502 let checks = [mustManager(i), if ((newMaxDepth > 0))
505503 then true
506504 else throwErr("invalid max depth")]
507505 if ((checks == checks))
508506 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
509507 else throw("Strict value is not equal to itself.")
510508 }
511509
512510
513511
514512 @Callable(i)
515513 func processPoolBalanceINTERNAL (poolStr) = {
516514 let checkCaller = mustThis(i)
517515 if ((checkCaller == checkCaller))
518516 then {
519517 let epoch = getIntOrFail(this, keyCurrentEpoch)
520518 let epochPrevious = (epoch - 1)
521519 let pool = stringToPool(poolStr)
522- let $t01702017060 = pool
523- let amountAssetId = $t01702017060._1
524- let priceAssetId = $t01702017060._2
520+ let $t01697917019 = pool
521+ let amountAssetId = $t01697917019._1
522+ let priceAssetId = $t01697917019._2
525523 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
526524 let balanceIsOkCurrent = {
527525 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
528526 if ($isInstanceOf(@, "Boolean"))
529527 then @
530528 else throw(($getType(@) + " couldn't be cast to Boolean"))
531529 }
532530 let balanceIsOkPrevious = !(valueOrElse(getBoolean(this, keyInsufficientBalances(pool, (epochPrevious - 1))), false))
533531 let actions = if (!(balanceIsOkCurrent))
534532 then if (!(balanceIsOkPrevious))
535533 then {
536534 let deleteWxEmissionInv = invoke(factoryContract, "deleteWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
537535 if ((deleteWxEmissionInv == deleteWxEmissionInv))
538536 then {
539537 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, 0], nil)
540538 if ((modifyWeightInv == modifyWeightInv))
541539 then {
542540 let poolAddress = valueOrErrorMessage(getPoolInfo(amountAssetId, priceAssetId), wrapErr("invalid assets"))._1
543541 let newStatus = 3
544542 let setPoolStatusInv = invoke(factoryContract, "managePool", [toString(poolAddress), newStatus], nil)
545543 if ((setPoolStatusInv == setPoolStatusInv))
546544 then {
547545 let listActions = ([DeleteEntry(keyInList(pool))] ++ deleteNodeActions(poolsListName, poolToString(pool)))
548546 ([IntegerEntry(keyPoolShare(pool, epochPrevious), 0)] ++ listActions)
549547 }
550548 else throw("Strict value is not equal to itself.")
551549 }
552550 else throw("Strict value is not equal to itself.")
553551 }
554552 else throw("Strict value is not equal to itself.")
555553 }
556554 else [BooleanEntry(keyInsufficientBalances(pool, epochPrevious), true)]
557555 else nil
558556 $Tuple2(actions, unit)
559557 }
560558 else throw("Strict value is not equal to itself.")
561559 }
562560
563561
564562
565563 @Callable(i)
566564 func processVoteINTERNAL (poolStr,userAddressStr) = {
567565 let checkCaller = mustThis(i)
568566 if ((checkCaller == checkCaller))
569567 then {
570568 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr(("processVoteINTERNAL: invalid user address " + userAddressStr)))
571569 let epoch = getIntOrFail(this, keyCurrentEpoch)
572570 let epochPrevious = (epoch - 1)
573571 let epochLength = getIntOrFail(this, keyEpochLength)
574572 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
575573 let endHeight = (startHeight + epochLength)
576574 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
577575 let epochLengthPrevious = getIntOrFail(this, keyEpochLengthByEpoch(epochPrevious))
578576 let endHeightPrevious = (startHeightPrevious + epochLengthPrevious)
579577 let checkTargetEpoch = if ((epochPrevious >= 0))
580578 then true
581579 else throwErr("processVoteINTERNAL: invalid previous epoch")
582580 if ((checkTargetEpoch == checkTargetEpoch))
583581 then {
584582 let pool = stringToPool(poolStr)
585- let $t01941319453 = pool
586- let amountAssetId = $t01941319453._1
587- let priceAssetId = $t01941319453._2
583+ let $t01937219412 = pool
584+ let amountAssetId = $t01937219412._1
585+ let priceAssetId = $t01937219412._2
588586 let gwxAmountAtEndTotal = {
589587 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
590588 if ($isInstanceOf(@, "Int"))
591589 then @
592590 else throw(($getType(@) + " couldn't be cast to Int"))
593591 }
594592 let gwxAmountAtEndTotalPrevious = {
595593 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
596594 if ($isInstanceOf(@, "Int"))
597595 then @
598596 else throw(($getType(@) + " couldn't be cast to Int"))
599597 }
600598 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
601599 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
602600 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), wrapErr((((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote")))
603601 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
604602 let lpAssetIdStr = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
605603 let votingResultStakedPrevious = valueOrElse(getInteger(keyVotingResultStaked(lpAssetIdStr, epochPrevious)), 0)
606604 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
607605 let stakedByUser = valueOrElse(getInteger(stakingContract, keyStakedByUser(lpAssetIdStr, userAddressStr)), 0)
608606 let votingResultStakedActions = if ((stakedByUser == 0))
609607 then nil
610608 else [IntegerEntry(keyVotingResultStaked(lpAssetIdStr, epochPrevious), (votingResultStakedPrevious + votePrevious))]
611609 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
612610 let newVote = if ((gwxAmountAtEndTotalPrevious > 0))
613611 then fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
614612 else 0
615613 let actions = if ((newVote > 0))
616614 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
617615 else deleteNodeActions(getVotesListName(pool), userAddressStr)
618616 $Tuple2((actions ++ votingResultStakedActions), unit)
619617 }
620618 else throw("Strict value is not equal to itself.")
621619 }
622620 else throw("Strict value is not equal to itself.")
623621 }
624622
625623
626624
627625 @Callable(i)
628626 func processPoolINTERNAL (poolStr,force) = {
629627 let checkCaller = mustThis(i)
630628 if ((checkCaller == checkCaller))
631629 then {
632630 let targetEpoch = {
633631 let currentEpoch = getIntOrFail(this, keyCurrentEpoch)
634632 if (force)
635633 then currentEpoch
636634 else (currentEpoch - 1)
637635 }
638636 let checkTargetEpoch = if ((targetEpoch >= 0))
639637 then true
640638 else throwErr("processPoolINTERNAL: invalid target epoch")
641639 if ((checkTargetEpoch == checkTargetEpoch))
642640 then {
643641 let pool = stringToPool(poolStr)
644- let $t02181621856 = pool
645- let amountAssetId = $t02181621856._1
646- let priceAssetId = $t02181621856._2
642+ let $t02177521815 = pool
643+ let amountAssetId = $t02177521815._1
644+ let priceAssetId = $t02177521815._2
647645 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
648646 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
649647 let r = {
650648 let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
651649 if ($isInstanceOf(@, "Boolean"))
652650 then @
653651 else throw(($getType(@) + " couldn't be cast to Boolean"))
654652 }
655653 if ((r == r))
656654 then if (r)
657655 then $Tuple2(nil, true)
658656 else {
659657 let assetsStoreContract = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyAssetsStoreContract), "invalid assets store contract"))
660658 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
661659 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
662660 let share = if ((totalVotes == 0))
663661 then 0
664662 else fraction(votingResult, poolWeightMult, totalVotes)
665663 let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
666664 if ((modifyWeightInv == modifyWeightInv))
667665 then $Tuple2([IntegerEntry(keyPoolShare(pool, targetEpoch), share)], false)
668666 else throw("Strict value is not equal to itself.")
669667 }
670668 else throw("Strict value is not equal to itself.")
671669 }
672670 else throw("Strict value is not equal to itself.")
673671 }
674672 else throw("Strict value is not equal to itself.")
675673 }
676674
677675
678676
679677 @Callable(i)
680678 func finalizeHelper () = {
681679 let force = valueOrElse(getBoolean(keyFinalizationShouldBeForced), false)
682680 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
683681 let previousEpoch = (epoch - 1)
684682 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
685683 let epochLength = getIntOrFail(this, keyEpochLength)
686684 let endHeight = (startHeight + epochLength)
687685 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
688686 if (if (if ((height >= endHeight))
689687 then (finalizationStageOrUnit == unit)
690688 else false)
691689 then !(force)
692690 else false)
693691 then {
694692 let newEpoch = (epoch + 1)
695693 let newEpochLengthOption = getInteger(this, keyEpochLengthNew)
696694 let newEpochLengthActions = match newEpochLengthOption {
697695 case newEpochLength: Int =>
698696 [IntegerEntry(keyEpochLength, newEpochLength), DeleteEntry(keyEpochLengthNew)]
699697 case _: Unit =>
700698 nil
701699 case _ =>
702700 throw("Match error")
703701 }
704702 $Tuple2(([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageBalances), IntegerEntry(keyEpochLengthByEpoch(epoch), epochLength)] ++ newEpochLengthActions), true)
705703 }
706704 else if (if (force)
707705 then (finalizationStageOrUnit == unit)
708706 else false)
709707 then $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares)], true)
710708 else if ((finalizationStageOrUnit == unit))
711709 then $Tuple2(nil, false)
712710 else if ((finalizationStageOrUnit == finalizationStageBalances))
713711 then {
714712 let poolOrUnit = getString(keyNextPool)
715713 match poolOrUnit {
716714 case _: Unit =>
717715 match getString(keyListHead(poolsListName)) {
718716 case _: Unit =>
719717 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageTotal), DeleteEntry(keyNextPool)], true)
720718 case nextPoolStr: String =>
721719 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
722720 case _ =>
723721 throw("Match error")
724722 }
725723 case poolStr: String =>
726724 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
727725 if ((nextPoolOrUnit == nextPoolOrUnit))
728726 then {
729727 let r = invoke(this, "processPoolBalanceINTERNAL", [poolStr], nil)
730728 if ((r == r))
731729 then match nextPoolOrUnit {
732730 case _: Unit =>
733731 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageTotal), DeleteEntry(keyNextPool)], true)
734732 case nextPoolStr: String =>
735733 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
736734 case _ =>
737735 throw("Match error")
738736 }
739737 else throw("Strict value is not equal to itself.")
740738 }
741739 else throw("Strict value is not equal to itself.")
742740 case _ =>
743741 throw("Match error")
744742 }
745743 }
746744 else if ((finalizationStageOrUnit == finalizationStageTotal))
747745 then {
748746 let poolOrUnit = getString(keyNextPool)
749747 let userOrUnit = getString(keyNextUser)
750748 match poolOrUnit {
751749 case _: Unit =>
752750 match getString(keyListHead(poolsListName)) {
753751 case _: Unit =>
754752 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
755753 case poolsHeadStr: String =>
756754 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
757755 case _ =>
758756 throw("Match error")
759757 }
760758 case poolStr: String =>
761759 let pool = stringToPool(poolStr)
762760 let nextUserOrUnit = match userOrUnit {
763761 case _: Unit =>
764762 getString(keyListHead(getVotesListName(pool)))
765763 case user: String =>
766764 let next = getString(keyListNext(getVotesListName(pool), user))
767765 if ((next == next))
768766 then {
769767 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
770768 if ((processVoteInv == processVoteInv))
771769 then next
772770 else throw("Strict value is not equal to itself.")
773771 }
774772 else throw("Strict value is not equal to itself.")
775773 case _ =>
776774 throw("Match error")
777775 }
778776 match nextUserOrUnit {
779777 case _: Unit =>
780778 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
781779 match nextPoolOrUnit {
782780 case _: Unit =>
783781 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
784782 case s: String =>
785783 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
786784 case _ =>
787785 throw("Match error")
788786 }
789787 case nextUser: String =>
790788 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
791789 case _ =>
792790 throw("Match error")
793791 }
794792 case _ =>
795793 throw("Match error")
796794 }
797795 }
798796 else if ((finalizationStageOrUnit == finalizationStageShares))
799797 then {
800798 let poolOrUnit = getString(keyNextPool)
801799 match poolOrUnit {
802800 case _: Unit =>
803801 match getString(keyListHead(poolsListName)) {
804802 case _: Unit =>
805803 let actions = if (force)
806804 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced)]
807805 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)]
808806 let gwxRewardDepositInv = gwxRewardDeposit()
809807 if ((gwxRewardDepositInv == gwxRewardDepositInv))
810808 then $Tuple2(actions, true)
811809 else throw("Strict value is not equal to itself.")
812810 case nextPoolStr: String =>
813811 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
814812 case _ =>
815813 throw("Match error")
816814 }
817815 case poolStr: String =>
818816 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
819817 if ((nextPoolOrUnit == nextPoolOrUnit))
820818 then {
821819 let r = {
822820 let @ = invoke(this, "processPoolINTERNAL", [poolStr, force], nil)
823821 if ($isInstanceOf(@, "Boolean"))
824822 then @
825823 else throw(($getType(@) + " couldn't be cast to Boolean"))
826824 }
827825 if ((r == r))
828826 then if (r)
829827 then $Tuple2(nil, true)
830828 else match nextPoolOrUnit {
831829 case _: Unit =>
832830 let actions = if (force)
833831 then [DeleteEntry(keyFinalizationStage), DeleteEntry(keyFinalizationShouldBeForced), DeleteEntry(keyNextPool)]
834832 else [DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)]
835833 let gwxRewardDepositInv = gwxRewardDeposit()
836834 if ((gwxRewardDepositInv == gwxRewardDepositInv))
837835 then $Tuple2(actions, true)
838836 else throw("Strict value is not equal to itself.")
839837 case nextPoolStr: String =>
840838 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
841839 case _ =>
842840 throw("Match error")
843841 }
844842 else throw("Strict value is not equal to itself.")
845843 }
846844 else throw("Strict value is not equal to itself.")
847845 case _ =>
848846 throw("Match error")
849847 }
850848 }
851849 else throwErr("finalization is broken")
852850 }
853851
854852
855853
856854 @Callable(i)
857855 func finalizeWrapper (counter) = {
858856 let votingEmissionRateContract = addressFromStringValue(getStringValue(this, keyVotingEmissionRateContract))
859857 let result = {
860858 let @ = invoke(this, "finalizeHelper", nil, nil)
861859 if ($isInstanceOf(@, "Boolean"))
862860 then @
863861 else throw(($getType(@) + " couldn't be cast to Boolean"))
864862 }
865863 if ((result == result))
866864 then if (!(result))
867865 then if ((counter == 0))
868866 then throwErr("Current voting is not over yet")
869867 else {
870868 let inv = invoke(votingEmissionRateContract, "finalize", nil, nil)
871869 if ((inv == inv))
872870 then $Tuple2(nil, unit)
873871 else throw("Strict value is not equal to itself.")
874872 }
875873 else {
876874 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
877875 if ((maxDepth > counter))
878876 then {
879877 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
880878 if ((inv == inv))
881879 then $Tuple2(nil, unit)
882880 else throw("Strict value is not equal to itself.")
883881 }
884882 else $Tuple2(nil, unit)
885883 }
886884 else throw("Strict value is not equal to itself.")
887885 }
888886
889887
890888
891889 @Callable(i)
892890 func finalize () = {
893891 let inv = invoke(this, "finalizeWrapper", [0], nil)
894892 if ((inv == inv))
895893 then $Tuple2(nil, unit)
896894 else throw("Strict value is not equal to itself.")
897895 }
898896
899897
900898
901899 @Callable(i)
902900 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
903901
904902
905903
906904 @Callable(i)
907905 func insertNode (listName,id) = {
908906 let checkCaller = mustManager(i)
909907 if ((checkCaller == checkCaller))
910908 then $Tuple2(insertNodeActions(listName, id), unit)
911909 else throw("Strict value is not equal to itself.")
912910 }
913911
914912
915913
916914 @Callable(i)
917915 func deleteNode (listName,id) = {
918916 let checkCaller = mustManager(i)
919917 if ((checkCaller == checkCaller))
920918 then $Tuple2(deleteNodeActions(listName, id), unit)
921919 else throw("Strict value is not equal to itself.")
922920 }
923921
924922
925923
926924 @Callable(i)
927925 func isFinalizationInProgress () = {
928926 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
929927 let finalizationInProgress = (finalizationStageOrUnit != unit)
930928 $Tuple2(nil, finalizationInProgress)
931929 }
932930
933931
934932
935933 @Callable(i)
936934 func deletePool (amountAssetId,priceAssetId) = {
937935 let checkCaller = if (if ((i.caller == factoryContract))
938936 then true
939937 else mustManager(i))
940938 then true
941939 else throwErr("Permission denied")
942940 if ((checkCaller == checkCaller))
943941 then {
944942 let listName = "pools"
945943 let pool = $Tuple2(amountAssetId, priceAssetId)
946944 let id = makeString([amountAssetId, priceAssetId], separator)
947945 let actions = if (containsNode(listName, id))
948946 then deleteNodeActions(listName, id)
949947 else nil
950948 ([DeleteEntry(keyInList(pool))] ++ actions)
951949 }
952950 else throw("Strict value is not equal to itself.")
953951 }
954952
955953
956954
957955 @Callable(i)
958956 func resume (amountAssetId,priceAssetId) = {
959957 let lpAssetId = getLpAssetByPoolAssets(amountAssetId, priceAssetId)
960958 let balanceIsOk = {
961959 let @ = invoke(factoryContract, "checkBalance", [lpAssetId], nil)
962960 if ($isInstanceOf(@, "Boolean"))
963961 then @
964962 else throw(($getType(@) + " couldn't be cast to Boolean"))
965963 }
966964 let payment = i.payments[0]
967965 let assetsStoreContract = addressFromStringValue(getStringValue(this, keyAssetsStoreContract))
968966 let kBoostingConfig = "%s__config"
969967 let idxCfgAssetId = 1
970968 let boostingContract = addressFromStringValue(getStrOrFail(this, keyBoostingContract))
971969 let wxAssetId = fromBase58String(split(getStringValue(boostingContract, kBoostingConfig), separator)[idxCfgAssetId])
972970 let amountAssetVerified = {
973971 let @ = invoke(assetsStoreContract, "isVerifiedREADONLY", [amountAssetId], nil)
974972 if ($isInstanceOf(@, "Boolean"))
975973 then @
976974 else throw(($getType(@) + " couldn't be cast to Boolean"))
977975 }
978976 let priceAssetVerified = {
979977 let @ = invoke(assetsStoreContract, "isVerifiedREADONLY", [priceAssetId], nil)
980978 if ($isInstanceOf(@, "Boolean"))
981979 then @
982980 else throw(($getType(@) + " couldn't be cast to Boolean"))
983981 }
984- let resumptionFee = valueOrElse(getInteger(this, keyResumptionFee), resumptionFeeDefault)
982+ let resumptionFee = valueOrErrorMessage(getInteger(this, keyResumptionFee), "invalid resumption fee")
985983 let checks = [if (balanceIsOk)
986984 then true
987985 else throwErr("insufficient balances"), if ((size(i.payments) == 1))
988986 then true
989987 else throwErr("1 payment is required"), if ((payment.assetId == wxAssetId))
990988 then true
991989 else throwErr("invalid payment asset id"), if ((payment.amount == resumptionFee))
992990 then true
993991 else throwErr("invalid payment amount"), if (if (amountAssetVerified)
994992 then priceAssetVerified
995993 else false)
996994 then true
997995 else throwErr("both assets should be verified")]
998996 if ((checks == checks))
999997 then {
1000998 let setWxEmissionInv = invoke(factoryContract, "setWxEmissionPoolLabel", [amountAssetId, priceAssetId], nil)
1001999 if ((setWxEmissionInv == setWxEmissionInv))
10021000 then {
10031001 let pool = $Tuple2(amountAssetId, priceAssetId)
10041002 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
10051003 $Tuple2(inListActions, unit)
10061004 }
10071005 else throw("Strict value is not equal to itself.")
10081006 }
10091007 else throw("Strict value is not equal to itself.")
10101008 }
10111009
10121010
10131011 @Verifier(tx)
10141012 func verify () = {
10151013 let targetPublicKey = match managerPublicKeyOrUnit() {
10161014 case pk: ByteVector =>
10171015 pk
10181016 case _: Unit =>
10191017 tx.senderPublicKey
10201018 case _ =>
10211019 throw("Match error")
10221020 }
10231021 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
10241022 }
10251023

github/deemru/w8io/786bc32 
104.18 ms