tx · 9oVUyT3cLf31dHCmNJ6o5GdSfopCswi7KGYxK7DUdxKb

3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz:  -0.02200000 Waves

2023.02.20 16:54 [2458061] smart account 3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz > SELF 0.00000000 Waves

{ "type": 13, "id": "9oVUyT3cLf31dHCmNJ6o5GdSfopCswi7KGYxK7DUdxKb", "fee": 2200000, "feeAssetId": null, "timestamp": 1676901271168, "version": 2, "chainId": 84, "sender": "3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz", "senderPublicKey": "D28XoueZWsMfm8Y5pa6C5ZFuYoWgre2Wm8tzJANJgMnq", "proofs": [ "5WGcCz8dMU8fF8LTPhKrMgAJujbKxtw8UBs597iSAFnor8omcyTLYoz2YKV4KdyYxDzowjMF1v2PRd6A7G6CqSVb" ], "script": "base64:BgL1HggCEgMKAQgSAwoBCBIDCgEIEgASABIECgIIARIDCgEIEgQKAggIEgYKBAEYCBgSBAoCGAgSBAoCCAgSAwoBCBIECgIICCIGU0NBTEU4IgVNVUxUOCIHU0NBTEUxOCIGTVVMVDE4IgNTRVAiDlBPT0xXRUlHSFRNVUxUIgp6ZXJvQmlnSW50IglvbmVCaWdJbnQiCWFzQW55TGlzdCIDdmFsIgckbWF0Y2gwIgp2YWxBbnlMeXN0IgVhc0ludCIGdmFsSW50Ighhc1N0cmluZyIGdmFsU3RyIgxhc0J5dGVWZWN0b3IiBnZhbEJpbiIPZ2V0U3RyaW5nT3JGYWlsIgdhZGRyZXNzIgNrZXkiGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbCIMZ2V0SW50T3JaZXJvIg9nZXRJbnRPckRlZmF1bHQiCmRlZmF1bHRWYWwiDGdldEludE9yRmFpbCIZZ2V0QmlnSW50RnJvbVN0cmluZ09yWmVybyIcZ2V0QmlnSW50RnJvbVN0cmluZ09yRGVmYXVsdCIBcyIFdG9YMTgiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiB2Zyb21YMTgiD3Jlc3VsdFNjYWxlTXVsdCIRa2V5RmFjdG9yeUFkZHJlc3MiGWtleVZvdGluZ0VtaXNzaW9uQ29udHJhY3QiGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcCIZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcCIUSWR4RmFjdG9yeUNmZ0lkb0RhcHAiFUlkeEZhY3RvcnlDZmdUZWFtRGFwcCIZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcCIVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwIhlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwIg1rZXlGYWN0b3J5Q2ZnIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIWa2V5U3RhYmxlUG9vbEFkZG9uQWRkciIMa2V5QWRkb25BZGRyIhprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZyIKbHBBc3NldFN0ciIQa2V5RmFjdG9yeUxwTGlzdCIma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MiFGtleUZhY3RvcnlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiCnJlYWRMcExpc3QiB2ZhY3RvcnkiFHJlYWRGYWN0b3J5Q2ZnT3JGYWlsIhhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwiCmZhY3RvcnlDZmciGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbCIXZ2V0U3Rha2luZ0FkZHJlc3NPckZhaWwiHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudCIha2V5RW1pc3Npb25SYXRlUGVyQmxvY2tNYXhDdXJyZW50IhVrZXlFbWlzc2lvblN0YXJ0QmxvY2siG2tleUVtaXNzaW9uRHVyYXRpb25JbkJsb2NrcyITa2V5RW1pc3Npb25FbmRCbG9jayIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIMbHBBc3NldElkU3RyIg5rZXlTdGFrZWRUb3RhbCIQa2V5Q2xhaW1lZEJ5VXNlciIZa2V5Q2xhaW1lZEJ5VXNlck1pblJld2FyZCIba2V5Q2xhaW1lZEJ5VXNlckJvb3N0UmV3YXJkIg9rZXlDbGFpbWVkVG90YWwiCnJlYWRTdGFrZWQiFWtleUxhc3RUb3RhbExwQmFsYW5jZSIJbHBBc3NldElkIhRrZXlMYXN0VXNlckxwQmFsYW5jZSILdXNlckFkZHJlc3MiGWtleVRvdGFsTHBCYWxhbmNlSW50ZWdyYWwiGGtleVVzZXJMcEJhbGFuY2VJbnRlZ3JhbCIma2V5VG90YWxMcEJhbGFuY2VJbnRlZ3JhbExhc3RVcGRIZWlnaHQiJWtleVVzZXJMcEJhbGFuY2VJbnRlZ3JhbExhc3RVcGRIZWlnaHQiEmtleVd4UGVyTHBJbnRlZ3JhbCIfa2V5V3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodCIQa2V5V3hUb0NsYWltVXNlciIja2V5V3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHQiCmtleVd4UGVyTHAiDWtleVd4UGVyTHBYMTgiGmtleVd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0IhlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkIgR0eXBlIgZ0eElkNTgiE2Zvcm1hdEhpc3RvcnlSZWNvcmQiBmFtb3VudCIVT3BlcmF0aW9uSGlzdG9yeUVudHJ5IgR0eElkIg5mYWN0b3J5QWRkcmVzcyIPZmFjdG9yeUNvbnRyYWN0IhBlbWlzc2lvbkNvbnRyYWN0IhBib29zdGluZ0NvbnRyYWN0IgtrZXlOZXh0VXNlciIQZ2V0VXNlcnNMaXN0TmFtZSILa2V5TGlzdEhlYWQiCGxpc3ROYW1lIgtrZXlMaXN0U2l6ZSILa2V5TGlzdFByZXYiAmlkIgtrZXlMaXN0TmV4dCIMY29udGFpbnNOb2RlIgpoZWFkT3JVbml0IgpwcmV2T3JVbml0IgpuZXh0T3JVbml0IhFpbnNlcnROb2RlQWN0aW9ucyIIbGlzdFNpemUiCWNoZWNrTm9kZSIRZGVsZXRlTm9kZUFjdGlvbnMiG2NhbGNXeFBlckxwSW50ZWdyYWxVc2VyTGFzdCIMc3Rha2VkQnlVc2VyIiZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybyISd3hQZXJMcEludGVncmFsTmV3Ihp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdEtFWSIUcmVmcmVzaFBvb2xJTlRFR1JBTFMiDnBvb2xBZGRyZXNzU3RyIg1scERlbHRhQW1vdW50Ig5zdGFrZWRUb3RhbEtFWSILc3Rha2VkVG90YWwiEm5vblplcm9TdGFrZWRUb3RhbCIKcG9vbFdlaWdodCISZW1pc3Npb25TdGFydEJsb2NrIgVNVUxUMyIUd3hFbWlzc2lvblBlckJsb2NrWDMiGHBvb2xXeEVtaXNzaW9uUGVyQmxvY2tYMyISd3hQZXJMcEludGVncmFsS0VZIh93eFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0S0VZIgp3eFBlckxwS0VZIhx3eFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0Ig93eFBlckxwSW50ZWdyYWwiD3d4UGVyTHBPclplcm9YMyICZGgiCXd4UGVyTHBYMyIOc3Rha2VkVG90YWxOZXciFW5vblplcm9TdGFrZWRUb3RhbE5ldyIMd3hQZXJMcFgzTmV3Ih93eFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0TmV3IgVkZWJ1ZyIQcmVmcmVzaElOVEVHUkFMUyINJHQwMTQyNzQxNDM5NiIRcG9vbEludGVncmFsU1RBVEUiCXBvb2xERUJVRyIPc3Rha2VkQnlVc2VyS0VZIhB3eFRvQ2xhaW1Vc2VyS0VZIiN3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodEtFWSINd3hUb0NsYWltVXNlciIXd3hQZXJMcEludGVncmFsVXNlckxhc3QiBk1VTFQxMSIQd3hUb0NsYWltVXNlck5ldyIad3hQZXJMcEludGVncmFsVXNlckxhc3ROZXciI3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0TmV3IhZtYW5hZ2VyUHVibGljS2V5T3JVbml0Ih1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCIVcGVybWlzc2lvbkRlbmllZEVycm9yIghtdXN0VGhpcyIBaSILbXVzdE1hbmFnZXIiAnBrIhFmYWN0b3J5QWRkcmVzc1N0ciILY2hlY2tDYWxsZXIiFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QiBWNoZWtzIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iA3BtdCIJY2FsbGVyU3RyIg0kdDAxODgzMjE4OTQ5Ig1pbnRlZ3JhbFNUQVRFIgtsaXN0QWN0aW9ucyIJcG9vbEFkZG9uIhZjbGFpbWVkQnlVc2VyTWluUmV3YXJkIgtwb29sQWRkcmVzcyIQYXZhaWxhYmxlVG9DbGFpbSIBciIGcmVzdWx0IhBjbGFpbWVkQnlVc2VyS0VZIg9jbGFpbWVkVG90YWxLRVkiGWNsYWltZWRCeVVzZXJNaW5SZXdhcmRLRVkiG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWSINY2xhaW1lZEJ5VXNlciIYY2xhaW1lZEJ5VXNlckJvb3N0UmV3YXJkIgxjbGFpbWVkVG90YWwiDSR0MDIyODE0MjI5MjYiEnd4QW1vdW50Qm9vc3RUb3RhbCINbWluUmV3YXJkUGFydCIPYm9vc3RSZXdhcmRQYXJ0Igl3eEFzc2V0SWQiCWVtaXRCb29zdCISY2xhaW1lZEJ5VXNlclZhbHVlIh5jbGFpbWVkQnlVc2VyTWluUmV3YXJkUGx1c1BhcnQiK2NsYWltZWRCeVVzZXJCb29zdFJld2FyZFBsdXNCb29zdFJld2FyZFBhcnQiIGNsYWltZWRUb3RhbFBsdXNBdmFpbGFibGVUb0NsYWltIgtjdXJyZW50SXRlciIKbHBBc3NldElkcyIGcmVzQWNjIgRpbmZvIgFAIgl1bmNsYWltZWQiB2NsYWltZWQiA3JlcyIDaW52IhJ3eEVtaXNzaW9uUGVyQmxvY2siDHBhc3NlZEJsb2NrcyIOcG9vbFd4RW1pc3Npb24iDHVzZXJXeFJld2FyZCINJHQwMjY1ODQyNjY5NiIOYm9vc3RJbnZSZXN1bHQiCmJvb3N0RGVidWciC3RvdGFsUmV3YXJkIgp1c2VyT3JVbml0IgckbWF0Y2gxIgRoZWFkIg5uZXh0VXNlck9yVW5pdCIIbmV4dFVzZXIiDSR0MDI5MDMyMjkxNDIiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleV4AAWEACAABYgCAwtcvAAFjABIAAWQJALYCAQCAgJC7utat8A0AAWUCAl9fAAFmBQFiAAFnCQC2AgEAAAABaAkAtgIBAAEBAWkBAWoEAWsFAWoDCQABAgUBawIJTGlzdFtBbnldBAFsBQFrBQFsCQACAQIbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQFtAQFqBAFrBQFqAwkAAQIFAWsCA0ludAQBbgUBawUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEBbwEBagQBawUBagMJAAECBQFrAgZTdHJpbmcEAXAFAWsFAXAJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBAXEBAWoEAWsFAWoDCQABAgUBawIKQnl0ZVZlY3RvcgQBcgUBawUBcgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEBcwIBdAF1CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUBdAUBdQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBdQIPIGlzIG5vdCBkZWZpbmVkAQF2AgF0AXUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQF0BQF1CQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUBdAIBLgUBdQIPIGlzIG5vdCBkZWZpbmVkAQF3AgF0AXUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBdAUBdQAAAQF4AwF0AXUBeQkBC3ZhbHVlT3JFbHNlAgkAmggCBQF0BQF1BQF5AQF6AgF0AXUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQF0BQF1CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQF1Ag8gaXMgbm90IGRlZmluZWQBAUECAXQBdQkBBXZhbHVlAQkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFAXQFAXUCATABAUIDAXQBdQF5BAFrCQCdCAIFAXQFAXUDCQABAgUBawIGU3RyaW5nBAFDBQFrCQEFdmFsdWUBCQCoAwEFAUMDCQABAgUBawIEVW5pdAUBeQkAAgECC01hdGNoIGVycm9yAQFEAgFFAUYJALwCAwkAtgIBBQFFBQFkCQC2AgEFAUYBAUcCAWoBSAkAoAMBCQC8AgMFAWoJALYCAQUBSAUBZAEBSQACHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MBAUoAAholc19fdm90aW5nRW1pc3Npb25Db250cmFjdAABSwABAAFMAAIAAU0AAwABTgAEAAFPAAUAAVAABgABUQAHAQFSAAIRJXNfX2ZhY3RvcnlDb25maWcBAVMAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBVQACFyVzX19zdGFibGVQb29sQWRkb25BZGRyAQFWAAINJXNfX2FkZG9uQWRkcgEBVwEBWAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQFYCQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFlAQFZAAIQJXNfX2xwVG9rZW5zTGlzdAEBWgEBWAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQFYCQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFlAQJhYQECYWIJALkJAgkAzAgCAgQlcyVzCQDMCAICCnBvb2xXZWlnaHQJAMwIAgUCYWIFA25pbAUBZQECYWMBAmFkCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUCYWQJAQFZAAIABQFlAQJhZQECYWQJALUJAgkBAXYCBQJhZAkBAVIABQFlAQJhZgECYWcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWcFAUwBAmFoAQJhZwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhZwUBTwECYWkBAmFnCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFnBQFLAQJhagACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAECYWsAAh4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAmFsAAIaJXMlc19fZW1pc3Npb25fX3N0YXJ0QmxvY2sBAmFtAAIYJXMlc19fZW1pc3Npb25fX2R1cmF0aW9uAQJhbgACGCVzJXNfX2VtaXNzaW9uX19lbmRCbG9jawECYW8CAmFwAmFxCQC5CQIJAMwIAgIOJXMlcyVzX19zdGFrZWQJAMwIAgUCYXAJAMwIAgUCYXEFA25pbAUBZQECYXIBAmFxCQCsAgICFyVzJXMlc19fc3Rha2VkX190b3RhbF9fBQJhcQECYXMCAmFxAmFwCQC5CQIJAMwIAgIPJXMlcyVzX19jbGFpbWVkCQDMCAIFAmFwCQDMCAIFAmFxBQNuaWwFAWUBAmF0AgJhcQJhcAkAuQkCCQDMCAICGCVzJXMlc19fY2xhaW1lZE1pblJld2FyZAkAzAgCBQJhcAkAzAgCBQJhcQUDbmlsBQFlAQJhdQICYXECYXAJALkJAgkAzAgCAholcyVzJXNfX2NsYWltZWRCb29zdFJld2FyZAkAzAgCBQJhcAkAzAgCBQJhcQUDbmlsBQFlAQJhdgECYXEJALkJAgkAzAgCAhYlcyVzJXNfX2NsYWltZWRfX3RvdGFsCQDMCAIFAmFxBQNuaWwFAWUBAmF3AQF1CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAXUAAAECYXgBAmF5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAmF5CQDMCAICBXRvdGFsCQDMCAICA2JhbAUDbmlsBQFlAQJhegICYXkCYUEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYXkJAMwIAgUCYUEJAMwIAgIDYmFsBQNuaWwFAWUBAmFCAQJheQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJheQkAzAgCAgV0b3RhbAkAzAgCAgZiYWxJTlQFA25pbAUBZQECYUMCAmF5AmFBCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAmF5CQDMCAIFAmFBCQDMCAICBmJhbElOVAUDbmlsBQFlAQJhRAECYXkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYXkJAMwIAgIFdG90YWwJAMwIAgIHbGFzdFVwZAUDbmlsBQFlAQJhRQICYXkCYUEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYXkJAMwIAgUCYUEJAMwIAgIHbGFzdFVwZAUDbmlsBQFlAQJhRgECYXkJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJheQkAzAgCAgZjb21tb24JAMwIAgIFbHBJbnQFA25pbAUBZQECYUcBAmF5CQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgUCYXkJAMwIAgIGY29tbW9uCQDMCAICBmxwSW50SAUDbmlsBQFlAQJhSAICYXkCYUEJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJheQkAzAgCBQJhQQkAzAgCAgVscEludAUDbmlsBQFlAQJhSQICYXkCYUEJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJheQkAzAgCBQJhQQkAzAgCAgZscEludEgFA25pbAUBZQECYUoBAmF5CQC5CQIJAMwIAgICJXMJAMwIAgUCYXkJAMwIAgIHd3hQZXJMcAUDbmlsBQFlAQJhSwECYXkJALkJAgkAzAgCAgIlcwkAzAgCBQJheQkAzAgCAgp3eFBlckxwWDE4BQNuaWwFAWUBAmFMAgJheQJhQQkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmF5CQDMCAIFAmFBCQDMCAICBXVJbnRMBQNuaWwFAWUBAmFNAwJhTgJhQQJhTwkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFOCQDMCAIFAmFBCQDMCAIFAmFPBQNuaWwFAWUBAmFQBAJhQQJheQJhTgJhUQkAuQkCCQDMCAICDCVzJXMlcyVkJWQlZAkAzAgCBQJhQQkAzAgCBQJheQkAzAgCBQJhTgkAzAgCCQCkAwEFBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYVEFA25pbAUBZQECYVIFAmFOAmFBAmF5AmFRAmFTCQELU3RyaW5nRW50cnkCCQECYU0DBQJhTgUCYUEJANgEAQUCYVMJAQJhUAQFAmFBBQJheQUCYU4FAmFRAAJhVAkBAXMCBQR0aGlzCQEBSQAAAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBBQJhVAACYWcJAQJhZQEFAmFVAAJhVgkBAmFoAQUCYWcAAmFXCQECYWYBBQJhZwECYVgBAmF5CQC5CQIJAMwIAgIEJXMlcwkAzAgCBQJheQkAzAgCAghuZXh0VXNlcgUDbmlsBQFlAQJhWQECYXkJALkJAgkAzAgCAgV1c2VycwkAzAgCBQJheQUDbmlsBQFlAQJhWgECYmEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYmEJAMwIAgIEaGVhZAUDbmlsBQFlAQJiYgECYmEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYmEJAMwIAgIEc2l6ZQUDbmlsBQFlAQJiYwICYmECYmQJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJiYQkAzAgCBQJiZAkAzAgCAgRwcmV2BQNuaWwFAWUBAmJlAgJiYQJiZAkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmJhCQDMCAIFAmJkCQDMCAICBG5leHQFA25pbAUBZQECYmYCAmJhAmJkBAJiZwkAnQgCBQR0aGlzCQECYVoBBQJiYQQCYmgJAJ0IAgUEdGhpcwkBAmJjAgUCYmEFAmJkBAJiaQkAnQgCBQR0aGlzCQECYmUCBQJiYQUCYmQDAwkAAAIFAmJkCQELdmFsdWVPckVsc2UCBQJiZwIABgkBAiE9AgUCYmgFBHVuaXQGCQECIT0CBQJiaQUEdW5pdAECYmoCAmJhAmJkBAJiZwkAnQgCBQR0aGlzCQECYVoBBQJiYQQCYmsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmJiAQUCYmEAAAQCYmwDCQEBIQEJAQJiZgIFAmJhBQJiZAYJAAIBAgtOb2RlIGV4aXN0cwMJAAACBQJibAUCYmwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmIBBQJiYQkAZAIFAmJrAAEFA25pbAMJAQIhPQIFAmJnBQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJiZQIFAmJhBQJiZAkBBXZhbHVlAQUCYmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJjAgUCYmEJAQV2YWx1ZQEFAmJnBQJiZAUDbmlsBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFaAQUCYmEFAmJkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJtAgJiYQJiZAQCYmcJAJ0IAgUEdGhpcwkBAmFaAQUCYmEEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJiYgEFAmJhAAAEAmJoCQCdCAIFBHRoaXMJAQJiYwIFAmJhBQJiZAQCYmkJAJ0IAgUEdGhpcwkBAmJlAgUCYmEFAmJkCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJiYgEFAmJhCQBlAgUCYmsAAQUDbmlsAwMJAQIhPQIFAmJoBQR1bml0CQECIT0CBQJiaQUEdW5pdAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJlAgUCYmEJAQV2YWx1ZQEFAmJoCQEFdmFsdWUBBQJiaQkAzAgCCQELU3RyaW5nRW50cnkCCQECYmMCBQJiYQkBBXZhbHVlAQUCYmkJAQV2YWx1ZQEFAmJoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJiYwIFAmJhBQJiZAkAzAgCCQELRGVsZXRlRW50cnkBCQECYmUCBQJiYQUCYmQFA25pbAMJAQIhPQIFAmJpBQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhWgEFAmJhCQEFdmFsdWUBBQJiaQkAzAgCCQELRGVsZXRlRW50cnkBCQECYmUCBQJiYQUCYmQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJjAgUCYmEJAQV2YWx1ZQEFAmJpBQNuaWwDCQECIT0CBQJiaAUEdW5pdAkAzAgCCQELRGVsZXRlRW50cnkBCQECYmMCBQJiYQUCYmQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJlAgUCYmEJAQV2YWx1ZQEFAmJoBQNuaWwDCQAAAgUCYmQJAQt2YWx1ZU9yRWxzZQIFAmJnAgAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFaAQUCYmEFA25pbAkAAgEJAKwCAgkArAICCQCsAgICDmludmFsaWQgbm9kZTogBQJiYQIBLgUCYmQBAmJuBAJibwJicAJicQJicgMDCQAAAgUCYnAFAWcJAL8CAgUCYm8FAWcHBQFnAwkAAAIFAmJvBQFnBQJicQMDCQC/AgIFAmJwBQFnCQC/AgIFAmJvBQFnBwkBBXZhbHVlAQkAqAMBCQEBcwIFBHRoaXMFAmJyCQACAQItY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0OiB1bmV4cGVjdGVkIHN0YXRlAQJicwMCYXECYnQCYnUEAmJ2CQECYXIBBQJhcQQCYncJALYCAQkBAmF3AQUCYnYEAmJ4AwkAAAIFAmJ3BQFnBQFoBQJidwQCYnkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAmFVCQECYWEBBQJidAQCYnoJAQF6AgUCYVYJAQJhbAAEAmJBAOgHBAJiQgkAaAIJAQF6AgUCYVYJAQJhagAFAmJBBAJiQwkAawMFAmJCBQJieQkAaAIFAWYAAwQCYkQJAQJhRgEFAmFxBAJiRQkBAmFHAQUCYXEEAmJGCQECYUoBBQJhcQQCYkcJAQF4AwUEdGhpcwUCYkUFAmJ6BAJiSAkBAUECBQR0aGlzBQJiRAQCYkkAAAQCYkoJAJYDAQkAzAgCCQBlAgUGaGVpZ2h0BQJiRwkAzAgCAAAFA25pbAQCYksDCQECIT0CBQJiSQAACQC2AgEFAmJJCQC8AgMJALYCAQUCYkMJALYCAQUBYgUCYngEAmJMCQC3AgIFAmJ3CQC2AgEFAmJ1BAJiTQMJAAACBQJiTAUBZwUBaAUCYkwEAmJxCQC3AgIFAmJICQC5AgIFAmJLCQC2AgEFAmJKBAJiTgkAugICCQC2AgEFAmJDBQJiTQQCYk8FBmhlaWdodAQCYlAJALkJAgkAzAgCCQCmAwEFAmJxCQDMCAIJAKQDAQUCYkoJAMwIAgkApgMBBQJiSwkAzAgCCQCmAwEFAmJ3CQDMCAIJAKQDAQUCYkMJAMwIAgkApAMBBQJiQgkAzAgCCQCkAwEFAmJ5BQNuaWwCAjo6CQCVCgMFAmJxCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmJECQCmAwEFAmJxCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiRQUCYk8JAMwIAgkBC1N0cmluZ0VudHJ5AgUCYkYJAKYDAQUCYk4FA25pbAUCYlABAmJRBAJhcQJhcAJidAJidQQCYlIJAQJicwMFAmFxBQJidAUCYnUEAmJxCAUCYlICXzEEAmJTCAUCYlICXzIEAmJUCAUCYlICXzMEAmJBAOgHBAJiVQkBAmFvAgUCYXAFAmFxBAJibwkBAmF3AQUCYlUEAmJWCQECYUgCBQJhcQUCYXAEAmJXCQECYUkCBQJhcQUCYXAEAmJyCQECYUwCBQJhcQUCYXAEAmJYCQEBQQIFBHRoaXMFAmJWBAJicAkBAXcCBQR0aGlzBQJiVwQCYlkJAQJibgQJALYCAQUCYm8JALYCAQUCYnAFAmJxBQJicgQCYloJAGgCBQFiBQJiQQQCY2EJAJgDAQkAzAgCCQC3AgIFAmJYCQC8AgMJALgCAgUCYnEFAmJZCQC2AgEFAmJvCQC2AgEFAmJaCQDMCAIFAWcFA25pbAQCY2IFAmJxBAJjYwUGaGVpZ2h0BAJiUAkAuQkCCQDMCAIJAKYDAQUCYlgJAMwIAgkApgMBBQJiWQkAzAgCCQCkAwEFAmJvCQDMCAIFAmJUCQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAjo6CQCVCgMFAmNhCQDOCAIFAmJTCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmJWCQCmAwEFAmNhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiVwUCY2MJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYnIJAKYDAQUCY2IFA25pbAUCYlABAmNkAAQBawkAoggBCQEBUwADCQABAgUBawIGU3RyaW5nBAFDBQFrCQDZBAEFAUMDCQABAgUBawIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJjZQAEAWsJAKIIAQkBAVQAAwkAAQIFAWsCBlN0cmluZwQBQwUBawkA2QQBBQFDAwkAAQIFAWsCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACY2YJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECY2cBAmNoAwkAAAIIBQJjaAZjYWxsZXIFBHRoaXMGBQJjZgECY2kBAmNoBAFrCQECY2QAAwkAAQIFAWsCCkJ5dGVWZWN0b3IEAmNqBQFrAwkAAAIIBQJjaA9jYWxsZXJQdWJsaWNLZXkFAmNqBgUCY2YDCQABAgUBawIEVW5pdAMJAAACCAUCY2gGY2FsbGVyBQR0aGlzBgUCY2YJAAIBAgtNYXRjaCBlcnJvcg0CY2gBC2NvbnN0cnVjdG9yAQJjawQCY2wJAQJjaQEFAmNoAwkAAAIFAmNsBQJjbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBSQAFAmNrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2gBDWNvbnN0cnVjdG9yVjIBAmNtBAJjbgkAzAgCCQECY2kBBQJjaAkAzAgCAwkBAiE9AgkApggBBQJjbQUEdW5pdAYCKGludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MFA25pbAMJAAACBQJjbgUCY24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUoABQJjbQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNoAQpzZXRNYW5hZ2VyAQJjbwQCY2wJAQJjaQEFAmNoAwkAAAIFAmNsBQJjbAQCY3AJANkEAQUCY28DCQAAAgUCY3AFAmNwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUCY28FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjaAEOY29uZmlybU1hbmFnZXIABAJjcQkBAmNlAAQCY3IDCQEJaXNEZWZpbmVkAQUCY3EGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmNyBQJjcgQCY3MDCQAAAggFAmNoD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCY3EGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmNzBQJjcwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwAJANgEAQkBBXZhbHVlAQUCY3EJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2gBBXN0YWtlAAMJAQIhPQIJAJADAQgFAmNoCHBheW1lbnRzAAEJAAIBAjRpbnZhbGlkIHBheW1lbnQgLSBleGFjdCBvbmUgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAJjdAkAkQMCCAUCY2gIcGF5bWVudHMAAAQCYXkJAQV2YWx1ZQEIBQJjdAdhc3NldElkBAJhcQkA2AQBBQJheQQCYVEIBQJjdAZhbW91bnQEAmJ0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYVUJAQFXAQUCYXEJAKwCAgIVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJhcQQCY3UJAKUIAQgFAmNoBmNhbGxlcgQCYXADCQAAAgUCY3UFAmJ0CQClCAEIBQJjaAxvcmlnaW5DYWxsZXIFAmN1BAJiVQkBAmFvAgUCYXAFAmFxBAJidgkBAmFyAQUCYXEEAmJvCQECYXcBBQJiVQQCYncJAQJhdwEFAmJ2BAJjdgkBAmJRBAUCYXEFAmFwBQJidAUCYVEEAmNhCAUCY3YCXzEEAmN3CAUCY3YCXzIEAmJQCAUCY3YCXzMEAmJhCQECYVkBBQJhcQQCY3gDCQECYmYCBQJiYQUCYXAFA25pbAkBAmJqAgUCYmEFAmFwCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYlUJAGQCBQJibwUCYVEJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJ2CQBkAgUCYncFAmFRCQDMCAIJAQJhUgUCBXN0YWtlBQJhcAUCYXEFAmFRCAUCY2gNdHJhbnNhY3Rpb25JZAUDbmlsBQJjdwUCY3gCY2gBB3Vuc3Rha2UCAmFxAmFRBAJheQkA2QQBBQJhcQQCYnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhVQkBAVcBBQJhcQkArAICAhV1bnN1cHBvcnRlZCBscCBhc3NldCAFAmFxBAJjeQkBC3ZhbHVlT3JFbHNlAgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQJidAkBAVYABQJidAQCY3UJAKUIAQgFAmNoBmNhbGxlcgQCYXADAwkAAAIFAmN1BQJidAYJAAACBQJjdQUCY3kJAKUIAQgFAmNoDG9yaWdpbkNhbGxlcgUCY3UEAmJVCQECYW8CBQJhcAUCYXEEAmJ2CQECYXIBBQJhcQQCYm8JAQJhdwEFAmJVBAJidwkBAmF3AQUCYnYEAmN3CAkBAmJRBAUCYXEFAmFwBQJidAkBAS0BBQJhUQJfMgQCYmEJAQJhWQEFAmFxBAJjeAMDCQECYmYCBQJiYQUCYXAJAAACBQJhUQUCYm8HCQECYm0CBQJiYQUCYXAFA25pbAQCY3oJAQFBAgUEdGhpcwkBAmF0AgUCYXEFAmFwBAJjQQkBAXYCBQJhVQkBAVoBBQJhcQQCY2EICQECYlEEBQJhcQUCYXAFAmNBAAACXzEEAmNCCQC4AgIFAmNhBQJjegQCY0MDCQC/AgIFAmNCBQFnCQD8BwQFBHRoaXMCD2NsYWltV3hJTlRFUk5BTAkAzAgCBQJhcQkAzAgCBQJhcAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0MFAmNDAwkAZgIFAmFRBQJibwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOcGFzc2VkIGFtb3VudD0JAKQDAQUCYVECGyBpcyBncmVhdGVyIHRoYW4gYXZhaWxhYmxlPQkApAMBBQJibwIMLiBscEFzc2V0SWQ9BQJhcQISLiBzdGFrZWRCeVVzZXJLRVk9BQJiVQkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJVCQBlAgUCYm8FAmFRCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJidgkAZQIFAmJ3BQJhUQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCY2gGY2FsbGVyBQJhUQUCYXkJAMwIAgkBAmFSBQIHdW5zdGFrZQUCYXAFAmFxBQJhUQgFAmNoDXRyYW5zYWN0aW9uSWQFA25pbAUCY3cFAmN4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNoAQdjbGFpbVd4AQJhcQQCYXAJAKUIAQgFAmNoBmNhbGxlcgQCY0QJAPwHBAUEdGhpcwIPY2xhaW1XeElOVEVSTkFMCQDMCAIFAmFxCQDMCAIFAmFwBQNuaWwFA25pbAkAlAoCBQNuaWwFAmNEAmNoAQ9jbGFpbVd4SU5URVJOQUwCAmFxAmFwBAJjbAkBAmNnAQUCY2gDCQAAAgUCY2wFAmNsBAJhQQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAmFwAiVjbGFpbVd4SU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzBAJidAkBAXYCBQJhVQkBAVoBBQJhcQQCY0UJAQJhcwIFAmFxBQJhcAQCY0YJAQJhdgEFAmFxBAJjRwkBAmF0AgUCYXEFAmFwBAJjSAkBAmF1AgUCYXEFAmFwBAJjSQkBAUECBQR0aGlzBQJjRQQCY3oJAQFBAgUEdGhpcwUCY0cEAmNKCQEBQQIFBHRoaXMFAmNIBAJjSwkBAUECBQR0aGlzBQJjRgQCY0wJAQJiUQQFAmFxBQJhcAUCYnQAAAQCY2EIBQJjTAJfMQQCY3cIBQJjTAJfMgQCYlAIBQJjTAJfMwQCY0IJAJgDAQkAzAgCCQC4AgIFAmNhBQJjegkAzAgCBQFnBQNuaWwDCQDAAgIFAWcFAmNCCQACAQIQbm90aGluZyB0byBjbGFpbQQCY00JAJYDAQkAzAgCCQEBbQEJAJEDAgkBAWkBCQD8BwQFAmFXAgxjbGFpbVd4Qm9vc3QJAMwIAgUCYXEJAMwIAgUCYXAFA25pbAUDbmlsAAAJAMwIAgAABQNuaWwEAmNOBQJjQgQCY08JAJkDAQkAzAgCCQC5AgIFAmNOCQC2AgEAAgkAzAgCCQC2AgEFAmNNBQNuaWwEAmNQCQEBcQEJAJEDAgkBAWkBCQD8BwQFAmFWAgRlbWl0CQDMCAIJAKADAQUCY04FA25pbAUDbmlsAAAEAmNRCQEBaQEJAPwHBAUCYVYCBGVtaXQJAMwIAgkAoAMBBQJjTwUDbmlsBQNuaWwDCQAAAgUCY1EFAmNRBAJjUgkAtwICCQC3AgIFAmNJBQJjTgUCY08EAmNTCQC3AgIFAmN6BQJjTgQCY1QJALcCAgUCY0oFAmNPBAJjVQkAtwICBQJjSwUCY0IJAMwIAgkBC1N0cmluZ0VudHJ5AgUCY0UJAKYDAQUCY1IJAMwIAgkBC1N0cmluZ0VudHJ5AgUCY0cJAKYDAQUCY1MJAMwIAgkBC1N0cmluZ0VudHJ5AgUCY0gJAKYDAQUCY1QJAMwIAgkBC1N0cmluZ0VudHJ5AgUCY0YJAKYDAQUCY1UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUEJAKADAQUCY04FAmNQCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFBCQCgAwEFAmNPBQJjUAkAzAgCCQECYVIFAgVjbGFpbQUCYXAFAmFxCQCgAwEFAmNCCAUCY2gNdHJhbnNhY3Rpb25JZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNoARtjbGFpbVd4QnVsa0ludGVybmFsUkVBRE9OTFkEAmNWAmNXAmFwAmNYAwkAAAIFAmNWCQCQAwEFAmNXCQCUCgIFA25pbAUCY1gEAmF5CQCRAwIFAmNXBQJjVgQCY1kJALUJAgoAAmNaCQD8BwQFBHRoaXMCD2NsYWltV3hSRUFET05MWQkAzAgCBQJheQkAzAgCBQJhcAUDbmlsBQNuaWwDCQABAgUCY1oCBlN0cmluZwUCY1oJAAIBCQCsAgIJAAMBBQJjWgIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nBQFlBAJkYQkAkQMCBQJjWQADBAJkYgkAkQMCBQJjWQAEBAJkYwkAzQgCBQJjWAkAuQkCCQDMCAICBCVkJWQJAMwIAgUCZGEJAMwIAgUCZGIFA25pbAUBZQQCZGQKAAJjWgkA/AcEBQR0aGlzAhtjbGFpbVd4QnVsa0ludGVybmFsUkVBRE9OTFkJAMwIAgkAZAIFAmNWAAEJAMwIAgUCY1cJAMwIAgUCYXAJAMwIAgUCZGMFA25pbAUDbmlsAwkAAQIFAmNaAglMaXN0W0FueV0FAmNaCQACAQkArAICCQADAQUCY1oCHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQJkZAUCZGQJAJQKAgUDbmlsBQJkZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjaAETY2xhaW1XeEJ1bGtSRUFET05MWQICY1cCYXAEAmRjCQD8BwQFBHRoaXMCG2NsYWltV3hCdWxrSW50ZXJuYWxSRUFET05MWQkAzAgCAAAJAMwIAgUCY1cJAMwIAgUCYXAJAMwIAgUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFAmRjAmNoAQ9jbGFpbVd4UkVBRE9OTFkCAmFxAmFwBAJiVQkBAmFvAgUCYXAFAmFxBAJidgkBAmFyAQUCYXEEAmNFCQECYXMCBQJhcQUCYXAEAmNHCQECYXQCBQJhcQUCYXAEAmJvCQECYXcBBQJiVQQCYncJAQJhdwEFAmJ2BAJjSQkBAUECBQR0aGlzBQJjRQQCY3oJAQFBAgUEdGhpcwUCY0cEAmJ0CQEBdgIFAmFVCQEBWgEFAmFxBAJieQkBEUBleHRyTmF0aXZlKDEwNTApAgUCYVUJAQJhYQEFAmJ0BAJkZQkBAXoCBQJhVgkBAmFqAAQCYnoJAQF6AgUCYVYJAQJhbAAEAmRmAwkAZgIFAmJ6BQZoZWlnaHQAAAkAZQIFBmhlaWdodAUCYnoEAmRnCQBrAwkAaAIFAmRlBQJkZgUCYnkFAWYEAmRoCQBrAwUCZGcFAmJvBQJidwQCZGkJAQJiUQQFAmFxBQJhcAUCYnQAAAQCY2EIBQJkaQJfMQQCY3cIBQJkaQJfMgQCYlAIBQJkaQJfMwQCY0IJAJgDAQkAzAgCCQC4AgIFAmNhBQJjegkAzAgCBQFnBQNuaWwEAmRqCQEBaQEJAPwHBAUCYVcCFGNsYWltV3hCb29zdFJFQURPTkxZCQDMCAIFAmFxCQDMCAIFAmFwBQNuaWwFA25pbAQCY00JAJYDAQkAzAgCCQEBbQEJAJEDAgUCZGoAAAkAzAgCAAAFA25pbAQCZGsJAQFvAQkAkQMCBQJkagABBAJjTgUCY0IEAmNPCQCZAwEJAMwIAgkAuQICBQJjTgkAtgIBAAIJAMwIAgkAtgIBBQJjTQUDbmlsBAJkbAkAtwICBQJjTgUCY08JAJQKAgUDbmlsCQC5CQIJAMwIAgIOJXMlcyVkJWQlZCVkJXMJAMwIAgUCYXEJAMwIAgUCYXAJAMwIAgkApgMBBQJkbAkAzAgCCQCmAwEFAmNJCQDMCAIJAKYDAQUCY04JAMwIAgkApgMBBQJjTwkAzAgCAgRzb29uBQNuaWwFAWUCY2gBEnVzZXJzTGlzdFRyYXZlcnNhbAECYXkEAmNsAwkAAAIJANgEAQgIBQJjaAZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAUoAAgAGCQECY2kBBQJjaAMJAAACBQJjbAUCY2wEAmJhCQECYVkBBQJheQQCZG0JAKIIAQkBAmFYAQUCYXkEAmJnCQCiCAEJAQJhWgEFAmJhBAFrBQJkbQMJAAECBQFrAgRVbml0BAJkbgUCYmcDCQABAgUCZG4CBFVuaXQJAJQKAgUDbmlsBwMJAAECBQJkbgIGU3RyaW5nBAJkbwUCZG4JAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYVgBBQJheQUCZG8FA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQFrAgZTdHJpbmcEAmFBBQFrBAJjegkBAUECBQR0aGlzCQECYXQCBQJheQUCYUEEAmNBCQEBdgIFAmFVCQEBWgEFAmF5BAJjYQgJAQJiUQQFAmF5BQJhQQUCY0EAAAJfMQQCY0IJALgCAgUCY2EFAmN6BAJjQwMJAL8CAgUCY0IFAWcJAPwHBAUEdGhpcwIPY2xhaW1XeElOVEVSTkFMCQDMCAIFAmF5CQDMCAIFAmFBBQNuaWwFA25pbAUEdW5pdAMJAAACBQJjQwUCY0MEAmRwCQCiCAEJAQJiZQIFAmJhBQJhQQQCZG4FAmRwAwkAAQIFAmRuAgRVbml0CQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFYAQUCYXkFA25pbAcDCQABAgUCZG4CBlN0cmluZwQCZHEFAmRuCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFYAQUCYXkFAmRxBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjaAEOb25Nb2RpZnlXZWlnaHQCAmFxAmJ0AwkBAiE9AggFAmNoBmNhbGxlcgUCYVUJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQEAmRyCQECYnMDBQJhcQUCYnQAAAQCYnEIBQJkcgJfMQQCYlMIBQJkcgJfMgQCYlQIBQJkcgJfMwUCYlMBAmRzAQJkdAAEAmR1BAFrCQECY2QAAwkAAQIFAWsCCkJ5dGVWZWN0b3IEAmNqBQFrBQJjagMJAAECBQFrAgRVbml0CAUCZHMPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmRzCWJvZHlCeXRlcwkAkQMCCAUCZHMGcHJvb2ZzAAAFAmR1A+fPaQ==", "height": 2458061, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8dMp5q27sxPWtZj45NVoi6oMM7AyYhFGxFUjV6Z5NrPU Next: DMr3w4gLRW7PWbGNe9MHbhDbzdC7Gq3HJgk6pGVxANcS Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
5-
6-let MULT3 = 1000
75
86 let MULT8 = 100000000
97
241239
242240 let boostingContract = getBoostingAddressOrFail(factoryCfg)
243241
244-let boostCoeff = {
245- let @ = invoke(emissionContract, "getBoostCoeffREADONLY", nil, nil)
246- if ($isInstanceOf(@, "Int"))
247- then @
248- else throw(($getType(@) + " couldn't be cast to Int"))
249- }
250-
251242 func keyNextUser (lpAssetId) = makeString(["%s%s", lpAssetId, "nextUser"], SEP)
252243
253244
332323 else stakedTotal
333324 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
334325 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
326+ let MULT3 = 1000
335327 let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
336- let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * boostCoeff))
328+ let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
337329 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
338330 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
339331 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
357349
358350
359351 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
360- let $t01428614408 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
361- let wxPerLpIntegralNew = $t01428614408._1
362- let poolIntegralSTATE = $t01428614408._2
363- let poolDEBUG = $t01428614408._3
352+ let $t01427414396 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
353+ let wxPerLpIntegralNew = $t01427414396._1
354+ let poolIntegralSTATE = $t01427414396._2
355+ let poolDEBUG = $t01427414396._3
356+ let MULT3 = 1000
364357 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
365358 let stakedByUser = readStaked(stakedByUserKEY)
366359 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
493486 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
494487 let stakedByUser = readStaked(stakedByUserKEY)
495488 let stakedTotal = readStaked(stakedTotalKEY)
496- let $t01882518942 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
497- let wxToClaimUserNew = $t01882518942._1
498- let integralSTATE = $t01882518942._2
499- let debug = $t01882518942._3
489+ let $t01883218949 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
490+ let wxToClaimUserNew = $t01883218949._1
491+ let integralSTATE = $t01883218949._2
492+ let debug = $t01883218949._3
500493 let listName = getUsersListName(lpAssetIdStr)
501494 let listActions = if (containsNode(listName, userAddressStr))
502495 then nil
568561 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
569562 let claimedByUserBoostReward = getBigIntFromStringOrZero(this, claimedByUserBoostRewardKEY)
570563 let claimedTotal = getBigIntFromStringOrZero(this, claimedTotalKEY)
571- let $t02280722919 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
572- let wxToClaimUserNew = $t02280722919._1
573- let integralSTATE = $t02280722919._2
574- let debug = $t02280722919._3
564+ let $t02281422926 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
565+ let wxToClaimUserNew = $t02281422926._1
566+ let integralSTATE = $t02281422926._2
567+ let debug = $t02281422926._3
575568 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
576569 if ((zeroBigInt >= availableToClaim))
577570 then throw("nothing to claim")
578571 else {
579572 let wxAmountBoostTotal = max([asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [lpAssetIdStr, userAddressStr], nil))[0]), 0])
580573 let minRewardPart = availableToClaim
581- let boostRewardPart = min([(minRewardPart * toBigInt((boostCoeff - 1))), toBigInt(wxAmountBoostTotal)])
574+ let boostRewardPart = min([(minRewardPart * toBigInt(2)), toBigInt(wxAmountBoostTotal)])
582575 let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [toInt(minRewardPart)], nil))[0])
583576 let emitBoost = asAnyList(invoke(emissionContract, "emit", [toInt(boostRewardPart)], nil))
584577 if ((emitBoost == emitBoost))
651644 else (height - emissionStartBlock)
652645 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
653646 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
654- let $t02659226704 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
655- let wxToClaimUserNew = $t02659226704._1
656- let integralSTATE = $t02659226704._2
657- let debug = $t02659226704._3
647+ let $t02658426696 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
648+ let wxToClaimUserNew = $t02658426696._1
649+ let integralSTATE = $t02658426696._2
650+ let debug = $t02658426696._3
658651 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
659652 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
660653 let wxAmountBoostTotal = max([asInt(boostInvResult[0]), 0])
661654 let boostDebug = asString(boostInvResult[1])
662655 let minRewardPart = availableToClaim
663- let boostRewardPart = min([(minRewardPart * toBigInt((boostCoeff - 1))), toBigInt(wxAmountBoostTotal)])
656+ let boostRewardPart = min([(minRewardPart * toBigInt(2)), toBigInt(wxAmountBoostTotal)])
664657 let totalReward = (minRewardPart + boostRewardPart)
665658 $Tuple2(nil, makeString(["%s%s%d%d%d%d%s", lpAssetIdStr, userAddressStr, toString(totalReward), toString(claimedByUser), toString(minRewardPart), toString(boostRewardPart), "soon"], SEP))
666659 }
721714 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
722715 then throw("permissions denied")
723716 else {
724- let $t02905529165 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
725- let wxPerLpIntegralNew = $t02905529165._1
726- let poolIntegralSTATE = $t02905529165._2
727- let poolDEBUG = $t02905529165._3
717+ let $t02903229142 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
718+ let wxPerLpIntegralNew = $t02903229142._1
719+ let poolIntegralSTATE = $t02903229142._2
720+ let poolDEBUG = $t02903229142._3
728721 poolIntegralSTATE
729722 }
730723
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
5-
6-let MULT3 = 1000
75
86 let MULT8 = 100000000
97
108 let SCALE18 = 18
119
1210 let MULT18 = toBigInt(1000000000000000000)
1311
1412 let SEP = "__"
1513
1614 let POOLWEIGHTMULT = MULT8
1715
1816 let zeroBigInt = toBigInt(0)
1917
2018 let oneBigInt = toBigInt(1)
2119
2220 func asAnyList (val) = match val {
2321 case valAnyLyst: List[Any] =>
2422 valAnyLyst
2523 case _ =>
2624 throw("fail to cast into List[Any]")
2725 }
2826
2927
3028 func asInt (val) = match val {
3129 case valInt: Int =>
3230 valInt
3331 case _ =>
3432 throw("fail to cast into Int")
3533 }
3634
3735
3836 func asString (val) = match val {
3937 case valStr: String =>
4038 valStr
4139 case _ =>
4240 throw("fail to cast into Int")
4341 }
4442
4543
4644 func asByteVector (val) = match val {
4745 case valBin: ByteVector =>
4846 valBin
4947 case _ =>
5048 throw("fail to cast into Int")
5149 }
5250
5351
5452 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
5553
5654
5755 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
5856
5957
6058 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
6159
6260
6361 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
6462
6563
6664 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
6765
6866
6967 func getBigIntFromStringOrZero (address,key) = value(parseBigInt(valueOrElse(getString(address, key), "0")))
7068
7169
7270 func getBigIntFromStringOrDefault (address,key,defaultVal) = match getString(address, key) {
7371 case s: String =>
7472 value(parseBigInt(s))
7573 case _: Unit =>
7674 defaultVal
7775 case _ =>
7876 throw("Match error")
7977 }
8078
8179
8280 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
8381
8482
8583 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
8684
8785
8886 func keyFactoryAddress () = "%s%s__config__factoryAddress"
8987
9088
9189 func keyVotingEmissionContract () = "%s__votingEmissionContract"
9290
9391
9492 let IdxFactoryCfgStakingDapp = 1
9593
9694 let IdxFactoryCfgBoostingDapp = 2
9795
9896 let IdxFactoryCfgIdoDapp = 3
9997
10098 let IdxFactoryCfgTeamDapp = 4
10199
102100 let IdxFactoryCfgEmissionDapp = 5
103101
104102 let IdxFactoryCfgRestDapp = 6
105103
106104 let IdxFactoryCfgSlippageDapp = 7
107105
108106 func keyFactoryCfg () = "%s__factoryConfig"
109107
110108
111109 func keyManagerPublicKey () = "%s__managerPublicKey"
112110
113111
114112 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
115113
116114
117115 func keyStablePoolAddonAddr () = "%s__stablePoolAddonAddr"
118116
119117
120118 func keyAddonAddr () = "%s__addonAddr"
121119
122120
123121 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
124122
125123
126124 func keyFactoryLpList () = "%s__lpTokensList"
127125
128126
129127 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
130128
131129
132130 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
133131
134132
135133 func readLpList (factory) = split(valueOrElse(getString(factory, keyFactoryLpList()), ""), SEP)
136134
137135
138136 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
139137
140138
141139 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
142140
143141
144142 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
145143
146144
147145 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
148146
149147
150148 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
151149
152150
153151 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
154152
155153
156154 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
157155
158156
159157 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
160158
161159
162160 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
163161
164162
165163 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
166164
167165
168166 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
169167
170168
171169 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
172170
173171
174172 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
175173
176174
177175 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
178176
179177
180178 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed__total", lpAssetIdStr], SEP)
181179
182180
183181 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
184182
185183
186184 func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
187185
188186
189187 func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
190188
191189
192190 func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
193191
194192
195193 func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
196194
197195
198196 func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
199197
200198
201199 func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
202200
203201
204202 func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
205203
206204
207205 func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
208206
209207
210208 func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
211209
212210
213211 func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
214212
215213
216214 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
217215
218216
219217 func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
220218
221219
222220 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
223221
224222
225223 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
226224
227225
228226 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
229227
230228
231229 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
232230
233231
234232 let factoryAddress = getStringOrFail(this, keyFactoryAddress())
235233
236234 let factoryContract = addressFromStringValue(factoryAddress)
237235
238236 let factoryCfg = readFactoryCfgOrFail(factoryContract)
239237
240238 let emissionContract = getEmissionAddressOrFail(factoryCfg)
241239
242240 let boostingContract = getBoostingAddressOrFail(factoryCfg)
243241
244-let boostCoeff = {
245- let @ = invoke(emissionContract, "getBoostCoeffREADONLY", nil, nil)
246- if ($isInstanceOf(@, "Int"))
247- then @
248- else throw(($getType(@) + " couldn't be cast to Int"))
249- }
250-
251242 func keyNextUser (lpAssetId) = makeString(["%s%s", lpAssetId, "nextUser"], SEP)
252243
253244
254245 func getUsersListName (lpAssetId) = makeString(["users", lpAssetId], SEP)
255246
256247
257248 func keyListHead (listName) = makeString(["%s%s%s", listName, "head"], SEP)
258249
259250
260251 func keyListSize (listName) = makeString(["%s%s%s", listName, "size"], SEP)
261252
262253
263254 func keyListPrev (listName,id) = makeString(["%s%s%s%s", listName, id, "prev"], SEP)
264255
265256
266257 func keyListNext (listName,id) = makeString(["%s%s%s%s", listName, id, "next"], SEP)
267258
268259
269260 func containsNode (listName,id) = {
270261 let headOrUnit = getString(this, keyListHead(listName))
271262 let prevOrUnit = getString(this, keyListPrev(listName, id))
272263 let nextOrUnit = getString(this, keyListNext(listName, id))
273264 if (if ((id == valueOrElse(headOrUnit, "")))
274265 then true
275266 else (prevOrUnit != unit))
276267 then true
277268 else (nextOrUnit != unit)
278269 }
279270
280271
281272 func insertNodeActions (listName,id) = {
282273 let headOrUnit = getString(this, keyListHead(listName))
283274 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
284275 let checkNode = if (!(containsNode(listName, id)))
285276 then true
286277 else throw("Node exists")
287278 if ((checkNode == checkNode))
288279 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
289280 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
290281 else nil)) ++ [StringEntry(keyListHead(listName), id)])
291282 else throw("Strict value is not equal to itself.")
292283 }
293284
294285
295286 func deleteNodeActions (listName,id) = {
296287 let headOrUnit = getString(this, keyListHead(listName))
297288 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
298289 let prevOrUnit = getString(this, keyListPrev(listName, id))
299290 let nextOrUnit = getString(this, keyListNext(listName, id))
300291 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
301292 then (nextOrUnit != unit)
302293 else false)
303294 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
304295 else if ((nextOrUnit != unit))
305296 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
306297 else if ((prevOrUnit != unit))
307298 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
308299 else if ((id == valueOrElse(headOrUnit, "")))
309300 then [DeleteEntry(keyListHead(listName))]
310301 else throw(((("invalid node: " + listName) + ".") + id))))
311302 }
312303
313304
314305 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == zeroBigInt))
315306 then (stakedByUser > zeroBigInt)
316307 else false)
317308 then zeroBigInt
318309 else if ((stakedByUser == zeroBigInt))
319310 then wxPerLpIntegralNew
320311 else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > zeroBigInt))
321312 then (stakedByUser > zeroBigInt)
322313 else false)
323314 then value(parseBigInt(getStringOrFail(this, wxPerLpIntegralUserLastKEY)))
324315 else throw("calcWxPerLpIntegralUserLast: unexpected state")
325316
326317
327318 func refreshPoolINTEGRALS (lpAssetIdStr,poolAddressStr,lpDeltaAmount) = {
328319 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
329320 let stakedTotal = toBigInt(readStaked(stakedTotalKEY))
330321 let nonZeroStakedTotal = if ((stakedTotal == zeroBigInt))
331322 then oneBigInt
332323 else stakedTotal
333324 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
334325 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
326+ let MULT3 = 1000
335327 let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
336- let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * boostCoeff))
328+ let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
337329 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
338330 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
339331 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
340332 let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
341333 let wxPerLpIntegral = getBigIntFromStringOrZero(this, wxPerLpIntegralKEY)
342334 let wxPerLpOrZeroX3 = 0
343335 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
344336 let wxPerLpX3 = if ((wxPerLpOrZeroX3 != 0))
345337 then toBigInt(wxPerLpOrZeroX3)
346338 else fraction(toBigInt(poolWxEmissionPerBlockX3), toBigInt(MULT8), nonZeroStakedTotal)
347339 let stakedTotalNew = (stakedTotal + toBigInt(lpDeltaAmount))
348340 let nonZeroStakedTotalNew = if ((stakedTotalNew == zeroBigInt))
349341 then oneBigInt
350342 else stakedTotalNew
351343 let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX3 * toBigInt(dh)))
352344 let wxPerLpX3New = (toBigInt(poolWxEmissionPerBlockX3) / nonZeroStakedTotalNew)
353345 let wxPerLpIntegralLastUpdHeightNew = height
354346 let debug = makeString([toString(wxPerLpIntegralNew), toString(dh), toString(wxPerLpX3), toString(stakedTotal), toString(poolWxEmissionPerBlockX3), toString(wxEmissionPerBlockX3), toString(poolWeight)], "::")
355347 $Tuple3(wxPerLpIntegralNew, [StringEntry(wxPerLpIntegralKEY, toString(wxPerLpIntegralNew)), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), StringEntry(wxPerLpKEY, toString(wxPerLpX3New))], debug)
356348 }
357349
358350
359351 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
360- let $t01428614408 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
361- let wxPerLpIntegralNew = $t01428614408._1
362- let poolIntegralSTATE = $t01428614408._2
363- let poolDEBUG = $t01428614408._3
352+ let $t01427414396 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
353+ let wxPerLpIntegralNew = $t01427414396._1
354+ let poolIntegralSTATE = $t01427414396._2
355+ let poolDEBUG = $t01427414396._3
356+ let MULT3 = 1000
364357 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
365358 let stakedByUser = readStaked(stakedByUserKEY)
366359 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
367360 let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
368361 let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
369362 let wxToClaimUser = getBigIntFromStringOrZero(this, wxToClaimUserKEY)
370363 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
371364 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(toBigInt(stakedByUser), toBigInt(wxPerLpIntegralUserLastUpdHeightOrZero), wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
372365 let MULT11 = (MULT8 * MULT3)
373366 let wxToClaimUserNew = max([(wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), toBigInt(stakedByUser), toBigInt(MULT11))), zeroBigInt])
374367 let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
375368 let wxPerLpIntegralUserLastUpdHeightNew = height
376369 let debug = makeString([toString(wxToClaimUser), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
377370 $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [StringEntry(wxToClaimUserKEY, toString(wxToClaimUserNew)), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), StringEntry(wxPerLpIntegralUserLastKEY, toString(wxPerLpIntegralUserLastNew))]), debug)
378371 }
379372
380373
381374 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
382375 case s: String =>
383376 fromBase58String(s)
384377 case _: Unit =>
385378 unit
386379 case _ =>
387380 throw("Match error")
388381 }
389382
390383
391384 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
392385 case s: String =>
393386 fromBase58String(s)
394387 case _: Unit =>
395388 unit
396389 case _ =>
397390 throw("Match error")
398391 }
399392
400393
401394 let permissionDeniedError = throw("Permission denied")
402395
403396 func mustThis (i) = if ((i.caller == this))
404397 then true
405398 else permissionDeniedError
406399
407400
408401 func mustManager (i) = match managerPublicKeyOrUnit() {
409402 case pk: ByteVector =>
410403 if ((i.callerPublicKey == pk))
411404 then true
412405 else permissionDeniedError
413406 case _: Unit =>
414407 if ((i.caller == this))
415408 then true
416409 else permissionDeniedError
417410 case _ =>
418411 throw("Match error")
419412 }
420413
421414
422415 @Callable(i)
423416 func constructor (factoryAddressStr) = {
424417 let checkCaller = mustManager(i)
425418 if ((checkCaller == checkCaller))
426419 then [StringEntry(keyFactoryAddress(), factoryAddressStr)]
427420 else throw("Strict value is not equal to itself.")
428421 }
429422
430423
431424
432425 @Callable(i)
433426 func constructorV2 (votingEmissionContract) = {
434427 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
435428 then true
436429 else "invalid voting emission contract address"]
437430 if ((cheks == cheks))
438431 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract)]
439432 else throw("Strict value is not equal to itself.")
440433 }
441434
442435
443436
444437 @Callable(i)
445438 func setManager (pendingManagerPublicKey) = {
446439 let checkCaller = mustManager(i)
447440 if ((checkCaller == checkCaller))
448441 then {
449442 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
450443 if ((checkManagerPublicKey == checkManagerPublicKey))
451444 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
452445 else throw("Strict value is not equal to itself.")
453446 }
454447 else throw("Strict value is not equal to itself.")
455448 }
456449
457450
458451
459452 @Callable(i)
460453 func confirmManager () = {
461454 let pm = pendingManagerPublicKeyOrUnit()
462455 let hasPM = if (isDefined(pm))
463456 then true
464457 else throw("No pending manager")
465458 if ((hasPM == hasPM))
466459 then {
467460 let checkPM = if ((i.callerPublicKey == value(pm)))
468461 then true
469462 else throw("You are not pending manager")
470463 if ((checkPM == checkPM))
471464 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
472465 else throw("Strict value is not equal to itself.")
473466 }
474467 else throw("Strict value is not equal to itself.")
475468 }
476469
477470
478471
479472 @Callable(i)
480473 func stake () = if ((size(i.payments) != 1))
481474 then throw("invalid payment - exact one payment must be attached")
482475 else {
483476 let pmt = i.payments[0]
484477 let lpAssetId = value(pmt.assetId)
485478 let lpAssetIdStr = toBase58String(lpAssetId)
486479 let amount = pmt.amount
487480 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
488481 let callerStr = toString(i.caller)
489482 let userAddressStr = if ((callerStr == poolAddressStr))
490483 then toString(i.originCaller)
491484 else callerStr
492485 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
493486 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
494487 let stakedByUser = readStaked(stakedByUserKEY)
495488 let stakedTotal = readStaked(stakedTotalKEY)
496- let $t01882518942 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
497- let wxToClaimUserNew = $t01882518942._1
498- let integralSTATE = $t01882518942._2
499- let debug = $t01882518942._3
489+ let $t01883218949 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
490+ let wxToClaimUserNew = $t01883218949._1
491+ let integralSTATE = $t01883218949._2
492+ let debug = $t01883218949._3
500493 let listName = getUsersListName(lpAssetIdStr)
501494 let listActions = if (containsNode(listName, userAddressStr))
502495 then nil
503496 else insertNodeActions(listName, userAddressStr)
504497 (([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE) ++ listActions)
505498 }
506499
507500
508501
509502 @Callable(i)
510503 func unstake (lpAssetIdStr,amount) = {
511504 let lpAssetId = fromBase58String(lpAssetIdStr)
512505 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
513506 let poolAddon = valueOrElse(getString(addressFromStringValue(poolAddressStr), keyAddonAddr()), poolAddressStr)
514507 let callerStr = toString(i.caller)
515508 let userAddressStr = if (if ((callerStr == poolAddressStr))
516509 then true
517510 else (callerStr == poolAddon))
518511 then toString(i.originCaller)
519512 else callerStr
520513 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
521514 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
522515 let stakedByUser = readStaked(stakedByUserKEY)
523516 let stakedTotal = readStaked(stakedTotalKEY)
524517 let integralSTATE = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))._2
525518 let listName = getUsersListName(lpAssetIdStr)
526519 let listActions = if (if (containsNode(listName, userAddressStr))
527520 then (amount == stakedByUser)
528521 else false)
529522 then deleteNodeActions(listName, userAddressStr)
530523 else nil
531524 let claimedByUserMinReward = getBigIntFromStringOrZero(this, keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr))
532525 let poolAddress = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
533526 let wxToClaimUserNew = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddress, 0)._1
534527 let availableToClaim = (wxToClaimUserNew - claimedByUserMinReward)
535528 let r = if ((availableToClaim > zeroBigInt))
536529 then invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr], nil)
537530 else unit
538531 if ((r == r))
539532 then if ((amount > stakedByUser))
540533 then throw(((((((("passed amount=" + toString(amount)) + " is greater than available=") + toString(stakedByUser)) + ". lpAssetId=") + lpAssetIdStr) + ". stakedByUserKEY=") + stakedByUserKEY))
541534 else (([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE) ++ listActions)
542535 else throw("Strict value is not equal to itself.")
543536 }
544537
545538
546539
547540 @Callable(i)
548541 func claimWx (lpAssetIdStr) = {
549542 let userAddressStr = toString(i.caller)
550543 let result = invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr], nil)
551544 $Tuple2(nil, result)
552545 }
553546
554547
555548
556549 @Callable(i)
557550 func claimWxINTERNAL (lpAssetIdStr,userAddressStr) = {
558551 let checkCaller = mustThis(i)
559552 if ((checkCaller == checkCaller))
560553 then {
561554 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), "claimWxINTERNAL: invalid user address")
562555 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
563556 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
564557 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
565558 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
566559 let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
567560 let claimedByUser = getBigIntFromStringOrZero(this, claimedByUserKEY)
568561 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
569562 let claimedByUserBoostReward = getBigIntFromStringOrZero(this, claimedByUserBoostRewardKEY)
570563 let claimedTotal = getBigIntFromStringOrZero(this, claimedTotalKEY)
571- let $t02280722919 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
572- let wxToClaimUserNew = $t02280722919._1
573- let integralSTATE = $t02280722919._2
574- let debug = $t02280722919._3
564+ let $t02281422926 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
565+ let wxToClaimUserNew = $t02281422926._1
566+ let integralSTATE = $t02281422926._2
567+ let debug = $t02281422926._3
575568 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
576569 if ((zeroBigInt >= availableToClaim))
577570 then throw("nothing to claim")
578571 else {
579572 let wxAmountBoostTotal = max([asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [lpAssetIdStr, userAddressStr], nil))[0]), 0])
580573 let minRewardPart = availableToClaim
581- let boostRewardPart = min([(minRewardPart * toBigInt((boostCoeff - 1))), toBigInt(wxAmountBoostTotal)])
574+ let boostRewardPart = min([(minRewardPart * toBigInt(2)), toBigInt(wxAmountBoostTotal)])
582575 let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [toInt(minRewardPart)], nil))[0])
583576 let emitBoost = asAnyList(invoke(emissionContract, "emit", [toInt(boostRewardPart)], nil))
584577 if ((emitBoost == emitBoost))
585578 then {
586579 let claimedByUserValue = ((claimedByUser + minRewardPart) + boostRewardPart)
587580 let claimedByUserMinRewardPlusPart = (claimedByUserMinReward + minRewardPart)
588581 let claimedByUserBoostRewardPlusBoostRewardPart = (claimedByUserBoostReward + boostRewardPart)
589582 let claimedTotalPlusAvailableToClaim = (claimedTotal + availableToClaim)
590583 [StringEntry(claimedByUserKEY, toString(claimedByUserValue)), StringEntry(claimedByUserMinRewardKEY, toString(claimedByUserMinRewardPlusPart)), StringEntry(claimedByUserBoostRewardKEY, toString(claimedByUserBoostRewardPlusBoostRewardPart)), StringEntry(claimedTotalKEY, toString(claimedTotalPlusAvailableToClaim)), ScriptTransfer(userAddress, toInt(minRewardPart), wxAssetId), ScriptTransfer(userAddress, toInt(boostRewardPart), wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, toInt(availableToClaim), i.transactionId)]
591584 }
592585 else throw("Strict value is not equal to itself.")
593586 }
594587 }
595588 else throw("Strict value is not equal to itself.")
596589 }
597590
598591
599592
600593 @Callable(i)
601594 func claimWxBulkInternalREADONLY (currentIter,lpAssetIds,userAddressStr,resAcc) = if ((currentIter == size(lpAssetIds)))
602595 then $Tuple2(nil, resAcc)
603596 else {
604597 let lpAssetId = lpAssetIds[currentIter]
605598 let info = split({
606599 let @ = invoke(this, "claimWxREADONLY", [lpAssetId, userAddressStr], nil)
607600 if ($isInstanceOf(@, "String"))
608601 then @
609602 else throw(($getType(@) + " couldn't be cast to String"))
610603 }, SEP)
611604 let unclaimed = info[3]
612605 let claimed = info[4]
613606 let res = (resAcc :+ makeString(["%d%d", unclaimed, claimed], SEP))
614607 let inv = {
615608 let @ = invoke(this, "claimWxBulkInternalREADONLY", [(currentIter + 1), lpAssetIds, userAddressStr, res], nil)
616609 if ($isInstanceOf(@, "List[Any]"))
617610 then @
618611 else throw(($getType(@) + " couldn't be cast to List[Any]"))
619612 }
620613 if ((inv == inv))
621614 then $Tuple2(nil, inv)
622615 else throw("Strict value is not equal to itself.")
623616 }
624617
625618
626619
627620 @Callable(i)
628621 func claimWxBulkREADONLY (lpAssetIds,userAddressStr) = {
629622 let res = invoke(this, "claimWxBulkInternalREADONLY", [0, lpAssetIds, userAddressStr, nil], nil)
630623 $Tuple2(nil, res)
631624 }
632625
633626
634627
635628 @Callable(i)
636629 func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
637630 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
638631 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
639632 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
640633 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
641634 let stakedByUser = readStaked(stakedByUserKEY)
642635 let stakedTotal = readStaked(stakedTotalKEY)
643636 let claimedByUser = getBigIntFromStringOrZero(this, claimedByUserKEY)
644637 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
645638 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
646639 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
647640 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
648641 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
649642 let passedBlocks = if ((emissionStartBlock > height))
650643 then 0
651644 else (height - emissionStartBlock)
652645 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
653646 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
654- let $t02659226704 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
655- let wxToClaimUserNew = $t02659226704._1
656- let integralSTATE = $t02659226704._2
657- let debug = $t02659226704._3
647+ let $t02658426696 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
648+ let wxToClaimUserNew = $t02658426696._1
649+ let integralSTATE = $t02658426696._2
650+ let debug = $t02658426696._3
658651 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
659652 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
660653 let wxAmountBoostTotal = max([asInt(boostInvResult[0]), 0])
661654 let boostDebug = asString(boostInvResult[1])
662655 let minRewardPart = availableToClaim
663- let boostRewardPart = min([(minRewardPart * toBigInt((boostCoeff - 1))), toBigInt(wxAmountBoostTotal)])
656+ let boostRewardPart = min([(minRewardPart * toBigInt(2)), toBigInt(wxAmountBoostTotal)])
664657 let totalReward = (minRewardPart + boostRewardPart)
665658 $Tuple2(nil, makeString(["%s%s%d%d%d%d%s", lpAssetIdStr, userAddressStr, toString(totalReward), toString(claimedByUser), toString(minRewardPart), toString(boostRewardPart), "soon"], SEP))
666659 }
667660
668661
669662
670663 @Callable(i)
671664 func usersListTraversal (lpAssetId) = {
672665 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
673666 then true
674667 else mustManager(i)
675668 if ((checkCaller == checkCaller))
676669 then {
677670 let listName = getUsersListName(lpAssetId)
678671 let userOrUnit = getString(keyNextUser(lpAssetId))
679672 let headOrUnit = getString(keyListHead(listName))
680673 match userOrUnit {
681674 case _: Unit =>
682675 match headOrUnit {
683676 case _: Unit =>
684677 $Tuple2(nil, false)
685678 case head: String =>
686679 $Tuple2([StringEntry(keyNextUser(lpAssetId), head)], true)
687680 case _ =>
688681 throw("Match error")
689682 }
690683 case userAddress: String =>
691684 let claimedByUserMinReward = getBigIntFromStringOrZero(this, keyClaimedByUserMinReward(lpAssetId, userAddress))
692685 let poolAddress = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
693686 let wxToClaimUserNew = refreshINTEGRALS(lpAssetId, userAddress, poolAddress, 0)._1
694687 let availableToClaim = (wxToClaimUserNew - claimedByUserMinReward)
695688 let r = if ((availableToClaim > zeroBigInt))
696689 then invoke(this, "claimWxINTERNAL", [lpAssetId, userAddress], nil)
697690 else unit
698691 if ((r == r))
699692 then {
700693 let nextUserOrUnit = getString(keyListNext(listName, userAddress))
701694 match nextUserOrUnit {
702695 case _: Unit =>
703696 $Tuple2([DeleteEntry(keyNextUser(lpAssetId))], false)
704697 case nextUser: String =>
705698 $Tuple2([StringEntry(keyNextUser(lpAssetId), nextUser)], true)
706699 case _ =>
707700 throw("Match error")
708701 }
709702 }
710703 else throw("Strict value is not equal to itself.")
711704 case _ =>
712705 throw("Match error")
713706 }
714707 }
715708 else throw("Strict value is not equal to itself.")
716709 }
717710
718711
719712
720713 @Callable(i)
721714 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
722715 then throw("permissions denied")
723716 else {
724- let $t02905529165 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
725- let wxPerLpIntegralNew = $t02905529165._1
726- let poolIntegralSTATE = $t02905529165._2
727- let poolDEBUG = $t02905529165._3
717+ let $t02903229142 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
718+ let wxPerLpIntegralNew = $t02903229142._1
719+ let poolIntegralSTATE = $t02903229142._2
720+ let poolDEBUG = $t02903229142._3
728721 poolIntegralSTATE
729722 }
730723
731724
732725 @Verifier(tx)
733726 func verify () = {
734727 let targetPublicKey = match managerPublicKeyOrUnit() {
735728 case pk: ByteVector =>
736729 pk
737730 case _: Unit =>
738731 tx.senderPublicKey
739732 case _ =>
740733 throw("Match error")
741734 }
742735 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
743736 }
744737

github/deemru/w8io/3ef1775 
124.01 ms