tx · F1oBvTs18H2YgSScwShQXLA78svUppEnrK1umnd5MEpW

3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz:  -0.02200000 Waves

2023.01.11 15:05 [2400270] smart account 3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz > SELF 0.00000000 Waves

{ "type": 13, "id": "F1oBvTs18H2YgSScwShQXLA78svUppEnrK1umnd5MEpW", "fee": 2200000, "feeAssetId": null, "timestamp": 1673438766344, "version": 1, "sender": "3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz", "senderPublicKey": "D28XoueZWsMfm8Y5pa6C5ZFuYoWgre2Wm8tzJANJgMnq", "proofs": [ "cRurw1RHRLXgVWZN5T4Rh5Zt9pxusfq8BtAjhjmq586hZxrgkDJDqM2RBHVhTusbcaKeUytDe53zxtQqpHpnqod" ], "script": "base64:BgL7HggCEgMKAQgSAwoBCBIDCgEIEgASABIECgIIARIDCgEIEgQKAggIEgYKBAEYCBgSBAoCGAgSBAoCCAgSBAoCCAgSAwoBCBIECgIICCIGU0NBTEU4IgVNVUxUOCIHU0NBTEUxOCIGTVVMVDE4IgNTRVAiDlBPT0xXRUlHSFRNVUxUIgp6ZXJvQmlnSW50IglvbmVCaWdJbnQiCWFzQW55TGlzdCIDdmFsIgckbWF0Y2gwIgp2YWxBbnlMeXN0IgVhc0ludCIGdmFsSW50Ighhc1N0cmluZyIGdmFsU3RyIgxhc0J5dGVWZWN0b3IiBnZhbEJpbiIPZ2V0U3RyaW5nT3JGYWlsIgdhZGRyZXNzIgNrZXkiGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbCIMZ2V0SW50T3JaZXJvIg9nZXRJbnRPckRlZmF1bHQiCmRlZmF1bHRWYWwiDGdldEludE9yRmFpbCIZZ2V0QmlnSW50RnJvbVN0cmluZ09yWmVybyIcZ2V0QmlnSW50RnJvbVN0cmluZ09yRGVmYXVsdCIBcyIFdG9YMTgiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiB2Zyb21YMTgiD3Jlc3VsdFNjYWxlTXVsdCIRa2V5RmFjdG9yeUFkZHJlc3MiGWtleVZvdGluZ0VtaXNzaW9uQ29udHJhY3QiGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcCIZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcCIUSWR4RmFjdG9yeUNmZ0lkb0RhcHAiFUlkeEZhY3RvcnlDZmdUZWFtRGFwcCIZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcCIVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwIhlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwIg1rZXlGYWN0b3J5Q2ZnIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIWa2V5U3RhYmxlUG9vbEFkZG9uQWRkciIMa2V5QWRkb25BZGRyIhprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZyIKbHBBc3NldFN0ciIQa2V5RmFjdG9yeUxwTGlzdCIma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MiFGtleUZhY3RvcnlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiCnJlYWRMcExpc3QiB2ZhY3RvcnkiFHJlYWRGYWN0b3J5Q2ZnT3JGYWlsIhhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwiCmZhY3RvcnlDZmciGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbCIXZ2V0U3Rha2luZ0FkZHJlc3NPckZhaWwiHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudCIha2V5RW1pc3Npb25SYXRlUGVyQmxvY2tNYXhDdXJyZW50IhVrZXlFbWlzc2lvblN0YXJ0QmxvY2siG2tleUVtaXNzaW9uRHVyYXRpb25JbkJsb2NrcyITa2V5RW1pc3Npb25FbmRCbG9jayIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIMbHBBc3NldElkU3RyIg5rZXlTdGFrZWRUb3RhbCIQa2V5Q2xhaW1lZEJ5VXNlciIZa2V5Q2xhaW1lZEJ5VXNlck1pblJld2FyZCIba2V5Q2xhaW1lZEJ5VXNlckJvb3N0UmV3YXJkIg9rZXlDbGFpbWVkVG90YWwiCnJlYWRTdGFrZWQiFWtleUxhc3RUb3RhbExwQmFsYW5jZSIJbHBBc3NldElkIhRrZXlMYXN0VXNlckxwQmFsYW5jZSILdXNlckFkZHJlc3MiGWtleVRvdGFsTHBCYWxhbmNlSW50ZWdyYWwiGGtleVVzZXJMcEJhbGFuY2VJbnRlZ3JhbCIma2V5VG90YWxMcEJhbGFuY2VJbnRlZ3JhbExhc3RVcGRIZWlnaHQiJWtleVVzZXJMcEJhbGFuY2VJbnRlZ3JhbExhc3RVcGRIZWlnaHQiEmtleVd4UGVyTHBJbnRlZ3JhbCIfa2V5V3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodCIQa2V5V3hUb0NsYWltVXNlciIja2V5V3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHQiCmtleVd4UGVyTHAiDWtleVd4UGVyTHBYMTgiGmtleVd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0IhlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkIgR0eXBlIgZ0eElkNTgiE2Zvcm1hdEhpc3RvcnlSZWNvcmQiBmFtb3VudCIVT3BlcmF0aW9uSGlzdG9yeUVudHJ5IgR0eElkIg5mYWN0b3J5QWRkcmVzcyIPZmFjdG9yeUNvbnRyYWN0IhBlbWlzc2lvbkNvbnRyYWN0IhBib29zdGluZ0NvbnRyYWN0IgtrZXlOZXh0VXNlciIQZ2V0VXNlcnNMaXN0TmFtZSILa2V5TGlzdEhlYWQiCGxpc3ROYW1lIgtrZXlMaXN0U2l6ZSILa2V5TGlzdFByZXYiAmlkIgtrZXlMaXN0TmV4dCIMY29udGFpbnNOb2RlIgpoZWFkT3JVbml0IgpwcmV2T3JVbml0IgpuZXh0T3JVbml0IhFpbnNlcnROb2RlQWN0aW9ucyIIbGlzdFNpemUiCWNoZWNrTm9kZSIRZGVsZXRlTm9kZUFjdGlvbnMiG2NhbGNXeFBlckxwSW50ZWdyYWxVc2VyTGFzdCIMc3Rha2VkQnlVc2VyIiZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybyISd3hQZXJMcEludGVncmFsTmV3Ihp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdEtFWSIUcmVmcmVzaFBvb2xJTlRFR1JBTFMiDnBvb2xBZGRyZXNzU3RyIg1scERlbHRhQW1vdW50Ig5zdGFrZWRUb3RhbEtFWSILc3Rha2VkVG90YWwiEm5vblplcm9TdGFrZWRUb3RhbCIKcG9vbFdlaWdodCISZW1pc3Npb25TdGFydEJsb2NrIgVNVUxUMyIUd3hFbWlzc2lvblBlckJsb2NrWDMiGHBvb2xXeEVtaXNzaW9uUGVyQmxvY2tYMyISd3hQZXJMcEludGVncmFsS0VZIh93eFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0S0VZIgp3eFBlckxwS0VZIhx3eFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0Ig93eFBlckxwSW50ZWdyYWwiD3d4UGVyTHBPclplcm9YMyICZGgiCXd4UGVyTHBYMyIOc3Rha2VkVG90YWxOZXciFW5vblplcm9TdGFrZWRUb3RhbE5ldyIMd3hQZXJMcFgzTmV3Ih93eFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0TmV3IgVkZWJ1ZyIQcmVmcmVzaElOVEVHUkFMUyINJHQwMTQyNzQxNDM5NiIRcG9vbEludGVncmFsU1RBVEUiCXBvb2xERUJVRyIPc3Rha2VkQnlVc2VyS0VZIhB3eFRvQ2xhaW1Vc2VyS0VZIiN3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodEtFWSINd3hUb0NsYWltVXNlciIXd3hQZXJMcEludGVncmFsVXNlckxhc3QiBk1VTFQxMSIQd3hUb0NsYWltVXNlck5ldyIad3hQZXJMcEludGVncmFsVXNlckxhc3ROZXciI3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0TmV3IhZtYW5hZ2VyUHVibGljS2V5T3JVbml0Ih1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCIVcGVybWlzc2lvbkRlbmllZEVycm9yIghtdXN0VGhpcyIBaSILbXVzdE1hbmFnZXIiAnBrIhFmYWN0b3J5QWRkcmVzc1N0ciILY2hlY2tDYWxsZXIiFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QiBWNoZWtzIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iA3BtdCIJY2FsbGVyU3RyIg0kdDAxODgzMjE4OTQ5Ig1pbnRlZ3JhbFNUQVRFIgtsaXN0QWN0aW9ucyIJcG9vbEFkZG9uIg1jbGFpbWVkQnlVc2VyIgtwb29sQWRkcmVzcyIQYXZhaWxhYmxlVG9DbGFpbSIBciIGcmVzdWx0IhBjbGFpbWVkQnlVc2VyS0VZIg9jbGFpbWVkVG90YWxLRVkiGWNsYWltZWRCeVVzZXJNaW5SZXdhcmRLRVkiG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWSIWY2xhaW1lZEJ5VXNlck1pblJld2FyZCIYY2xhaW1lZEJ5VXNlckJvb3N0UmV3YXJkIgxjbGFpbWVkVG90YWwiDSR0MDIyNzg3MjI4OTkiEnd4QW1vdW50Qm9vc3RUb3RhbCINbWluUmV3YXJkUGFydCIPYm9vc3RSZXdhcmRQYXJ0Igt0b3RhbFJld2FyZCIJd3hBc3NldElkIgllbWl0Qm9vc3QiEmNsYWltZWRCeVVzZXJWYWx1ZSIeY2xhaW1lZEJ5VXNlck1pblJld2FyZFBsdXNQYXJ0IitjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmRQbHVzQm9vc3RSZXdhcmRQYXJ0IiBjbGFpbWVkVG90YWxQbHVzQXZhaWxhYmxlVG9DbGFpbSILY3VycmVudEl0ZXIiCmxwQXNzZXRJZHMiBnJlc0FjYyIEaW5mbyIBQCIJdW5jbGFpbWVkIgdjbGFpbWVkIgNyZXMiA2ludiISd3hFbWlzc2lvblBlckJsb2NrIgxwYXNzZWRCbG9ja3MiDnBvb2xXeEVtaXNzaW9uIgx1c2VyV3hSZXdhcmQiDSR0MDI2NDUyMjY1NjQiDmJvb3N0SW52UmVzdWx0Igpib29zdERlYnVnIgp1c2VyT3JVbml0IgckbWF0Y2gxIgRoZWFkIg5uZXh0VXNlck9yVW5pdCIIbmV4dFVzZXIiDSR0MDI5MDcyMjkxODIiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleV4AAWEACAABYgCAwtcvAAFjABIAAWQJALYCAQCAgJC7utat8A0AAWUCAl9fAAFmBQFiAAFnCQC2AgEAAAABaAkAtgIBAAEBAWkBAWoEAWsFAWoDCQABAgUBawIJTGlzdFtBbnldBAFsBQFrBQFsCQACAQIbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQFtAQFqBAFrBQFqAwkAAQIFAWsCA0ludAQBbgUBawUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEBbwEBagQBawUBagMJAAECBQFrAgZTdHJpbmcEAXAFAWsFAXAJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBAXEBAWoEAWsFAWoDCQABAgUBawIKQnl0ZVZlY3RvcgQBcgUBawUBcgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEBcwIBdAF1CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUBdAUBdQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBdQIPIGlzIG5vdCBkZWZpbmVkAQF2AgF0AXUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQF0BQF1CQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUBdAIBLgUBdQIPIGlzIG5vdCBkZWZpbmVkAQF3AgF0AXUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBdAUBdQAAAQF4AwF0AXUBeQkBC3ZhbHVlT3JFbHNlAgkAmggCBQF0BQF1BQF5AQF6AgF0AXUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQF0BQF1CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQF1Ag8gaXMgbm90IGRlZmluZWQBAUECAXQBdQkBBXZhbHVlAQkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFAXQFAXUCATABAUIDAXQBdQF5BAFrCQCdCAIFAXQFAXUDCQABAgUBawIGU3RyaW5nBAFDBQFrCQEFdmFsdWUBCQCoAwEFAUMDCQABAgUBawIEVW5pdAUBeQkAAgECC01hdGNoIGVycm9yAQFEAgFFAUYJALwCAwkAtgIBBQFFBQFkCQC2AgEFAUYBAUcCAWoBSAkAoAMBCQC8AgMFAWoJALYCAQUBSAUBZAEBSQACHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MBAUoAAholc19fdm90aW5nRW1pc3Npb25Db250cmFjdAABSwABAAFMAAIAAU0AAwABTgAEAAFPAAUAAVAABgABUQAHAQFSAAIRJXNfX2ZhY3RvcnlDb25maWcBAVMAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBVQACFyVzX19zdGFibGVQb29sQWRkb25BZGRyAQFWAAINJXNfX2FkZG9uQWRkcgEBVwEBWAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQFYCQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFlAQFZAAIQJXNfX2xwVG9rZW5zTGlzdAEBWgEBWAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQFYCQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFlAQJhYQECYWIJALkJAgkAzAgCAgQlcyVzCQDMCAICCnBvb2xXZWlnaHQJAMwIAgUCYWIFA25pbAUBZQECYWMBAmFkCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUCYWQJAQFZAAIABQFlAQJhZQECYWQJALUJAgkBAXYCBQJhZAkBAVIABQFlAQJhZgECYWcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWcFAUwBAmFoAQJhZwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhZwUBTwECYWkBAmFnCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFnBQFLAQJhagACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAECYWsAAh4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAmFsAAIaJXMlc19fZW1pc3Npb25fX3N0YXJ0QmxvY2sBAmFtAAIYJXMlc19fZW1pc3Npb25fX2R1cmF0aW9uAQJhbgACGCVzJXNfX2VtaXNzaW9uX19lbmRCbG9jawECYW8CAmFwAmFxCQC5CQIJAMwIAgIOJXMlcyVzX19zdGFrZWQJAMwIAgUCYXAJAMwIAgUCYXEFA25pbAUBZQECYXIBAmFxCQCsAgICFyVzJXMlc19fc3Rha2VkX190b3RhbF9fBQJhcQECYXMCAmFxAmFwCQC5CQIJAMwIAgIPJXMlcyVzX19jbGFpbWVkCQDMCAIFAmFwCQDMCAIFAmFxBQNuaWwFAWUBAmF0AgJhcQJhcAkAuQkCCQDMCAICGCVzJXMlc19fY2xhaW1lZE1pblJld2FyZAkAzAgCBQJhcAkAzAgCBQJhcQUDbmlsBQFlAQJhdQICYXECYXAJALkJAgkAzAgCAholcyVzJXNfX2NsYWltZWRCb29zdFJld2FyZAkAzAgCBQJhcAkAzAgCBQJhcQUDbmlsBQFlAQJhdgECYXEJALkJAgkAzAgCAhYlcyVzJXNfX2NsYWltZWRfX3RvdGFsCQDMCAIFAmFxBQNuaWwFAWUBAmF3AQF1CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAXUAAAECYXgBAmF5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAmF5CQDMCAICBXRvdGFsCQDMCAICA2JhbAUDbmlsBQFlAQJhegICYXkCYUEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYXkJAMwIAgUCYUEJAMwIAgIDYmFsBQNuaWwFAWUBAmFCAQJheQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJheQkAzAgCAgV0b3RhbAkAzAgCAgZiYWxJTlQFA25pbAUBZQECYUMCAmF5AmFBCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAmF5CQDMCAIFAmFBCQDMCAICBmJhbElOVAUDbmlsBQFlAQJhRAECYXkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYXkJAMwIAgIFdG90YWwJAMwIAgIHbGFzdFVwZAUDbmlsBQFlAQJhRQICYXkCYUEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYXkJAMwIAgUCYUEJAMwIAgIHbGFzdFVwZAUDbmlsBQFlAQJhRgECYXkJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJheQkAzAgCAgZjb21tb24JAMwIAgIFbHBJbnQFA25pbAUBZQECYUcBAmF5CQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgUCYXkJAMwIAgIGY29tbW9uCQDMCAICBmxwSW50SAUDbmlsBQFlAQJhSAICYXkCYUEJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJheQkAzAgCBQJhQQkAzAgCAgVscEludAUDbmlsBQFlAQJhSQICYXkCYUEJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJheQkAzAgCBQJhQQkAzAgCAgZscEludEgFA25pbAUBZQECYUoBAmF5CQC5CQIJAMwIAgICJXMJAMwIAgUCYXkJAMwIAgIHd3hQZXJMcAUDbmlsBQFlAQJhSwECYXkJALkJAgkAzAgCAgIlcwkAzAgCBQJheQkAzAgCAgp3eFBlckxwWDE4BQNuaWwFAWUBAmFMAgJheQJhQQkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmF5CQDMCAIFAmFBCQDMCAICBXVJbnRMBQNuaWwFAWUBAmFNAwJhTgJhQQJhTwkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFOCQDMCAIFAmFBCQDMCAIFAmFPBQNuaWwFAWUBAmFQBAJhQQJheQJhTgJhUQkAuQkCCQDMCAICDCVzJXMlcyVkJWQlZAkAzAgCBQJhQQkAzAgCBQJheQkAzAgCBQJhTgkAzAgCCQCkAwEFBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYVEFA25pbAUBZQECYVIFAmFOAmFBAmF5AmFRAmFTCQELU3RyaW5nRW50cnkCCQECYU0DBQJhTgUCYUEJANgEAQUCYVMJAQJhUAQFAmFBBQJheQUCYU4FAmFRAAJhVAkBAXMCBQR0aGlzCQEBSQAAAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBBQJhVAACYWcJAQJhZQEFAmFVAAJhVgkBAmFoAQUCYWcAAmFXCQECYWYBBQJhZwECYVgBAmF5CQC5CQIJAMwIAgIEJXMlcwkAzAgCBQJheQkAzAgCAghuZXh0VXNlcgUDbmlsBQFlAQJhWQECYXkJALkJAgkAzAgCAgV1c2VycwkAzAgCBQJheQUDbmlsBQFlAQJhWgECYmEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYmEJAMwIAgIEaGVhZAUDbmlsBQFlAQJiYgECYmEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYmEJAMwIAgIEc2l6ZQUDbmlsBQFlAQJiYwICYmECYmQJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJiYQkAzAgCBQJiZAkAzAgCAgRwcmV2BQNuaWwFAWUBAmJlAgJiYQJiZAkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmJhCQDMCAIFAmJkCQDMCAICBG5leHQFA25pbAUBZQECYmYCAmJhAmJkBAJiZwkAnQgCBQR0aGlzCQECYVoBBQJiYQQCYmgJAJ0IAgUEdGhpcwkBAmJjAgUCYmEFAmJkBAJiaQkAnQgCBQR0aGlzCQECYmUCBQJiYQUCYmQDAwkAAAIFAmJkCQELdmFsdWVPckVsc2UCBQJiZwIABgkBAiE9AgUCYmgFBHVuaXQGCQECIT0CBQJiaQUEdW5pdAECYmoCAmJhAmJkBAJiZwkAnQgCBQR0aGlzCQECYVoBBQJiYQQCYmsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmJiAQUCYmEAAAQCYmwDCQEBIQEJAQJiZgIFAmJhBQJiZAYJAAIBAgtOb2RlIGV4aXN0cwMJAAACBQJibAUCYmwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmIBBQJiYQkAZAIFAmJrAAEFA25pbAMJAQIhPQIFAmJnBQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJiZQIFAmJhBQJiZAkBBXZhbHVlAQUCYmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJjAgUCYmEJAQV2YWx1ZQEFAmJnBQJiZAUDbmlsBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFaAQUCYmEFAmJkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJtAgJiYQJiZAQCYmcJAJ0IAgUEdGhpcwkBAmFaAQUCYmEEAmJrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJiYgEFAmJhAAAEAmJoCQCdCAIFBHRoaXMJAQJiYwIFAmJhBQJiZAQCYmkJAJ0IAgUEdGhpcwkBAmJlAgUCYmEFAmJkCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJiYgEFAmJhCQBlAgUCYmsAAQUDbmlsAwMJAQIhPQIFAmJoBQR1bml0CQECIT0CBQJiaQUEdW5pdAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJlAgUCYmEJAQV2YWx1ZQEFAmJoCQEFdmFsdWUBBQJiaQkAzAgCCQELU3RyaW5nRW50cnkCCQECYmMCBQJiYQkBBXZhbHVlAQUCYmkJAQV2YWx1ZQEFAmJoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJiYwIFAmJhBQJiZAkAzAgCCQELRGVsZXRlRW50cnkBCQECYmUCBQJiYQUCYmQFA25pbAMJAQIhPQIFAmJpBQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhWgEFAmJhCQEFdmFsdWUBBQJiaQkAzAgCCQELRGVsZXRlRW50cnkBCQECYmUCBQJiYQUCYmQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJjAgUCYmEJAQV2YWx1ZQEFAmJpBQNuaWwDCQECIT0CBQJiaAUEdW5pdAkAzAgCCQELRGVsZXRlRW50cnkBCQECYmMCBQJiYQUCYmQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJlAgUCYmEJAQV2YWx1ZQEFAmJoBQNuaWwDCQAAAgUCYmQJAQt2YWx1ZU9yRWxzZQIFAmJnAgAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFaAQUCYmEFA25pbAkAAgEJAKwCAgkArAICCQCsAgICDmludmFsaWQgbm9kZTogBQJiYQIBLgUCYmQBAmJuBAJibwJicAJicQJicgMDCQAAAgUCYnAFAWcJAL8CAgUCYm8FAWcHBQFnAwkAAAIFAmJvBQFnBQJicQMDCQC/AgIFAmJwBQFnCQC/AgIFAmJvBQFnBwkBBXZhbHVlAQkAqAMBCQEBcwIFBHRoaXMFAmJyCQACAQItY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0OiB1bmV4cGVjdGVkIHN0YXRlAQJicwMCYXECYnQCYnUEAmJ2CQECYXIBBQJhcQQCYncJALYCAQkBAmF3AQUCYnYEAmJ4AwkAAAIFAmJ3BQFnBQFoBQJidwQCYnkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAmFVCQECYWEBBQJidAQCYnoJAQF6AgUCYVYJAQJhbAAEAmJBAOgHBAJiQgkAaAIJAQF6AgUCYVYJAQJhagAFAmJBBAJiQwkAawMFAmJCBQJieQkAaAIFAWYAAwQCYkQJAQJhRgEFAmFxBAJiRQkBAmFHAQUCYXEEAmJGCQECYUoBBQJhcQQCYkcJAQF4AwUEdGhpcwUCYkUFAmJ6BAJiSAkBAUECBQR0aGlzBQJiRAQCYkkAAAQCYkoJAJYDAQkAzAgCCQBlAgUGaGVpZ2h0BQJiRwkAzAgCAAAFA25pbAQCYksDCQECIT0CBQJiSQAACQC2AgEFAmJJCQC8AgMJALYCAQUCYkMJALYCAQUBYgUCYngEAmJMCQC3AgIFAmJ3CQC2AgEFAmJ1BAJiTQMJAAACBQJiTAUBZwUBaAUCYkwEAmJxCQC3AgIFAmJICQC5AgIFAmJLCQC2AgEFAmJKBAJiTgkAugICCQC2AgEFAmJDBQJiTQQCYk8FBmhlaWdodAQCYlAJALkJAgkAzAgCCQCmAwEFAmJxCQDMCAIJAKQDAQUCYkoJAMwIAgkApgMBBQJiSwkAzAgCCQCmAwEFAmJ3CQDMCAIJAKQDAQUCYkMJAMwIAgkApAMBBQJiQgkAzAgCCQCkAwEFAmJ5BQNuaWwCAjo6CQCVCgMFAmJxCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmJECQCmAwEFAmJxCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiRQUCYk8JAMwIAgkBC1N0cmluZ0VudHJ5AgUCYkYJAKYDAQUCYk4FA25pbAUCYlABAmJRBAJhcQJhcAJidAJidQQCYlIJAQJicwMFAmFxBQJidAUCYnUEAmJxCAUCYlICXzEEAmJTCAUCYlICXzIEAmJUCAUCYlICXzMEAmJBAOgHBAJiVQkBAmFvAgUCYXAFAmFxBAJibwkBAmF3AQUCYlUEAmJWCQECYUgCBQJhcQUCYXAEAmJXCQECYUkCBQJhcQUCYXAEAmJyCQECYUwCBQJhcQUCYXAEAmJYCQEBQQIFBHRoaXMFAmJWBAJicAkBAXcCBQR0aGlzBQJiVwQCYlkJAQJibgQJALYCAQUCYm8JALYCAQUCYnAFAmJxBQJicgQCYloJAGgCBQFiBQJiQQQCY2EJAJgDAQkAzAgCCQC3AgIFAmJYCQC8AgMJALgCAgUCYnEFAmJZCQC2AgEFAmJvCQC2AgEFAmJaCQDMCAIFAWcFA25pbAQCY2IFAmJxBAJjYwUGaGVpZ2h0BAJiUAkAuQkCCQDMCAIJAKYDAQUCYlgJAMwIAgkApgMBBQJiWQkAzAgCCQCkAwEFAmJvCQDMCAIFAmJUCQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAjo6CQCVCgMFAmNhCQDOCAIFAmJTCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmJWCQCmAwEFAmNhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiVwUCY2MJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYnIJAKYDAQUCY2IFA25pbAUCYlABAmNkAAQBawkAoggBCQEBUwADCQABAgUBawIGU3RyaW5nBAFDBQFrCQDZBAEFAUMDCQABAgUBawIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJjZQAEAWsJAKIIAQkBAVQAAwkAAQIFAWsCBlN0cmluZwQBQwUBawkA2QQBBQFDAwkAAQIFAWsCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACY2YJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECY2cBAmNoAwkAAAIIBQJjaAZjYWxsZXIFBHRoaXMGBQJjZgECY2kBAmNoBAFrCQECY2QAAwkAAQIFAWsCCkJ5dGVWZWN0b3IEAmNqBQFrAwkAAAIIBQJjaA9jYWxsZXJQdWJsaWNLZXkFAmNqBgUCY2YDCQABAgUBawIEVW5pdAMJAAACCAUCY2gGY2FsbGVyBQR0aGlzBgUCY2YJAAIBAgtNYXRjaCBlcnJvcg4CY2gBC2NvbnN0cnVjdG9yAQJjawQCY2wJAQJjaQEFAmNoAwkAAAIFAmNsBQJjbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBSQAFAmNrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2gBDWNvbnN0cnVjdG9yVjIBAmNtBAJjbgkAzAgCCQECY2kBBQJjaAkAzAgCAwkBAiE9AgkApggBBQJjbQUEdW5pdAYCKGludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MFA25pbAMJAAACBQJjbgUCY24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUoABQJjbQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNoAQpzZXRNYW5hZ2VyAQJjbwQCY2wJAQJjaQEFAmNoAwkAAAIFAmNsBQJjbAQCY3AJANkEAQUCY28DCQAAAgUCY3AFAmNwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUCY28FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjaAEOY29uZmlybU1hbmFnZXIABAJjcQkBAmNlAAQCY3IDCQEJaXNEZWZpbmVkAQUCY3EGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmNyBQJjcgQCY3MDCQAAAggFAmNoD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCY3EGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmNzBQJjcwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwAJANgEAQkBBXZhbHVlAQUCY3EJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2gBBXN0YWtlAAMJAQIhPQIJAJADAQgFAmNoCHBheW1lbnRzAAEJAAIBAjRpbnZhbGlkIHBheW1lbnQgLSBleGFjdCBvbmUgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAJjdAkAkQMCCAUCY2gIcGF5bWVudHMAAAQCYXkJAQV2YWx1ZQEIBQJjdAdhc3NldElkBAJhcQkA2AQBBQJheQQCYVEIBQJjdAZhbW91bnQEAmJ0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYVUJAQFXAQUCYXEJAKwCAgIVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJhcQQCY3UJAKUIAQgFAmNoBmNhbGxlcgQCYXADCQAAAgUCY3UFAmJ0CQClCAEIBQJjaAxvcmlnaW5DYWxsZXIFAmN1BAJiVQkBAmFvAgUCYXAFAmFxBAJidgkBAmFyAQUCYXEEAmJvCQECYXcBBQJiVQQCYncJAQJhdwEFAmJ2BAJjdgkBAmJRBAUCYXEFAmFwBQJidAUCYVEEAmNhCAUCY3YCXzEEAmN3CAUCY3YCXzIEAmJQCAUCY3YCXzMEAmJhCQECYVkBBQJhcQQCY3gDCQECYmYCBQJiYQUCYXAFA25pbAkBAmJqAgUCYmEFAmFwCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYlUJAGQCBQJibwUCYVEJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJ2CQBkAgUCYncFAmFRCQDMCAIJAQJhUgUCBXN0YWtlBQJhcAUCYXEFAmFRCAUCY2gNdHJhbnNhY3Rpb25JZAUDbmlsBQJjdwUCY3gCY2gBB3Vuc3Rha2UCAmFxAmFRBAJheQkA2QQBBQJhcQQCYnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhVQkBAVcBBQJhcQkArAICAhV1bnN1cHBvcnRlZCBscCBhc3NldCAFAmFxBAJjeQkBC3ZhbHVlT3JFbHNlAgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQJidAkBAVYABQJidAQCY3UJAKUIAQgFAmNoBmNhbGxlcgQCYXADAwkAAAIFAmN1BQJidAYJAAACBQJjdQUCY3kJAKUIAQgFAmNoDG9yaWdpbkNhbGxlcgUCY3UEAmJVCQECYW8CBQJhcAUCYXEEAmJ2CQECYXIBBQJhcQQCYm8JAQJhdwEFAmJVBAJidwkBAmF3AQUCYnYEAmN3CAkBAmJRBAUCYXEFAmFwBQJidAkBAS0BBQJhUQJfMgQCYmEJAQJhWQEFAmFxBAJjeAMDCQECYmYCBQJiYQUCYXAJAAACBQJhUQUCYm8HCQECYm0CBQJiYQUCYXAFA25pbAQCY3oJAQFBAgUEdGhpcwkBAmFzAgUCYXEFAmFwBAJjQQkBAXYCBQJhVQkBAVoBBQJhcQQCY2EICQECYlEEBQJhcQUCYXAFAmNBAAACXzEEAmNCCQC4AgIFAmNhBQJjegQCY0MDCQC/AgIFAmNCBQFnCQD8BwQFBHRoaXMCD2NsYWltV3hJTlRFUk5BTAkAzAgCBQJhcQkAzAgCBQJhcAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0MFAmNDAwkAZgIFAmFRBQJibwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOcGFzc2VkIGFtb3VudD0JAKQDAQUCYVECGyBpcyBncmVhdGVyIHRoYW4gYXZhaWxhYmxlPQkApAMBBQJibwIMLiBscEFzc2V0SWQ9BQJhcQISLiBzdGFrZWRCeVVzZXJLRVk9BQJiVQkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJVCQBlAgUCYm8FAmFRCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJidgkAZQIFAmJ3BQJhUQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCY2gGY2FsbGVyBQJhUQUCYXkJAMwIAgkBAmFSBQIHdW5zdGFrZQUCYXAFAmFxBQJhUQgFAmNoDXRyYW5zYWN0aW9uSWQFA25pbAUCY3cFAmN4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNoAQdjbGFpbVd4AQJhcQQCYXAJAKUIAQgFAmNoBmNhbGxlcgQCY0QJAPwHBAUEdGhpcwIPY2xhaW1XeElOVEVSTkFMCQDMCAIFAmFxCQDMCAIFAmFwBQNuaWwFA25pbAkAlAoCBQNuaWwFAmNEAmNoAQ9jbGFpbVd4SU5URVJOQUwCAmFxAmFwBAJjbAkBAmNnAQUCY2gDCQAAAgUCY2wFAmNsBAJhQQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAmFwAiVjbGFpbVd4SU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzBAJidAkBAXYCBQJhVQkBAVoBBQJhcQQCY0UJAQJhcwIFAmFxBQJhcAQCY0YJAQJhdgEFAmFxBAJjRwkBAmF0AgUCYXEFAmFwBAJjSAkBAmF1AgUCYXEFAmFwBAJjegkBAUECBQR0aGlzBQJjRQQCY0kJAQFBAgUEdGhpcwUCY0cEAmNKCQEBQQIFBHRoaXMFAmNIBAJjSwkBAUECBQR0aGlzBQJjRgQCY0wJAQJiUQQFAmFxBQJhcAUCYnQAAAQCY2EIBQJjTAJfMQQCY3cIBQJjTAJfMgQCYlAIBQJjTAJfMwQCY0IJAJgDAQkAzAgCCQC4AgIFAmNhBQJjegkAzAgCBQFnBQNuaWwDCQDAAgIFAWcFAmNCCQACAQIQbm90aGluZyB0byBjbGFpbQQCY00JAJYDAQkAzAgCCQEBbQEJAJEDAgkBAWkBCQD8BwQFAmFXAgxjbGFpbVd4Qm9vc3QJAMwIAgUCYXEJAMwIAgUCYXAFA25pbAUDbmlsAAAJAMwIAgAABQNuaWwEAmNOBQJjQgQCY08JAJkDAQkAzAgCCQC5AgIFAmNOCQC2AgEAAgkAzAgCCQC2AgEFAmNNBQNuaWwEAmNQCQC3AgIFAmNOBQJjTwQCY1EJAQFxAQkAkQMCCQEBaQEJAPwHBAUCYVYCBGVtaXQJAMwIAgkAoAMBBQJjTgUDbmlsBQNuaWwAAAQCY1IJAQFpAQkA/AcEBQJhVgIEZW1pdAkAzAgCCQCgAwEFAmNPBQNuaWwFA25pbAMJAAACBQJjUgUCY1IEAmNTCQC3AgIFAmN6BQJjQgQCY1QJALcCAgUCY0kFAmNOBAJjVQkAtwICBQJjSQUCY04EAmNWCQC3AgIFAmNJBQJjTgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNFCQCmAwEFAmNTCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNHCQCmAwEFAmNUCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNICQCmAwEFAmNVCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNGCQCmAwEFAmNWCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFBCQCgAwEFAmNOBQJjUQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhQQkAoAMBBQJjTwUCY1EJAMwIAgkBAmFSBQIFY2xhaW0FAmFwBQJhcQkAoAMBBQJjQggFAmNoDXRyYW5zYWN0aW9uSWQFA25pbAkAoAMBBQJjUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjaAEbY2xhaW1XeEJ1bGtJbnRlcm5hbFJFQURPTkxZBAJjVwJjWAJhcAJjWQMJAAACBQJjVwkAkAMBBQJjWAkAlAoCBQNuaWwFAmNZBAJheQkAkQMCBQJjWAUCY1cEAmNaCQC1CQIKAAJkYQkA/AcEBQR0aGlzAg9jbGFpbVd4UkVBRE9OTFkJAMwIAgUCYXkJAMwIAgUCYXAFA25pbAUDbmlsAwkAAQIFAmRhAgZTdHJpbmcFAmRhCQACAQkArAICCQADAQUCZGECGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwUBZQQCZGIJAJEDAgUCY1oAAwQCZGMJAJEDAgUCY1oABAQCZGQJAM0IAgUCY1kJALkJAgkAzAgCAgQlZCVkCQDMCAIFAmRiCQDMCAIFAmRjBQNuaWwFAWUEAmRlCgACZGEJAPwHBAUEdGhpcwIbY2xhaW1XeEJ1bGtJbnRlcm5hbFJFQURPTkxZCQDMCAIJAGQCBQJjVwABCQDMCAIFAmNYCQDMCAIFAmFwCQDMCAIFAmRkBQNuaWwFA25pbAMJAAECBQJkYQIJTGlzdFtBbnldBQJkYQkAAgEJAKwCAgkAAwEFAmRhAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUCZGUFAmRlCQCUCgIFA25pbAUCZGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2gBE2NsYWltV3hCdWxrUkVBRE9OTFkCAmNYAmFwBAJkZAkA/AcEBQR0aGlzAhtjbGFpbVd4QnVsa0ludGVybmFsUkVBRE9OTFkJAMwIAgAACQDMCAIFAmNYCQDMCAIFAmFwCQDMCAIFA25pbAUDbmlsBQNuaWwJAJQKAgUDbmlsBQJkZAJjaAEPY2xhaW1XeFJFQURPTkxZAgJhcQJhcAQCYlUJAQJhbwIFAmFwBQJhcQQCYnYJAQJhcgEFAmFxBAJjRQkBAmFzAgUCYXEFAmFwBAJibwkBAmF3AQUCYlUEAmJ3CQECYXcBBQJidgQCY3oJAQFBAgUEdGhpcwUCY0UEAmJ0CQEBdgIFAmFVCQEBWgEFAmFxBAJieQkBEUBleHRyTmF0aXZlKDEwNTApAgUCYVUJAQJhYQEFAmJ0BAJkZgkBAXoCBQJhVgkBAmFqAAQCYnoJAQF6AgUCYVYJAQJhbAAEAmRnAwkAZgIFAmJ6BQZoZWlnaHQAAAkAZQIFBmhlaWdodAUCYnoEAmRoCQBrAwkAaAIFAmRmBQJkZwUCYnkFAWYEAmRpCQBrAwUCZGgFAmJvBQJidwQCZGoJAQJiUQQFAmFxBQJhcAUCYnQAAAQCY2EIBQJkagJfMQQCY3cIBQJkagJfMgQCYlAIBQJkagJfMwQCY0IJAJgDAQkAzAgCCQC4AgIFAmNhBQJjegkAzAgCBQFnBQNuaWwEAmRrCQEBaQEJAPwHBAUCYVcCFGNsYWltV3hCb29zdFJFQURPTkxZCQDMCAIFAmFxCQDMCAIFAmFwBQNuaWwFA25pbAQCY00JAJYDAQkAzAgCCQEBbQEJAJEDAgUCZGsAAAkAzAgCAAAFA25pbAQCZGwJAQFvAQkAkQMCBQJkawABBAJjTgUCY0IEAmNPCQCZAwEJAMwIAgkAuQICBQJjTgkAtgIBAAIJAMwIAgkAtgIBBQJjTQUDbmlsBAJjUAkAtwICBQJjTgUCY08JAJQKAgUDbmlsCQC5CQIJAMwIAgIOJXMlcyVkJWQlZCVkJXMJAMwIAgUCYXEJAMwIAgUCYXAJAMwIAgkApgMBBQJjUAkAzAgCCQCmAwEFAmN6CQDMCAIJAKYDAQUCY04JAMwIAgkApgMBBQJjTwkAzAgCAgRzb29uBQNuaWwFAWUCY2gBFHN0YWtlZEJ5VXNlclJFQURPTkxZAgJhcQJhcAQCYm8JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmFvAgUCYXAFAmFxAAAJAJQKAgUDbmlsBQJibwJjaAESdXNlcnNMaXN0VHJhdmVyc2FsAQJheQQCY2wDCQAAAgkA2AQBCAgFAmNoBmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEBSgACAAYJAQJjaQEFAmNoAwkAAAIFAmNsBQJjbAQCYmEJAQJhWQEFAmF5BAJkbQkAoggBCQECYVgBBQJheQQCYmcJAKIIAQkBAmFaAQUCYmEEAWsFAmRtAwkAAQIFAWsCBFVuaXQEAmRuBQJiZwMJAAECBQJkbgIEVW5pdAkAlAoCBQNuaWwHAwkAAQIFAmRuAgZTdHJpbmcEAmRvBQJkbgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhWAEFAmF5BQJkbwUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFAWsCBlN0cmluZwQCYUEFAWsEAmN6CQEBQQIFBHRoaXMJAQJhcwIFAmF5BQJhQQQCY0EJAQF2AgUCYVUJAQFaAQUCYXkEAmNhCAkBAmJRBAUCYXkFAmFBBQJjQQAAAl8xBAJjQgkAuAICBQJjYQUCY3oEAmNDAwkAvwICBQJjQgUBZwkA/AcEBQR0aGlzAg9jbGFpbVd4SU5URVJOQUwJAMwIAgUCYXkJAMwIAgUCYUEFA25pbAUDbmlsBQR1bml0AwkAAAIFAmNDBQJjQwQCZHAJAKIIAQkBAmJlAgUCYmEFAmFBBAJkbgUCZHADCQABAgUCZG4CBFVuaXQJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQECYVgBBQJheQUDbmlsBwMJAAECBQJkbgIGU3RyaW5nBAJkcQUCZG4JAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYVgBBQJheQUCZHEFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC01hdGNoIGVycm9yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNoAQ5vbk1vZGlmeVdlaWdodAICYXECYnQDCQECIT0CCAUCY2gGY2FsbGVyBQJhVQkAAgECEnBlcm1pc3Npb25zIGRlbmllZAQCZHIJAQJicwMFAmFxBQJidAAABAJicQgFAmRyAl8xBAJiUwgFAmRyAl8yBAJiVAgFAmRyAl8zBQJiUwECZHMBAmR0AAQCZHUEAWsJAQJjZAADCQABAgUBawIKQnl0ZVZlY3RvcgQCY2oFAWsFAmNqAwkAAQIFAWsCBFVuaXQIBQJkcw9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCZHMJYm9keUJ5dGVzCQCRAwIIBQJkcwZwcm9vZnMAAAUCZHVwxlQD", "chainId": 84, "height": 2400270, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EfzYkYm6CCLU4X7x256TKkBDXcJa3b18LCMDbuuEtYVu Next: 251Mw6d5UbznYEarnuadiw52AaEm5TwgMcyqNXwbc84Q Diff:
OldNewDifferences
581581 let claimedByUserMinRewardPlusPart = (claimedByUserMinReward + minRewardPart)
582582 let claimedByUserBoostRewardPlusBoostRewardPart = (claimedByUserMinReward + minRewardPart)
583583 let claimedTotalPlusAvailableToClaim = (claimedByUserMinReward + minRewardPart)
584- $Tuple2([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)], totalReward)
584+ $Tuple2([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)], toInt(totalReward))
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
643643 else (height - emissionStartBlock)
644644 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
645645 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
646- let $t02644426556 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
647- let wxToClaimUserNew = $t02644426556._1
648- let integralSTATE = $t02644426556._2
649- let debug = $t02644426556._3
646+ let $t02645226564 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
647+ let wxToClaimUserNew = $t02645226564._1
648+ let integralSTATE = $t02645226564._2
649+ let debug = $t02645226564._3
650650 let availableToClaim = max([(wxToClaimUserNew - claimedByUser), zeroBigInt])
651651 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
652652 let wxAmountBoostTotal = max([asInt(boostInvResult[0]), 0])
721721 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
722722 then throw("permissions denied")
723723 else {
724- let $t02906429174 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
725- let wxPerLpIntegralNew = $t02906429174._1
726- let poolIntegralSTATE = $t02906429174._2
727- let poolDEBUG = $t02906429174._3
724+ let $t02907229182 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
725+ let wxPerLpIntegralNew = $t02907229182._1
726+ let poolIntegralSTATE = $t02907229182._2
727+ let poolDEBUG = $t02907229182._3
728728 poolIntegralSTATE
729729 }
730730
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT8 = 100000000
77
88 let SCALE18 = 18
99
1010 let MULT18 = toBigInt(1000000000000000000)
1111
1212 let SEP = "__"
1313
1414 let POOLWEIGHTMULT = MULT8
1515
1616 let zeroBigInt = toBigInt(0)
1717
1818 let oneBigInt = toBigInt(1)
1919
2020 func asAnyList (val) = match val {
2121 case valAnyLyst: List[Any] =>
2222 valAnyLyst
2323 case _ =>
2424 throw("fail to cast into List[Any]")
2525 }
2626
2727
2828 func asInt (val) = match val {
2929 case valInt: Int =>
3030 valInt
3131 case _ =>
3232 throw("fail to cast into Int")
3333 }
3434
3535
3636 func asString (val) = match val {
3737 case valStr: String =>
3838 valStr
3939 case _ =>
4040 throw("fail to cast into Int")
4141 }
4242
4343
4444 func asByteVector (val) = match val {
4545 case valBin: ByteVector =>
4646 valBin
4747 case _ =>
4848 throw("fail to cast into Int")
4949 }
5050
5151
5252 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
5353
5454
5555 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
5656
5757
5858 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
5959
6060
6161 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
6262
6363
6464 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
6565
6666
6767 func getBigIntFromStringOrZero (address,key) = value(parseBigInt(valueOrElse(getString(address, key), "0")))
6868
6969
7070 func getBigIntFromStringOrDefault (address,key,defaultVal) = match getString(address, key) {
7171 case s: String =>
7272 value(parseBigInt(s))
7373 case _: Unit =>
7474 defaultVal
7575 case _ =>
7676 throw("Match error")
7777 }
7878
7979
8080 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
8181
8282
8383 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
8484
8585
8686 func keyFactoryAddress () = "%s%s__config__factoryAddress"
8787
8888
8989 func keyVotingEmissionContract () = "%s__votingEmissionContract"
9090
9191
9292 let IdxFactoryCfgStakingDapp = 1
9393
9494 let IdxFactoryCfgBoostingDapp = 2
9595
9696 let IdxFactoryCfgIdoDapp = 3
9797
9898 let IdxFactoryCfgTeamDapp = 4
9999
100100 let IdxFactoryCfgEmissionDapp = 5
101101
102102 let IdxFactoryCfgRestDapp = 6
103103
104104 let IdxFactoryCfgSlippageDapp = 7
105105
106106 func keyFactoryCfg () = "%s__factoryConfig"
107107
108108
109109 func keyManagerPublicKey () = "%s__managerPublicKey"
110110
111111
112112 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
113113
114114
115115 func keyStablePoolAddonAddr () = "%s__stablePoolAddonAddr"
116116
117117
118118 func keyAddonAddr () = "%s__addonAddr"
119119
120120
121121 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
122122
123123
124124 func keyFactoryLpList () = "%s__lpTokensList"
125125
126126
127127 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
128128
129129
130130 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
131131
132132
133133 func readLpList (factory) = split(valueOrElse(getString(factory, keyFactoryLpList()), ""), SEP)
134134
135135
136136 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
137137
138138
139139 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
140140
141141
142142 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
143143
144144
145145 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
146146
147147
148148 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
149149
150150
151151 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
152152
153153
154154 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
155155
156156
157157 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
158158
159159
160160 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
161161
162162
163163 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
164164
165165
166166 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
167167
168168
169169 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
170170
171171
172172 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
173173
174174
175175 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
176176
177177
178178 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed__total", lpAssetIdStr], SEP)
179179
180180
181181 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
182182
183183
184184 func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
185185
186186
187187 func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
188188
189189
190190 func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
191191
192192
193193 func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
194194
195195
196196 func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
197197
198198
199199 func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
200200
201201
202202 func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
203203
204204
205205 func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
206206
207207
208208 func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
209209
210210
211211 func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
212212
213213
214214 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
215215
216216
217217 func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
218218
219219
220220 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
221221
222222
223223 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
224224
225225
226226 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
227227
228228
229229 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
230230
231231
232232 let factoryAddress = getStringOrFail(this, keyFactoryAddress())
233233
234234 let factoryContract = addressFromStringValue(factoryAddress)
235235
236236 let factoryCfg = readFactoryCfgOrFail(factoryContract)
237237
238238 let emissionContract = getEmissionAddressOrFail(factoryCfg)
239239
240240 let boostingContract = getBoostingAddressOrFail(factoryCfg)
241241
242242 func keyNextUser (lpAssetId) = makeString(["%s%s", lpAssetId, "nextUser"], SEP)
243243
244244
245245 func getUsersListName (lpAssetId) = makeString(["users", lpAssetId], SEP)
246246
247247
248248 func keyListHead (listName) = makeString(["%s%s%s", listName, "head"], SEP)
249249
250250
251251 func keyListSize (listName) = makeString(["%s%s%s", listName, "size"], SEP)
252252
253253
254254 func keyListPrev (listName,id) = makeString(["%s%s%s%s", listName, id, "prev"], SEP)
255255
256256
257257 func keyListNext (listName,id) = makeString(["%s%s%s%s", listName, id, "next"], SEP)
258258
259259
260260 func containsNode (listName,id) = {
261261 let headOrUnit = getString(this, keyListHead(listName))
262262 let prevOrUnit = getString(this, keyListPrev(listName, id))
263263 let nextOrUnit = getString(this, keyListNext(listName, id))
264264 if (if ((id == valueOrElse(headOrUnit, "")))
265265 then true
266266 else (prevOrUnit != unit))
267267 then true
268268 else (nextOrUnit != unit)
269269 }
270270
271271
272272 func insertNodeActions (listName,id) = {
273273 let headOrUnit = getString(this, keyListHead(listName))
274274 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
275275 let checkNode = if (!(containsNode(listName, id)))
276276 then true
277277 else throw("Node exists")
278278 if ((checkNode == checkNode))
279279 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
280280 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
281281 else nil)) ++ [StringEntry(keyListHead(listName), id)])
282282 else throw("Strict value is not equal to itself.")
283283 }
284284
285285
286286 func deleteNodeActions (listName,id) = {
287287 let headOrUnit = getString(this, keyListHead(listName))
288288 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
289289 let prevOrUnit = getString(this, keyListPrev(listName, id))
290290 let nextOrUnit = getString(this, keyListNext(listName, id))
291291 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
292292 then (nextOrUnit != unit)
293293 else false)
294294 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
295295 else if ((nextOrUnit != unit))
296296 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
297297 else if ((prevOrUnit != unit))
298298 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
299299 else if ((id == valueOrElse(headOrUnit, "")))
300300 then [DeleteEntry(keyListHead(listName))]
301301 else throw(((("invalid node: " + listName) + ".") + id))))
302302 }
303303
304304
305305 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == zeroBigInt))
306306 then (stakedByUser > zeroBigInt)
307307 else false)
308308 then zeroBigInt
309309 else if ((stakedByUser == zeroBigInt))
310310 then wxPerLpIntegralNew
311311 else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > zeroBigInt))
312312 then (stakedByUser > zeroBigInt)
313313 else false)
314314 then value(parseBigInt(getStringOrFail(this, wxPerLpIntegralUserLastKEY)))
315315 else throw("calcWxPerLpIntegralUserLast: unexpected state")
316316
317317
318318 func refreshPoolINTEGRALS (lpAssetIdStr,poolAddressStr,lpDeltaAmount) = {
319319 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
320320 let stakedTotal = toBigInt(readStaked(stakedTotalKEY))
321321 let nonZeroStakedTotal = if ((stakedTotal == zeroBigInt))
322322 then oneBigInt
323323 else stakedTotal
324324 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
325325 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
326326 let MULT3 = 1000
327327 let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
328328 let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
329329 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
330330 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
331331 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
332332 let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
333333 let wxPerLpIntegral = getBigIntFromStringOrZero(this, wxPerLpIntegralKEY)
334334 let wxPerLpOrZeroX3 = 0
335335 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
336336 let wxPerLpX3 = if ((wxPerLpOrZeroX3 != 0))
337337 then toBigInt(wxPerLpOrZeroX3)
338338 else fraction(toBigInt(poolWxEmissionPerBlockX3), toBigInt(MULT8), nonZeroStakedTotal)
339339 let stakedTotalNew = (stakedTotal + toBigInt(lpDeltaAmount))
340340 let nonZeroStakedTotalNew = if ((stakedTotalNew == zeroBigInt))
341341 then oneBigInt
342342 else stakedTotalNew
343343 let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX3 * toBigInt(dh)))
344344 let wxPerLpX3New = (toBigInt(poolWxEmissionPerBlockX3) / nonZeroStakedTotalNew)
345345 let wxPerLpIntegralLastUpdHeightNew = height
346346 let debug = makeString([toString(wxPerLpIntegralNew), toString(dh), toString(wxPerLpX3), toString(stakedTotal), toString(poolWxEmissionPerBlockX3), toString(wxEmissionPerBlockX3), toString(poolWeight)], "::")
347347 $Tuple3(wxPerLpIntegralNew, [StringEntry(wxPerLpIntegralKEY, toString(wxPerLpIntegralNew)), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), StringEntry(wxPerLpKEY, toString(wxPerLpX3New))], debug)
348348 }
349349
350350
351351 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
352352 let $t01427414396 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
353353 let wxPerLpIntegralNew = $t01427414396._1
354354 let poolIntegralSTATE = $t01427414396._2
355355 let poolDEBUG = $t01427414396._3
356356 let MULT3 = 1000
357357 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
358358 let stakedByUser = readStaked(stakedByUserKEY)
359359 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
360360 let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
361361 let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
362362 let wxToClaimUser = getBigIntFromStringOrZero(this, wxToClaimUserKEY)
363363 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
364364 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(toBigInt(stakedByUser), toBigInt(wxPerLpIntegralUserLastUpdHeightOrZero), wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
365365 let MULT11 = (MULT8 * MULT3)
366366 let wxToClaimUserNew = max([(wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), toBigInt(stakedByUser), toBigInt(MULT11))), zeroBigInt])
367367 let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
368368 let wxPerLpIntegralUserLastUpdHeightNew = height
369369 let debug = makeString([toString(wxToClaimUser), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
370370 $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [StringEntry(wxToClaimUserKEY, toString(wxToClaimUserNew)), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), StringEntry(wxPerLpIntegralUserLastKEY, toString(wxPerLpIntegralUserLastNew))]), debug)
371371 }
372372
373373
374374 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
375375 case s: String =>
376376 fromBase58String(s)
377377 case _: Unit =>
378378 unit
379379 case _ =>
380380 throw("Match error")
381381 }
382382
383383
384384 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
385385 case s: String =>
386386 fromBase58String(s)
387387 case _: Unit =>
388388 unit
389389 case _ =>
390390 throw("Match error")
391391 }
392392
393393
394394 let permissionDeniedError = throw("Permission denied")
395395
396396 func mustThis (i) = if ((i.caller == this))
397397 then true
398398 else permissionDeniedError
399399
400400
401401 func mustManager (i) = match managerPublicKeyOrUnit() {
402402 case pk: ByteVector =>
403403 if ((i.callerPublicKey == pk))
404404 then true
405405 else permissionDeniedError
406406 case _: Unit =>
407407 if ((i.caller == this))
408408 then true
409409 else permissionDeniedError
410410 case _ =>
411411 throw("Match error")
412412 }
413413
414414
415415 @Callable(i)
416416 func constructor (factoryAddressStr) = {
417417 let checkCaller = mustManager(i)
418418 if ((checkCaller == checkCaller))
419419 then [StringEntry(keyFactoryAddress(), factoryAddressStr)]
420420 else throw("Strict value is not equal to itself.")
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func constructorV2 (votingEmissionContract) = {
427427 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
428428 then true
429429 else "invalid voting emission contract address"]
430430 if ((cheks == cheks))
431431 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract)]
432432 else throw("Strict value is not equal to itself.")
433433 }
434434
435435
436436
437437 @Callable(i)
438438 func setManager (pendingManagerPublicKey) = {
439439 let checkCaller = mustManager(i)
440440 if ((checkCaller == checkCaller))
441441 then {
442442 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
443443 if ((checkManagerPublicKey == checkManagerPublicKey))
444444 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
445445 else throw("Strict value is not equal to itself.")
446446 }
447447 else throw("Strict value is not equal to itself.")
448448 }
449449
450450
451451
452452 @Callable(i)
453453 func confirmManager () = {
454454 let pm = pendingManagerPublicKeyOrUnit()
455455 let hasPM = if (isDefined(pm))
456456 then true
457457 else throw("No pending manager")
458458 if ((hasPM == hasPM))
459459 then {
460460 let checkPM = if ((i.callerPublicKey == value(pm)))
461461 then true
462462 else throw("You are not pending manager")
463463 if ((checkPM == checkPM))
464464 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
465465 else throw("Strict value is not equal to itself.")
466466 }
467467 else throw("Strict value is not equal to itself.")
468468 }
469469
470470
471471
472472 @Callable(i)
473473 func stake () = if ((size(i.payments) != 1))
474474 then throw("invalid payment - exact one payment must be attached")
475475 else {
476476 let pmt = i.payments[0]
477477 let lpAssetId = value(pmt.assetId)
478478 let lpAssetIdStr = toBase58String(lpAssetId)
479479 let amount = pmt.amount
480480 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
481481 let callerStr = toString(i.caller)
482482 let userAddressStr = if ((callerStr == poolAddressStr))
483483 then toString(i.originCaller)
484484 else callerStr
485485 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
486486 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
487487 let stakedByUser = readStaked(stakedByUserKEY)
488488 let stakedTotal = readStaked(stakedTotalKEY)
489489 let $t01883218949 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
490490 let wxToClaimUserNew = $t01883218949._1
491491 let integralSTATE = $t01883218949._2
492492 let debug = $t01883218949._3
493493 let listName = getUsersListName(lpAssetIdStr)
494494 let listActions = if (containsNode(listName, userAddressStr))
495495 then nil
496496 else insertNodeActions(listName, userAddressStr)
497497 (([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE) ++ listActions)
498498 }
499499
500500
501501
502502 @Callable(i)
503503 func unstake (lpAssetIdStr,amount) = {
504504 let lpAssetId = fromBase58String(lpAssetIdStr)
505505 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
506506 let poolAddon = valueOrElse(getString(addressFromStringValue(poolAddressStr), keyAddonAddr()), poolAddressStr)
507507 let callerStr = toString(i.caller)
508508 let userAddressStr = if (if ((callerStr == poolAddressStr))
509509 then true
510510 else (callerStr == poolAddon))
511511 then toString(i.originCaller)
512512 else callerStr
513513 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
514514 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
515515 let stakedByUser = readStaked(stakedByUserKEY)
516516 let stakedTotal = readStaked(stakedTotalKEY)
517517 let integralSTATE = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))._2
518518 let listName = getUsersListName(lpAssetIdStr)
519519 let listActions = if (if (containsNode(listName, userAddressStr))
520520 then (amount == stakedByUser)
521521 else false)
522522 then deleteNodeActions(listName, userAddressStr)
523523 else nil
524524 let claimedByUser = getBigIntFromStringOrZero(this, keyClaimedByUser(lpAssetIdStr, userAddressStr))
525525 let poolAddress = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
526526 let wxToClaimUserNew = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddress, 0)._1
527527 let availableToClaim = (wxToClaimUserNew - claimedByUser)
528528 let r = if ((availableToClaim > zeroBigInt))
529529 then invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr], nil)
530530 else unit
531531 if ((r == r))
532532 then if ((amount > stakedByUser))
533533 then throw(((((((("passed amount=" + toString(amount)) + " is greater than available=") + toString(stakedByUser)) + ". lpAssetId=") + lpAssetIdStr) + ". stakedByUserKEY=") + stakedByUserKEY))
534534 else (([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE) ++ listActions)
535535 else throw("Strict value is not equal to itself.")
536536 }
537537
538538
539539
540540 @Callable(i)
541541 func claimWx (lpAssetIdStr) = {
542542 let userAddressStr = toString(i.caller)
543543 let result = invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr], nil)
544544 $Tuple2(nil, result)
545545 }
546546
547547
548548
549549 @Callable(i)
550550 func claimWxINTERNAL (lpAssetIdStr,userAddressStr) = {
551551 let checkCaller = mustThis(i)
552552 if ((checkCaller == checkCaller))
553553 then {
554554 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), "claimWxINTERNAL: invalid user address")
555555 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
556556 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
557557 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
558558 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
559559 let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
560560 let claimedByUser = getBigIntFromStringOrZero(this, claimedByUserKEY)
561561 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
562562 let claimedByUserBoostReward = getBigIntFromStringOrZero(this, claimedByUserBoostRewardKEY)
563563 let claimedTotal = getBigIntFromStringOrZero(this, claimedTotalKEY)
564564 let $t02278722899 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
565565 let wxToClaimUserNew = $t02278722899._1
566566 let integralSTATE = $t02278722899._2
567567 let debug = $t02278722899._3
568568 let availableToClaim = max([(wxToClaimUserNew - claimedByUser), zeroBigInt])
569569 if ((zeroBigInt >= availableToClaim))
570570 then throw("nothing to claim")
571571 else {
572572 let wxAmountBoostTotal = max([asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [lpAssetIdStr, userAddressStr], nil))[0]), 0])
573573 let minRewardPart = availableToClaim
574574 let boostRewardPart = min([(minRewardPart * toBigInt(2)), toBigInt(wxAmountBoostTotal)])
575575 let totalReward = (minRewardPart + boostRewardPart)
576576 let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [toInt(minRewardPart)], nil))[0])
577577 let emitBoost = asAnyList(invoke(emissionContract, "emit", [toInt(boostRewardPart)], nil))
578578 if ((emitBoost == emitBoost))
579579 then {
580580 let claimedByUserValue = (claimedByUser + availableToClaim)
581581 let claimedByUserMinRewardPlusPart = (claimedByUserMinReward + minRewardPart)
582582 let claimedByUserBoostRewardPlusBoostRewardPart = (claimedByUserMinReward + minRewardPart)
583583 let claimedTotalPlusAvailableToClaim = (claimedByUserMinReward + minRewardPart)
584- $Tuple2([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)], totalReward)
584+ $Tuple2([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)], toInt(totalReward))
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
588588 }
589589 else throw("Strict value is not equal to itself.")
590590 }
591591
592592
593593
594594 @Callable(i)
595595 func claimWxBulkInternalREADONLY (currentIter,lpAssetIds,userAddressStr,resAcc) = if ((currentIter == size(lpAssetIds)))
596596 then $Tuple2(nil, resAcc)
597597 else {
598598 let lpAssetId = lpAssetIds[currentIter]
599599 let info = split({
600600 let @ = invoke(this, "claimWxREADONLY", [lpAssetId, userAddressStr], nil)
601601 if ($isInstanceOf(@, "String"))
602602 then @
603603 else throw(($getType(@) + " couldn't be cast to String"))
604604 }, SEP)
605605 let unclaimed = info[3]
606606 let claimed = info[4]
607607 let res = (resAcc :+ makeString(["%d%d", unclaimed, claimed], SEP))
608608 let inv = {
609609 let @ = invoke(this, "claimWxBulkInternalREADONLY", [(currentIter + 1), lpAssetIds, userAddressStr, res], nil)
610610 if ($isInstanceOf(@, "List[Any]"))
611611 then @
612612 else throw(($getType(@) + " couldn't be cast to List[Any]"))
613613 }
614614 if ((inv == inv))
615615 then $Tuple2(nil, inv)
616616 else throw("Strict value is not equal to itself.")
617617 }
618618
619619
620620
621621 @Callable(i)
622622 func claimWxBulkREADONLY (lpAssetIds,userAddressStr) = {
623623 let res = invoke(this, "claimWxBulkInternalREADONLY", [0, lpAssetIds, userAddressStr, nil], nil)
624624 $Tuple2(nil, res)
625625 }
626626
627627
628628
629629 @Callable(i)
630630 func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
631631 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
632632 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
633633 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
634634 let stakedByUser = readStaked(stakedByUserKEY)
635635 let stakedTotal = readStaked(stakedTotalKEY)
636636 let claimedByUser = getBigIntFromStringOrZero(this, claimedByUserKEY)
637637 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
638638 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
639639 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
640640 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
641641 let passedBlocks = if ((emissionStartBlock > height))
642642 then 0
643643 else (height - emissionStartBlock)
644644 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
645645 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
646- let $t02644426556 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
647- let wxToClaimUserNew = $t02644426556._1
648- let integralSTATE = $t02644426556._2
649- let debug = $t02644426556._3
646+ let $t02645226564 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
647+ let wxToClaimUserNew = $t02645226564._1
648+ let integralSTATE = $t02645226564._2
649+ let debug = $t02645226564._3
650650 let availableToClaim = max([(wxToClaimUserNew - claimedByUser), zeroBigInt])
651651 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
652652 let wxAmountBoostTotal = max([asInt(boostInvResult[0]), 0])
653653 let boostDebug = asString(boostInvResult[1])
654654 let minRewardPart = availableToClaim
655655 let boostRewardPart = min([(minRewardPart * toBigInt(2)), toBigInt(wxAmountBoostTotal)])
656656 let totalReward = (minRewardPart + boostRewardPart)
657657 $Tuple2(nil, makeString(["%s%s%d%d%d%d%s", lpAssetIdStr, userAddressStr, toString(totalReward), toString(claimedByUser), toString(minRewardPart), toString(boostRewardPart), "soon"], SEP))
658658 }
659659
660660
661661
662662 @Callable(i)
663663 func stakedByUserREADONLY (lpAssetIdStr,userAddressStr) = {
664664 let stakedByUser = valueOrElse(getInteger(keyStakedByUser(userAddressStr, lpAssetIdStr)), 0)
665665 $Tuple2(nil, stakedByUser)
666666 }
667667
668668
669669
670670 @Callable(i)
671671 func usersListTraversal (lpAssetId) = {
672672 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
673673 then true
674674 else mustManager(i)
675675 if ((checkCaller == checkCaller))
676676 then {
677677 let listName = getUsersListName(lpAssetId)
678678 let userOrUnit = getString(keyNextUser(lpAssetId))
679679 let headOrUnit = getString(keyListHead(listName))
680680 match userOrUnit {
681681 case _: Unit =>
682682 match headOrUnit {
683683 case _: Unit =>
684684 $Tuple2(nil, false)
685685 case head: String =>
686686 $Tuple2([StringEntry(keyNextUser(lpAssetId), head)], true)
687687 case _ =>
688688 throw("Match error")
689689 }
690690 case userAddress: String =>
691691 let claimedByUser = getBigIntFromStringOrZero(this, keyClaimedByUser(lpAssetId, userAddress))
692692 let poolAddress = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
693693 let wxToClaimUserNew = refreshINTEGRALS(lpAssetId, userAddress, poolAddress, 0)._1
694694 let availableToClaim = (wxToClaimUserNew - claimedByUser)
695695 let r = if ((availableToClaim > zeroBigInt))
696696 then invoke(this, "claimWxINTERNAL", [lpAssetId, userAddress], nil)
697697 else unit
698698 if ((r == r))
699699 then {
700700 let nextUserOrUnit = getString(keyListNext(listName, userAddress))
701701 match nextUserOrUnit {
702702 case _: Unit =>
703703 $Tuple2([DeleteEntry(keyNextUser(lpAssetId))], false)
704704 case nextUser: String =>
705705 $Tuple2([StringEntry(keyNextUser(lpAssetId), nextUser)], true)
706706 case _ =>
707707 throw("Match error")
708708 }
709709 }
710710 else throw("Strict value is not equal to itself.")
711711 case _ =>
712712 throw("Match error")
713713 }
714714 }
715715 else throw("Strict value is not equal to itself.")
716716 }
717717
718718
719719
720720 @Callable(i)
721721 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
722722 then throw("permissions denied")
723723 else {
724- let $t02906429174 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
725- let wxPerLpIntegralNew = $t02906429174._1
726- let poolIntegralSTATE = $t02906429174._2
727- let poolDEBUG = $t02906429174._3
724+ let $t02907229182 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
725+ let wxPerLpIntegralNew = $t02907229182._1
726+ let poolIntegralSTATE = $t02907229182._2
727+ let poolDEBUG = $t02907229182._3
728728 poolIntegralSTATE
729729 }
730730
731731
732732 @Verifier(tx)
733733 func verify () = {
734734 let targetPublicKey = match managerPublicKeyOrUnit() {
735735 case pk: ByteVector =>
736736 pk
737737 case _: Unit =>
738738 tx.senderPublicKey
739739 case _ =>
740740 throw("Match error")
741741 }
742742 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
743743 }
744744

github/deemru/w8io/026f985 
119.44 ms