tx · 29mtBhKRAQh5dMH7TYqryWqcsiUQQSZiwH2q7VG5JL8L

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02000000 Waves

2023.04.19 16:48 [2541523] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "29mtBhKRAQh5dMH7TYqryWqcsiUQQSZiwH2q7VG5JL8L", "fee": 2000000, "feeAssetId": null, "timestamp": 1681912178892, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "43nD94nAeS9XXD2VHdqRkLpZLs4KY7vzPv6H7JrSwvuNaaNmpAadMQyQpCrm9nW84mb9SST7K71zKj5HpQWHErjs" ], "script": "base64:BgKBHQgCEgYKBAEYEQESBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgQKAhgREgMKAQgSACIDU0VQIgVTQ0FMRSIFTVVMVDgiCnplcm9CaWdJbnQiFHByb2Nlc3NpbmdTdGFnZVRvdGFsIhVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMiC3dhdmVzU3RyaW5nIg5nZXROdW1iZXJCeUtleSIDa2V5Ig9nZXROdW1iZXJPckZhaWwiDmdldFN0cmluZ0J5S2V5Ig9nZXRTdHJpbmdPckZhaWwiDHBhcnNlQXNzZXRJZCIFaW5wdXQiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiA2FicyIDdmFsIglhYnNCaWdJbnQiC2tleU1heERlcHRoIg9tYXhEZXB0aERlZmF1bHQiCG1heERlcHRoIhFrZXlGYWN0b3J5QWRkcmVzcyIRZmFjdG9yeUFkZHJlc3NTdHIiD2ZhY3RvcnlDb250cmFjdCISa2V5RW1pc3Npb25BZGRyZXNzIhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IhNrZXlOdW1Ub1VzZXJNYXBwaW5nIgNudW0iFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUiGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0IhNyZWZlcnJhbFByb2dyYW1OYW1lIhdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudCIbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0IhRyZWZlcnJhbE1pbkdXeEFtb3VudCIZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZSIdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQiFnJlZmVycmVyUmV3YXJkUGVybWlsbGUiGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUiHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlIgtrZXlSZWZlcnJlciIPcmVmZXJyYWxBZGRyZXNzIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILcHJvZ3JhbU5hbWUiDmNsYWltZXJBZGRyZXNzIhJlbWlzc2lvbkFkZHJlc3NTdHIiEGVtaXNzaW9uQ29udHJhY3QiDUlkeENmZ0Fzc2V0SWQiFklkeENmZ1BhY2VtYWtlckFkZHJlc3MiFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QiDklkeENmZ01heERlcHRoIglrZXlDb25maWciEmdldEVtaXNzaW9uQWRkcmVzcyIPZW1pc3Npb25BZGRyZXNzIgx3eEFzc2V0SWRTdHIiCXd4QXNzZXRJZCIVcmVhZENvbmZpZ0FycmF5T3JGYWlsIgxmb3JtYXRDb25maWciGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyIhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0ciIWYm9vc3RpbmdDb250cmFjdE9yRmFpbCIIY2ZnQXJyYXkiH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQiDWtleVVzZXJzQ291bnQiFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQiGmtleUd3eEhvbGRlcnNSZXdhcmRDdXJyZW50IhdrZXlHd3hIb2xkZXJzUmV3YXJkTmV4dCIUa2V5UG9vbFdlaWdodFZpcnR1YWwiFGtleU5leHRQcm9jZXNzZWRVc2VyIg9rZXlMYXRlc3RQZXJpb2QiDWtleU5leHRQZXJpb2QiEmtleVByb2Nlc3NpbmdTdGFnZSIWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZCIQa2V5VXNlclVuY2xhaW1lZCIJdXNlckluZGV4IhtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIiHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIiEmtleUhlaWdodEZvclBlcmlvZCIGcGVyaW9kIh1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZCIXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QiEWtleUxhc3RQYXlvdXRJbmZvIhBQZXJpb2RQYXlvdXRJbmZvIg1tYXRjaGVyUmV3YXJkIg5lbWlzc2lvblJld2FyZCIUa2V5UGF5b3V0SGlzdG9yeUluZm8iF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kIhZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kIhtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MiHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbCIXa2V5VHJhZGluZ1Jld2FyZEhpc3RvcnkiBHVzZXIiAWkiEGtleU1heFJlY2lwaWVudHMiDEhpc3RvcnlFbnRyeSIEdHlwZSIGYW1vdW50IgpoaXN0b3J5S0VZIgtoaXN0b3J5REFUQSITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiByRtYXRjaDAiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgttdXN0TWFuYWdlciICcGQiAnBrIg5jYWxjVXNlcldlaWdodCIXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MiD2hlaWdodEZvclBlcmlvZCIFa0xhc3QiBGtLZXkiBGtSYXciC2tVc2VyV2VpZ2h0IgFrIgFiIgF3IgFwIgJwdiIWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbSIQdXNlcldlaWdodE9yVW5pdCIVZ2V0VXNlckluZGV4QnlBZGRyZXNzIgt1c2VyQWRkcmVzcyIKbmV4dFBlcmlvZCIRY29tbW9uQ2xhaW1SZXdhcmQiB3VzZXJJZHgiE3VzZXJVbmNsYWltZWRPcHRpb24iAXUiFXBheW1lbnRBbW91bnRMZWZ0T3ZlciINdXNlckFkZHJlc3NlcyIHcmV3YXJkcyILY3VycmVudEl0ZXIiBmNoZWNrcyITdHJhZGVSZXdhcmRJbnRlcm5hbCIXdHJhZGluZ1Jld2FyZEhpc3RvcnlLZXkiDmdXeEFtb3VudFN0YXJ0IghyZWZlcnJlciIRYWN0aXZlUmVmZXJyYWxJbnYiD3Byb2Nlc3NpbmdTdGFnZSINY3VycmVudFBlcmlvZCILY3VycmVudFVzZXIiDGxhdGVzdFBlcmlvZCIKdXNlcnNDb3VudCIOdG90YWxXZWlnaHRLZXkiC3RvdGFsV2VpZ2h0Ig0kdDAxNDE4MTE0Mjk3Igp1c2VyV2VpZ2h0Igt1c2VyQWN0aW9ucyIOdG90YWxXZWlnaHROZXciEXByb2Nlc3NpbmdBY3Rpb25zIhp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZCIbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kIg91c2VyVG90YWxBbW91bnQiC3JlZmVycmFsSW52Ig5yZWZlcnJlclJld2FyZCIOcmVmZXJyYWxSZXdhcmQiEHVuY2xhaW1lZEFjdGlvbnMiB2NvdW50ZXIiBnJlc3VsdCIBQCILY2hlY2tDYWxsZXIiBmRlbHRhSCIMZW1pc3Npb25SYXRlIhdnd3hIb2xkZXJzUmV3YXJkQ3VycmVudCIJYXV4QW1vdW50IgJlbSILbWF0Y2hlclBhcnQiCnBheW91dEluZm8iF2d3eEhvbGRlcnNSZXdhcmRVcGRhdGVkIgt0b3RhbFJld2FyZCIHYWN0aW9ucyIHYWRkcmVzcyINJHQwMTk0ODYxOTUzNiILY2hlY2tBbW91bnQiEmFtb3VudEZyb21FbWlzc2lvbiIPY2xhaW1lZFJlZmVycmFsIgt0b3RhbEFtb3VudCINJHQwMjAxMDkyMDE1OSIRcmVmZXJyYWxVbmNsYWltZWQiDmd3eEFtb3VudFN0YXJ0Ig9sb2NrU3RhcnRIZWlnaHQiEmxvY2tEdXJhdGlvbkJsb2NrcyINbG9ja0VuZEhlaWdodCIMc2NhbGU4UGFyYW1LIgxzY2FsZThQYXJhbUIiDHd4TG9ja0Ftb3VudCIMbG9ja0R1cmF0aW9uIg9tYXhMb2NrRHVyYXRpb24iB2NvZWZmWDgiC3gxQmlnSW50U3RyIgt4MkJpZ0ludFN0ciIMYW1wQmlnSW50U3RyIhNhUHJlY2lzaW9uQmlnSW50U3RyIhh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIiBm5Db2lucyIKYVByZWNpc2lvbiIPdGFyZ2V0UHJlY2lzaW9uIgJ4MSICeDIiA2FtcCIDYW5uIgNhcnIiBGNhbGMiA2FjYyIDY3VyIg0kdDAyMjc5MjIyODE5IgFkIgVkUHJldiIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiDSR0MDIzNDE3MjM0ODAiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIg5hcmdzQ29tcGFyaXNvbiINbWF4UmVjaXBpZW50cyIHcGF5bWVudCIOcGF5bWVudEFzc2V0SWQiDXBheW1lbnRBbW91bnQiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5XQABYQICX18AAWIA6AcAAWMAgMLXLwABZAkAtgIBAAAAAWUAAAABZgABAAFnAgVXQVZFUwEBaAEBaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFpAAABAWoBAWkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFpCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFpAg8gaXMgbm90IGRlZmluZWQBAWsBAWkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBaQIAAQFsAQFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUBaQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBaQIPIGlzIG5vdCBkZWZpbmVkAQFtAQFuAwkAAAIFAW4FAWcFBHVuaXQJANkEAQUBbgEBbwEBcAkAuQkCCQDMCAICEGd3eF9yZXdhcmQucmlkZToJAMwIAgUBcAUDbmlsAgEgAQFxAQFwCQACAQkBAW8BBQFwAQFyAQFzAwkAZgIAAAUBcwkBAS0BBQFzBQFzAQF0AQFzAwkAvwICBQFkBQFzCQC+AgEFAXMFAXMAAXUCDCVzX19tYXhEZXB0aAABdgAeAAF3CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAXUFAXYBAXgAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAF5CQEBbAEJAQF4AAABegkBEUBleHRyTmF0aXZlKDEwNjIpAQUBeQEBQQACHSVzJXNfX2NvbmZpZ19fZW1pc3Npb25BZGRyZXNzAQFCAAkAuQkCCQDMCAICAiVzCQDMCAICFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QFA25pbAUBYQABQwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUBegkBAUIAAQFEAQFFCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQFFBQNuaWwFAWEAAUYJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICC3Byb2dyYW1OYW1lBQNuaWwFAWEAAUcCBnd4bG9jawABSAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQFGBQFHAAFJCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUBYQABSgkAaAIA9AMFAWMAAUsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBSQUBSgABTAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQFhAAFNADIAAU4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBTAUBTQABTwkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUDbmlsBQFhAAFQADIAAVEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBTwUBUAEBUgEBUwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBQFICQDMCAIFAVMFA25pbAUBYQEBVAIBVQFWCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFAVUJAMwIAgUBVgUDbmlsBQFhAAFXCQEBbAEJAQFBAAABWAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBVwABWQABAAFaAAIAAmFhAAMAAmFiAAQBAmFjAAIKJXNfX2NvbmZpZwECYWQACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkBAUEACQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuCQEBQQACDyBpcyBub3QgZGVmaW5lZAACYWUJAQJhZAAAAmFmCQCRAwIJALUJAgkBBXZhbHVlAQkAnQgCBQJhZQkBAmFjAAUBYQABAAJhZwkA2QQBBQJhZgECYWgACQC1CQIJAQFsAQkBAmFjAAUBYQECYWkEAmFmAmFqAmFrAXcJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCBQJhZgkAzAgCBQJhagkAzAgCBQJhawkAzAgCCQCkAwEFAXcFA25pbAUBYQECYWwABAJhbQkBAmFoAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYW0FAmFhAihib29zdGluZyBjb250cmFjdCBhZGRyZXNzIGlzIG5vdCBkZWZpbmVkAQJhbgACKCVzJXNfX2d3eFJld2FyZEVtaXNzaW9uUGFydF9fc3RhcnRIZWlnaHQBAmFvAAIPJXNfX25leHRVc2VyTnVtAQJhcAACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAECYXEAAh8lcyVzX19nd3hIb2xkZXJzUmV3YXJkX19jdXJyZW50AQJhcgACHCVzJXNfX2d3eEhvbGRlcnNSZXdhcmRfX25leHQBAmFzAAIgJXMlc19fcG9vbFdlaWdodF9fR1dYdmlydHVhbFBPT0wBAmF0AAIVJXNfX25leHRQcm9jZXNzZWRVc2VyAQJhdQACECVzX19sYXRlc3RQZXJpb2QBAmF2AAIOJXNfX25leHRQZXJpb2QBAmF3AAITJXNfX3Byb2Nlc3NpbmdTdGFnZQECYXgAAhclc19fbmV4dFByb2Nlc3NlZFBlcmlvZAECYXkBAmF6CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg11c2VyVW5jbGFpbWVkCQDMCAIJAKQDAQUCYXoFA25pbAUBYQECYUEBAmF6CQC5CQIJAMwIAgIXJXMlZF9fbmV4dENsYWltZWRQZXJpb2QJAMwIAgkApAMBBQJhegUDbmlsBQFhAQJhQgECYXoJALkJAgkAzAgCAhklcyVkX19sYXN0UHJvY2Vzc2VkUGVyaW9kCQDMCAIJAKQDAQUCYXoFA25pbAUBYQECYUMBAmFECQC5CQIJAMwIAgIaJXMlZF9fc3RhcnRIZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhRQECYUQJALkJAgkAzAgCAhclcyVkX19hdXhFbWlzc2lvblJld2FyZAkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFGAQJhRAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsQW1vdW50Rm9yUGVyaW9kCQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYUcAAhIlc19fbGFzdFBheW91dEluZm8BAmFIAwJhRAJhSQJhSgkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEFAmFECQDMCAIJAKQDAQUCYUkJAMwIAgkApAMBBQJhSgUDbmlsBQFhAQJhSwECYUQJALkJAgkAzAgCAhglcyVzJWRfX3BheW91dHNfX2hpc3RvcnkJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhTAECYUQJALkJAgkAzAgCAholcyVkX190b3RhbFdlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFNAgJhRAJhegkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUCYXoJAMwIAgIBawkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFOAgJhRAJhegkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUCYXoJAMwIAgIBYgkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFPAgJhRAJhegkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUCYXoJAMwIAgIGd2VpZ2h0CQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYVAACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgZjb25maWcJAMwIAgIYcmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzBQNuaWwFAWEAAmFRCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBbAEJAQJhUAABAmFSAgJhUwJhVAkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICDXRyYWRpbmdSZXdhcmQJAMwIAgIHaGlzdG9yeQkAzAgCBQJhUwkAzAgCCQDYBAEIBQJhVA10cmFuc2FjdGlvbklkBQNuaWwFAWEBAmFVAAkAuQkCCQDMCAICAiVzCQDMCAICDW1heFJlY2lwaWVudHMFA25pbAUBYQECYVYEAmFXAmFTAmFYAmFUBAJhWQkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFXCQDMCAIFAmFTCQDMCAIJANgEAQgFAmFUDXRyYW5zYWN0aW9uSWQFA25pbAUBYQQCYVoJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYVgFA25pbAUBYQkBC1N0cmluZ0VudHJ5AgUCYVkFAmFaAQJiYQACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJiYgACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQECYmMABAJiZAkAoggBCQECYmEAAwkAAQIFAmJkAgZTdHJpbmcEAmJlBQJiZAkA2QQBBQJiZQMJAAECBQJiZAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJiZgAEAmJkCQCiCAEJAQJiYgADCQABAgUCYmQCBlN0cmluZwQCYmUFAmJkCQDZBAEFAmJlAwkAAQIFAmJkAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmJnAQJhVAQCYmgJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQCYmQJAQJiYwADCQABAgUCYmQCCkJ5dGVWZWN0b3IEAmJpBQJiZAMJAAACCAUCYVQPY2FsbGVyUHVibGljS2V5BQJiaQYFAmJoAwkAAQIFAmJkAgRVbml0AwkAAAIIBQJhVAZjYWxsZXIFBHRoaXMGBQJiaAkAAgECC01hdGNoIGVycm9yAQJiagQCYmsCYmwCYUQCYXoEAmJtCQECYUIBBQJhegQCYm4JAQJhTQIFAmFEBQJhegQCYm8JAJoIAgUCYmsFAmJuBAJicAkBAmFPAgUCYUQFAmF6AwkBCWlzRGVmaW5lZAEFAmJvBAJicQkBBXZhbHVlAQUCYm8EAmJyCQEFdmFsdWUBCQCaCAIFAmJrCQECYU4CBQJhRAUCYXoEAmJzCQBkAgkAaAIFAmJxBQJibAUCYnIDCQBmAgUCYnMAAAkAlAoCCQBpAgUCYnMFAWIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJtBQJhRAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYnAFAmJzBQNuaWwJAJQKAgAABQNuaWwEAmJ0CQCaCAIFBHRoaXMFAmJtAwMJAQlpc0RlZmluZWQBBQJidAkAZwIFAmFECQEFdmFsdWUBBQJidAcEAmJ1CQEFdmFsdWUBBQJidAQCYnEJAQV2YWx1ZQEJAJoIAgUCYmsJAQJhTQIFAmJ1BQJhegQCYnIJAQV2YWx1ZQEJAJoIAgUCYmsJAQJhTgIFAmJ1BQJhegQCYnMJAGQCCQBoAgUCYnEFAmJsBQJicgMJAGYCBQJicwAACQCUCgIJAGkCBQJicwUBYgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYnAFAmJzBQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBAmJ2BAJiawJibAJhRAJhegQCYnAJAQJhTwIFAmFEBQJhegQCYncJAJ8IAQUCYnAEAmJkBQJidwMJAAECBQJiZAIEVW5pdAAAAwkAAQIFAmJkAgNJbnQEAmJzBQJiZAkAaQIFAmJzBQFiCQACAQILTWF0Y2ggZXJyb3IBAmJ4AgJhawJieQQBaQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCHVzZXIybnVtCQDMCAIFAmJ5BQNuaWwFAWEJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBQJhawUBaQkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAUCYnkCLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUBaQECYnoACQEBaAEJAQJhdgABAmJBAQJieQQCYW0JAQJhaAAEAmJCCQECYngCCQCRAwIFAmFtBQJhYQUCYnkEAmJDCQCfCAEJAQJheQEFAmJCBAJiZAUCYkMDCQABAgUCYmQCBFVuaXQJAJQKAgAABQNuaWwDCQABAgUCYmQCA0ludAQCYkQFAmJkCQCUCgIFAmJECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXkBBQJiQgAABQNuaWwJAAIBAgtNYXRjaCBlcnJvchICYVQBE3RyYWRlUmV3YXJkSW50ZXJuYWwEAmJFAmJGAmJHAmJIAwkAAAIFAmJICQCQAwEFAmJGBQNuaWwEAmJJCQDMCAIDCQAAAggFAmFUBmNhbGxlcgUEdGhpcwYJAQFxAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgMJAGcCBQJiRQkAkQMCBQJiRwUCYkgGCQEBcQECHGluc3VmZmljaWVudCBwYXltZW50IGFzc2V0SWQFA25pbAMJAAACBQJiSQUCYkkEAmJKCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgkAZQIFAmJFCQCRAwIFAmJHBQJiSAkAzAgCBQJiRgkAzAgCBQJiRwkAzAgCCQBkAgUCYkgAAQUDbmlsBQNuaWwDCQAAAgUCYkoFAmJKBAJiSwkBAmFSAgkAkQMCBQJiRgUCYkgFAmFUBAJieQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJiRgUCYkgJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYksJAJEDAgUCYkcFAmJICQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJ5CQCRAwIFAmJHBQJiSAUCYWcFA25pbAUCYkoJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVQBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkCAmJ5AmJMBAJiTQkAnQgCBQJhUQkBAVIBBQJieQQCYk4DCQAAAgUCYk0FBHVuaXQFBHVuaXQJAPwHBAUCYVECFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUBSAkAzAgCBQJieQkAzAgCCQBnAgUCYkwFAUsFA25pbAUDbmlsAwkAAAIFAmJOBQJiTgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVQBDmZpbmFsaXplSGVscGVyAAQCYk8JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmF3AAUBZQQCYlAJAQFoAQkBAmF4AAQCYlEJAQFoAQkBAmF0AAQCYlIJAQFoAQkBAmF1AAQCYlMJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBAmFsAAkBAmFvAAAABAJiVAkBAmFMAQUCYlAEAmJVCQEBaAEJAQJhTAEFAmJQBAJibAkBAWgBCQECYUMBBQJiUAMJAGYCBQJiUAUCYlIJAJQKAgUDbmlsBwMJAAACBQJiTwUBZQQCYlYJAQJiagQJAQJhbAAFAmJsBQJiUAUCYlEEAmJXCAUCYlYCXzEEAmJYCAUCYlYCXzIEAmJZCQBkAgUCYlUFAmJXBAJiWgMJAGYCCQBlAgUCYlMAAQUCYlEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAAJAGQCBQJiUQABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdwAFAWYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAAAAAUDbmlsCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiVAUCYlkFA25pbAUCYloFAmJYBgMJAAACBQJiTwUBZgQCYlcJAQJidgQJAQJhbAAFAmJsBQJiUAUCYlEEAmNhCQBrAwkBAWgBCQECYUYBBQJiUAUCYlcFAmJVBAJjYgkAawMJAQFoAQkBAmFFAQUCYlAFAmJXBQJiVQQCY2MJAGQCBQJjYgUCY2EEAmJDCQCfCAEJAQJheQEFAmJRBAJieQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBAmFsAAkBAUQBBQJiUQQCYk0JAJ0IAgUCYVEJAQFSAQUCYnkEAmJOAwkAAAIFAmJNBQR1bml0BQR1bml0CQD8BwQFAmFRAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFAUgJAMwIAgUCYnkJAMwIAgkAZwIFAmJXBQFLBQNuaWwFA25pbAMJAAACBQJiTgUCYk4EAmNkAwMJAAACBQJiTQUEdW5pdAYJAGYCBQFLBQJiVwUEdW5pdAQCY2UJAGsDBQJjYwUBTgUBYgQCY2YJAGsDBQJjYwUBUQUBYgkA/AcEBQJhUQIMaW5jVW5jbGFpbWVkCQDMCAIFAUgJAMwIAgUCYnkJAMwIAgUCY2UJAMwIAgUCY2YFA25pbAUDbmlsAwkAAAIFAmNkBQJjZAQCY2cJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJheQEFAmJRCQBkAgkBC3ZhbHVlT3JFbHNlAgUCYkMAAAUCY2MFA25pbAQCYloDCQBmAgkAZQIFAmJTAAEFAmJRCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQACQBkAgUCYlEAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXgACQBkAgUCYlAAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF0AAAACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdwAFA25pbAkAlAoCCQDOCAIFAmNnBQJiWgYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhhpbnZhbGlkIHByb2Nlc3Npbmcgc3RhZ2UCYVQBD2ZpbmFsaXplV3JhcHBlcgECY2gEAmNpCgACY2oJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAmNqAgdCb29sZWFuBQJjagkAAgEJAKwCAgkAAwEFAmNqAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmNpBQJjaQMJAQEhAQUCY2kDCQAAAgUCY2gFAXcJAAIBAhJOb3RoaW5nIHRvIHByb2Nlc3MJAJQKAgUDbmlsBQR1bml0AwkAZgIFAmNoAAAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBlAgUCY2gAAQUDbmlsBQNuaWwJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQF3BQNuaWwFA25pbAJhVAEHZGVwb3NpdAAEAmNrAwkAAAIIBQJhVAZjYWxsZXIFAUMGCQECYmcBBQJhVAMJAAACBQJjawUCY2sEAmFECQECYnoABAJjbAkAZQIFBmhlaWdodAkBAWoBCQECYW4ABAJjbQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAVgJAQJhcAAJAKwCAgkArAICAhxtYW5kYXRvcnkgZW1pc3Npb25fY29udHJhY3QuCQECYXAAAg8gaXMgbm90IGRlZmluZWQEAmNuCQELdmFsdWVPckVsc2UCCQCaCAIFAVgJAQJhcQAAAAMJAAACBQJjbgUCY24EAmNvCQBrAwkAaAIFAmNsBQJjbgUCY20FAWMEAmNwAwkAZgIFAmNvAAAJAPwHBAUBWAIEZW1pdAkAzAgCBQJjbwUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY3AFAmNwBAJjcQAABAJjcgkBAmFIAwUCYUQFAmNxBQJjbwQCY3MKAAJjagkA/AcEBQFYAhZnd3hIb2xkZXJzUmV3YXJkVXBkYXRlBQNuaWwFA25pbAMJAAECBQJjagIHQm9vbGVhbgUCY2oJAAIBCQCsAgIJAAMBBQJjagIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJjcwUCY3MEAmN0CQBkAgUCY3EFAmNvBAJjdQMDCQAAAgUCY3QAAAkBASEBBQJjcwcFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF1AAUCYUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhQwEFAmFEBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhRQEFAmFEBQJjbwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFuAAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUYBBQJhRAUCY3EJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdgAJAGQCBQJhRAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhRwAFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhSwEFAmFEBQJjcgUDbmlsCQCUCgIFAmN1BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUAQtjbGFpbVJld2FyZAAEAmFtCQECYWgABAJjdgkApQgBCAUCYVQGY2FsbGVyBAJjdwkBAmJBAQUCY3YEAmFYCAUCY3cCXzEEAmN1CAUCY3cCXzIEAmN4AwkAZgIFAmFYAAAGCQACAQIQTm90aGluZyB0byBjbGFpbQMJAAACBQJjeAUCY3gEAmN5AAAEAmN6CgACY2oJAPwHBAUCYVECBWNsYWltCQDMCAIFAUgFA25pbAUDbmlsAwkAAQIFAmNqAgNJbnQFAmNqCQACAQkArAICCQADAQUCY2oCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCY0EJAGQCBQJhWAUCY3oJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJhVAZjYWxsZXIFAmNBCQDZBAEJAJEDAgUCYW0FAVkJAMwIAgkBAmFWBAIFY2xhaW0FAmN2BQJhWAUCYVQFA25pbAUCY3UJAMwIAgUCY0EJAMwIAgUCY3kFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhVAETY2xhaW1SZXdhcmRSRUFET05MWQECY3YEAmNCCQECYkEBBQJjdgQCYVgIBQJjQgJfMQQCY3UIBQJjQgJfMgQCY0MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYVEJAQFUAgUBSAUCY3YAAAQCY0EJAGQCBQJhWAUCY0MJAJQKAgUDbmlsBQJjQQJhVAEdbGF0ZXN0RmluYWxpemVkUGVyaW9kUkVBRE9OTFkBAmN2CQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYXUAAP///////////wECYVQBIWxhdGVzdEZpbmFsaXplZFBlcmlvZEluZm9SRUFET05MWQECY3YJAJQKAgUDbmlsCQEBawEJAQJhRwACYVQBFWNhbGNHd3hQYXJhbXNSRUFET05MWQMCY0QCY0UCY0YEAmNHCQBkAgUCY0UFAmNGBAJjSAkBAS0BCQBrAwUCY0QFAWIFAmNGBAJjSQkAaAIJAGsDBQJjRAUBYgUCY0YFAmNHCQCUCgIFA25pbAkAzAgCBQJjSAkAzAgCBQJjSQkAzAgCCQECYnoABQNuaWwCYVQBGmNhbGNHd3hBbW91bnRTdGFydFJFQURPTkxZAwJjSgJjSwJjTAQCY00JAGsDBQJjSwUBYwUCY0wEAmJMCQBrAwUCY0oFAmNNBQFjCQCUCgIFA25pbAkAzAgCBQJiTAUDbmlsAmFUARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAmFUBmNhbGxlcgUBegkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFuAAUGaGVpZ2h0BQNuaWwCYVQBI2xhdGVzdFBlcmlvZEVtaXNzaW9uUmV3YXJkc1JFQURPTkxZAQJjdgQCYUQJAQJiegAJAJQKAgUDbmlsCQDMCAIJAQFoAQkBAmFFAQUCYUQFA25pbAJhVAEFY2FsY0QFAmNOAmNPAmNQAmNRAmNSBAJjUwkAtgIBAAIEAmNUCQCnAwEFAmNRBAJjVQkApwMBBQJjUgQCY1YJAKcDAQUCY04EAmNXCQCnAwEFAmNPBAJjWAkAuQICCQCnAwEFAmNQBQJjVAQCYmUJALcCAgUCY1YFAmNXAwkAAAIFAmJlBQFkCQCUCgIFA25pbAkApgMBBQFkBAJjWQkAuQICBQJjWAUCY1MEAmNaCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgUDbmlsCgECZGECAmRiAmRjBAJkZAUCZGIEAmRlCAUCZGQCXzEEAmRmCAUCZGQCXzIEAmRnCAUCZGQCXzMDCQECIT0CBQJkZwUEdW5pdAUCZGIEAmRoCQC6AgIJALkCAgkAuQICBQJkZQUCZGUFAmRlCQC5AgIJALkCAgkAuQICBQJjVgUCY1cFAmNTBQJjUwQCZGkJALoCAgkAuQICCQC3AgIJALoCAgkAuQICBQJjWQUCYmUFAmNUCQC5AgIFAmRoBQJjUwUCZGUJALcCAgkAugICCQC5AgIJALgCAgUCY1kFAmNUBQJkZQUCY1QJALkCAgkAtwICBQJjUwkAtgIBAAEFAmRoBAJkagkBAXQBCQC4AgIFAmRpCQEFdmFsdWUBBQJkZQMJAMACAgUCY1UFAmRqCQCVCgMFAmRpBQJkZQUCZGMJAJUKAwUCZGkFAmRlBQR1bml0BAJkawoAAmRsBQJjWgoAAmRtCQCQAwEFAmRsCgACZG4JAJUKAwUCYmUFBHVuaXQFBHVuaXQKAQJkbwICZHACZHEDCQBnAgUCZHEFAmRtBQJkcAkBAmRhAgUCZHAJAJEDAgUCZGwFAmRxCgECZHICAmRwAmRxAwkAZwIFAmRxBQJkbQUCZHAJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA3CQECZHICCQECZG8CCQECZG8CCQECZG8CCQECZG8CCQECZG8CCQECZG8CCQECZG8CBQJkbgAAAAEAAgADAAQABQAGAAcEAmRpCAUCZGsCXzEEAmRmCAUCZGsCXzIEAmRnCAUCZGsCXzMDCQECIT0CBQJkZwUEdW5pdAkAlAoCBQNuaWwJAKYDAQUCZGkEAmRqCQEBdAEJALgCAgUCZGkJAQV2YWx1ZQEFAmRmCQACAQkArAICAh1EIGNhbGN1bGF0aW9uIGVycm9yLCBkRGlmZiA9IAkApgMBBQJkagJhVAELdHJhZGVSZXdhcmQCAmJGAmJHBAJkcwkAAAIJAJADAQUCYkYJAJADAQUCYkcEAmR0CQELdmFsdWVPckVsc2UCCQCfCAEJAQJhVQAAAAQCZHUJAJEDAggFAmFUCHBheW1lbnRzAAAEAmR2CAUCZHUHYXNzZXRJZAQCZHcIBQJkdQZhbW91bnQEAmJJCQDMCAIDCQBnAgUCZHQJAJADAQUCYkYGCQEBcQECE1RvbyBtYW55IHJlY2lwaWVudHMJAMwIAgMFAmRzBgkBAXEBAhdBcmd1bWVudHMgc2l6ZSBtaXNtYXRjaAkAzAgCAwkAAAIFAmR2BQJhZwYJAQFxAQITV3JvbmcgYXNzZXQgcGF5bWVudAUDbmlsAwkAAAIFAmJJBQJiSQQCYkoJAPwHBAUEdGhpcwITdHJhZGVSZXdhcmRJbnRlcm5hbAkAzAgCBQJkdwkAzAgCBQJiRgkAzAgCBQJiRwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAmJKBQJiSgkAlAoCBQNuaWwFAmJKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUAQpzZXRNYW5hZ2VyAQJkeAQCY2sJAQJiZwEFAmFUAwkAAAIFAmNrBQJjawQCZHkJANkEAQUCZHgDCQAAAgUCZHkFAmR5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJiYgAFAmR4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVQBDmNvbmZpcm1NYW5hZ2VyAAQCZHoJAQJiZgAEAmRBAwkBCWlzRGVmaW5lZAEFAmR6BgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkQQUCZEEEAmRCAwkAAAIIBQJhVA9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmR6BgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkQgUCZEIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJhAAkA2AQBCQEFdmFsdWUBBQJkegkAzAgCCQELRGVsZXRlRW50cnkBCQECYmIABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmRDAQJkRAAEAmRFBAJiZAkBAmJjAAMJAAECBQJiZAIKQnl0ZVZlY3RvcgQCYmkFAmJkBQJiaQMJAAECBQJiZAIEVW5pdAgFAmRDD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJkQwlib2R5Qnl0ZXMJAJEDAggFAmRDBnByb29mcwAABQJkRUdeVbE=", "height": 2541523, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7XZdzfB3UDxSNaT5fGVgffHP3ZCa4PhVm4ErnowPNAaP Next: 958jHzAm97nACCBdSrVUWCfUuN6RBimQU8Rf2Q2Wjz3k Diff:
OldNewDifferences
3737
3838 func throwErr (msg) = throw(wrapErr(msg))
3939
40-
41-func keyWxAssetId () = makeString(["%s", "wxAssetId"], SEP)
42-
43-
44-let wxAssetId = parseAssetId(getStringValue(this, keyWxAssetId()))
4540
4641 func abs (val) = if ((0 > val))
4742 then -(val)
121116
122117 func keyConfig () = "%s__config"
123118
119+
120+func getEmissionAddress () = addressFromStringValue(valueOrErrorMessage(getString(this, keyEmissionAddress()), (("mandatory this." + keyEmissionAddress()) + " is not defined")))
121+
122+
123+let emissionAddress = getEmissionAddress()
124+
125+let wxAssetIdStr = split(value(getString(emissionAddress, keyConfig())), SEP)[1]
126+
127+let wxAssetId = fromBase58String(wxAssetIdStr)
124128
125129 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
126130
214218 func keyTradingRewardHistory (user,i) = makeString(["%s%s%s%s", "tradingReward", "history", user, toBase58String(i.transactionId)], SEP)
215219
216220
217-func keyMaxRecipients () = makeString(["%s%s", "config", "maxRecipients"], SEP)
221+func keyMaxRecipients () = makeString(["%s", "maxRecipients"], SEP)
218222
219223
220224 func HistoryEntry (type,user,amount,i) = {
342346 func tradeRewardInternal (paymentAmountLeftOver,userAddresses,rewards,currentIter) = if ((currentIter == size(userAddresses)))
343347 then nil
344348 else {
345- let insufficientFundsCheck = if ((paymentAmountLeftOver >= rewards[currentIter]))
349+ let checks = [if ((i.caller == this))
346350 then true
347- else throwErr("insufficient payment assetId")
348- if ((insufficientFundsCheck == insufficientFundsCheck))
351+ else throwErr("Permission denied"), if ((paymentAmountLeftOver >= rewards[currentIter]))
352+ then true
353+ else throwErr("insufficient payment assetId")]
354+ if ((checks == checks))
349355 then {
350356 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [(paymentAmountLeftOver - rewards[currentIter]), userAddresses, rewards, (currentIter + 1)], nil)
351357 if ((tradeRewardInternal == tradeRewardInternal))
388394 then $Tuple2(nil, false)
389395 else if ((processingStage == processingStageTotal))
390396 then {
391- let $t01391914035 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
392- let userWeight = $t01391914035._1
393- let userActions = $t01391914035._2
397+ let $t01418114297 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
398+ let userWeight = $t01418114297._1
399+ let userActions = $t01418114297._2
394400 let totalWeightNew = (totalWeight + userWeight)
395401 let processingActions = if (((usersCount - 1) > currentUser))
396402 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
515521 func claimReward () = {
516522 let cfgArray = readConfigArrayOrFail()
517523 let address = toString(i.caller)
518- let $t01922419274 = commonClaimReward(address)
519- let amount = $t01922419274._1
520- let actions = $t01922419274._2
524+ let $t01948619536 = commonClaimReward(address)
525+ let amount = $t01948619536._1
526+ let actions = $t01948619536._2
521527 let checkAmount = if ((amount > 0))
522528 then true
523529 else throw("Nothing to claim")
540546
541547 @Callable(i)
542548 func claimRewardREADONLY (address) = {
543- let $t01984719897 = commonClaimReward(address)
544- let amount = $t01984719897._1
545- let actions = $t01984719897._2
549+ let $t02010920159 = commonClaimReward(address)
550+ let amount = $t02010920159._1
551+ let actions = $t02010920159._2
546552 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
547553 let totalAmount = (amount + referralUnclaimed)
548554 $Tuple2(nil, totalAmount)
609615 let ann = (amp * nCoins)
610616 let arr = [0, 1, 2, 3, 4, 5, 6]
611617 func calc (acc,cur) = {
612- let $t02253022557 = acc
613- let d = $t02253022557._1
614- let dPrev = $t02253022557._2
615- let found = $t02253022557._3
618+ let $t02279222819 = acc
619+ let d = $t02279222819._1
620+ let dPrev = $t02279222819._2
621+ let found = $t02279222819._3
616622 if ((found != unit))
617623 then acc
618624 else {
625631 }
626632 }
627633
628- let $t02315523218 = {
634+ let $t02341723480 = {
629635 let $l = arr
630636 let $s = size($l)
631637 let $acc0 = $Tuple3(s, unit, unit)
639645
640646 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
641647 }
642- let dNext = $t02315523218._1
643- let dPrev = $t02315523218._2
644- let found = $t02315523218._3
648+ let dNext = $t02341723480._1
649+ let dPrev = $t02341723480._2
650+ let found = $t02341723480._3
645651 if ((found != unit))
646652 then $Tuple2(nil, toString(dNext))
647653 else {
660666 let payment = i.payments[0]
661667 let paymentAssetId = payment.assetId
662668 let paymentAmount = payment.amount
663- let checks = [if ((size(userAddresses) > maxRecipients))
669+ let checks = [if ((maxRecipients >= size(userAddresses)))
664670 then true
665671 else throwErr("Too many recipients"), if (argsComparison)
666672 then true
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE = 1000
77
88 let MULT8 = 100000000
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let processingStageTotal = 0
1313
1414 let processingStageShares = 1
1515
1616 let wavesString = "WAVES"
1717
1818 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1919
2020
2121 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2222
2323
2424 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2525
2626
2727 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2828
2929
3030 func parseAssetId (input) = if ((input == wavesString))
3131 then unit
3232 else fromBase58String(input)
3333
3434
3535 func wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
3636
3737
3838 func throwErr (msg) = throw(wrapErr(msg))
3939
40-
41-func keyWxAssetId () = makeString(["%s", "wxAssetId"], SEP)
42-
43-
44-let wxAssetId = parseAssetId(getStringValue(this, keyWxAssetId()))
4540
4641 func abs (val) = if ((0 > val))
4742 then -(val)
4843 else val
4944
5045
5146 func absBigInt (val) = if ((zeroBigInt > val))
5247 then -(val)
5348 else val
5449
5550
5651 let keyMaxDepth = "%s__maxDepth"
5752
5853 let maxDepthDefault = 30
5954
6055 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
6156
6257 func keyFactoryAddress () = "%s%s__config__factoryAddress"
6358
6459
6560 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
6661
6762 let factoryContract = addressFromStringValue(factoryAddressStr)
6863
6964 func keyEmissionAddress () = "%s%s__config__emissionAddress"
7065
7166
7267 func keyVotingEmissionContract () = makeString(["%s", "votingEmissionContract"], SEP)
7368
7469
7570 let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract()))
7671
7772 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
7873
7974
8075 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
8176
8277 let referralProgramNameDefault = "wxlock"
8378
8479 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
8580
8681 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
8782
8883 let referralMinGWxAmountDefault = (500 * MULT8)
8984
9085 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
9186
9287 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
9388
9489 let referrerRewardPermilleDefault = 50
9590
9691 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
9792
9893 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
9994
10095 let referralRewardPermilleDefault = 50
10196
10297 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
10398
10499 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
105100
106101
107102 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
108103
109104
110105 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
111106
112107 let emissionContract = addressFromStringValue(emissionAddressStr)
113108
114109 let IdxCfgAssetId = 1
115110
116111 let IdxCfgPacemakerAddress = 2
117112
118113 let IdxCfgBoostingContract = 3
119114
120115 let IdxCfgMaxDepth = 4
121116
122117 func keyConfig () = "%s__config"
123118
119+
120+func getEmissionAddress () = addressFromStringValue(valueOrErrorMessage(getString(this, keyEmissionAddress()), (("mandatory this." + keyEmissionAddress()) + " is not defined")))
121+
122+
123+let emissionAddress = getEmissionAddress()
124+
125+let wxAssetIdStr = split(value(getString(emissionAddress, keyConfig())), SEP)[1]
126+
127+let wxAssetId = fromBase58String(wxAssetIdStr)
124128
125129 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
126130
127131
128132 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
129133
130134
131135 func boostingContractOrFail () = {
132136 let cfgArray = readConfigArrayOrFail()
133137 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
134138 }
135139
136140
137141 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
138142
139143
140144 func keyUsersCount () = "%s__nextUserNum"
141145
142146
143147 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
144148
145149
146150 func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
147151
148152
149153 func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
150154
151155
152156 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
153157
154158
155159 func keyNextProcessedUser () = "%s__nextProcessedUser"
156160
157161
158162 func keyLatestPeriod () = "%s__latestPeriod"
159163
160164
161165 func keyNextPeriod () = "%s__nextPeriod"
162166
163167
164168 func keyProcessingStage () = "%s__processingStage"
165169
166170
167171 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
168172
169173
170174 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
171175
172176
173177 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
174178
175179
176180 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
177181
178182
179183 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
180184
181185
182186 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
183187
184188
185189 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
186190
187191
188192 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
189193
190194
191195 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
192196
193197
194198 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
195199
196200
197201 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
198202
199203
200204 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
201205
202206
203207 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
204208
205209
206210 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
207211
208212
209213 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
210214
211215
212216 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
213217
214218 func keyTradingRewardHistory (user,i) = makeString(["%s%s%s%s", "tradingReward", "history", user, toBase58String(i.transactionId)], SEP)
215219
216220
217-func keyMaxRecipients () = makeString(["%s%s", "config", "maxRecipients"], SEP)
221+func keyMaxRecipients () = makeString(["%s", "maxRecipients"], SEP)
218222
219223
220224 func HistoryEntry (type,user,amount,i) = {
221225 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
222226 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
223227 StringEntry(historyKEY, historyDATA)
224228 }
225229
226230
227231 func keyManagerPublicKey () = "%s__managerPublicKey"
228232
229233
230234 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
231235
232236
233237 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
234238 case s: String =>
235239 fromBase58String(s)
236240 case _: Unit =>
237241 unit
238242 case _ =>
239243 throw("Match error")
240244 }
241245
242246
243247 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
244248 case s: String =>
245249 fromBase58String(s)
246250 case _: Unit =>
247251 unit
248252 case _ =>
249253 throw("Match error")
250254 }
251255
252256
253257 func mustManager (i) = {
254258 let pd = throw("Permission denied")
255259 match managerPublicKeyOrUnit() {
256260 case pk: ByteVector =>
257261 if ((i.callerPublicKey == pk))
258262 then true
259263 else pd
260264 case _: Unit =>
261265 if ((i.caller == this))
262266 then true
263267 else pd
264268 case _ =>
265269 throw("Match error")
266270 }
267271 }
268272
269273
270274 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
271275 let kLast = keyLastProcessedPeriodOfUser(userIndex)
272276 let kKey = keyUserKValueForPeriod(period, userIndex)
273277 let kRaw = getInteger(boostingContractAddress, kKey)
274278 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
275279 if (isDefined(kRaw))
276280 then {
277281 let k = value(kRaw)
278282 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
279283 let w = ((k * heightForPeriod) + b)
280284 if ((w > 0))
281285 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
282286 else $Tuple2(0, nil)
283287 }
284288 else {
285289 let p = getInteger(this, kLast)
286290 if (if (isDefined(p))
287291 then (period >= value(p))
288292 else false)
289293 then {
290294 let pv = value(p)
291295 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
292296 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
293297 let w = ((k * heightForPeriod) + b)
294298 if ((w > 0))
295299 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
296300 else $Tuple2(0, nil)
297301 }
298302 else $Tuple2(0, nil)
299303 }
300304 }
301305
302306
303307 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
304308 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
305309 let userWeightOrUnit = getInteger(kUserWeight)
306310 match userWeightOrUnit {
307311 case _: Unit =>
308312 0
309313 case w: Int =>
310314 (w / SCALE)
311315 case _ =>
312316 throw("Match error")
313317 }
314318 }
315319
316320
317321 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
318322 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
319323 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
320324 }
321325
322326
323327 func nextPeriod () = getNumberByKey(keyNextPeriod())
324328
325329
326330 func commonClaimReward (userAddress) = {
327331 let cfgArray = readConfigArrayOrFail()
328332 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
329333 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
330334 match userUnclaimedOption {
331335 case _: Unit =>
332336 $Tuple2(0, nil)
333337 case u: Int =>
334338 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
335339 case _ =>
336340 throw("Match error")
337341 }
338342 }
339343
340344
341345 @Callable(i)
342346 func tradeRewardInternal (paymentAmountLeftOver,userAddresses,rewards,currentIter) = if ((currentIter == size(userAddresses)))
343347 then nil
344348 else {
345- let insufficientFundsCheck = if ((paymentAmountLeftOver >= rewards[currentIter]))
349+ let checks = [if ((i.caller == this))
346350 then true
347- else throwErr("insufficient payment assetId")
348- if ((insufficientFundsCheck == insufficientFundsCheck))
351+ else throwErr("Permission denied"), if ((paymentAmountLeftOver >= rewards[currentIter]))
352+ then true
353+ else throwErr("insufficient payment assetId")]
354+ if ((checks == checks))
349355 then {
350356 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [(paymentAmountLeftOver - rewards[currentIter]), userAddresses, rewards, (currentIter + 1)], nil)
351357 if ((tradeRewardInternal == tradeRewardInternal))
352358 then {
353359 let tradingRewardHistoryKey = keyTradingRewardHistory(userAddresses[currentIter], i)
354360 let userAddress = addressFromStringValue(userAddresses[currentIter])
355361 $Tuple2([IntegerEntry(tradingRewardHistoryKey, rewards[currentIter]), ScriptTransfer(userAddress, rewards[currentIter], wxAssetId)], tradeRewardInternal)
356362 }
357363 else throw("Strict value is not equal to itself.")
358364 }
359365 else throw("Strict value is not equal to itself.")
360366 }
361367
362368
363369
364370 @Callable(i)
365371 func updateReferralActivity (userAddress,gWxAmountStart) = {
366372 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
367373 let activeReferralInv = if ((referrer == unit))
368374 then unit
369375 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
370376 if ((activeReferralInv == activeReferralInv))
371377 then $Tuple2(nil, unit)
372378 else throw("Strict value is not equal to itself.")
373379 }
374380
375381
376382
377383 @Callable(i)
378384 func finalizeHelper () = {
379385 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
380386 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
381387 let currentUser = getNumberByKey(keyNextProcessedUser())
382388 let latestPeriod = getNumberByKey(keyLatestPeriod())
383389 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
384390 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
385391 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
386392 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
387393 if ((currentPeriod > latestPeriod))
388394 then $Tuple2(nil, false)
389395 else if ((processingStage == processingStageTotal))
390396 then {
391- let $t01391914035 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
392- let userWeight = $t01391914035._1
393- let userActions = $t01391914035._2
397+ let $t01418114297 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
398+ let userWeight = $t01418114297._1
399+ let userActions = $t01418114297._2
394400 let totalWeightNew = (totalWeight + userWeight)
395401 let processingActions = if (((usersCount - 1) > currentUser))
396402 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
397403 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
398404 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
399405 }
400406 else if ((processingStage == processingStageShares))
401407 then {
402408 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
403409 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
404410 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
405411 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
406412 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
407413 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
408414 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
409415 let activeReferralInv = if ((referrer == unit))
410416 then unit
411417 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
412418 if ((activeReferralInv == activeReferralInv))
413419 then {
414420 let referralInv = if (if ((referrer == unit))
415421 then true
416422 else (referralMinGWxAmount > userWeight))
417423 then unit
418424 else {
419425 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
420426 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
421427 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
422428 }
423429 if ((referralInv == referralInv))
424430 then {
425431 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
426432 let processingActions = if (((usersCount - 1) > currentUser))
427433 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
428434 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
429435 $Tuple2((unclaimedActions ++ processingActions), true)
430436 }
431437 else throw("Strict value is not equal to itself.")
432438 }
433439 else throw("Strict value is not equal to itself.")
434440 }
435441 else throw("invalid processing stage")
436442 }
437443
438444
439445
440446 @Callable(i)
441447 func finalizeWrapper (counter) = {
442448 let result = {
443449 let @ = invoke(this, "finalizeHelper", nil, nil)
444450 if ($isInstanceOf(@, "Boolean"))
445451 then @
446452 else throw(($getType(@) + " couldn't be cast to Boolean"))
447453 }
448454 if ((result == result))
449455 then if (!(result))
450456 then if ((counter == maxDepth))
451457 then throw("Nothing to process")
452458 else $Tuple2(nil, unit)
453459 else if ((counter > 0))
454460 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
455461 else $Tuple2(nil, unit)
456462 else throw("Strict value is not equal to itself.")
457463 }
458464
459465
460466
461467 @Callable(i)
462468 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
463469
464470
465471
466472 @Callable(i)
467473 func deposit () = {
468474 let checkCaller = if ((i.caller == votingEmissionContract))
469475 then true
470476 else mustManager(i)
471477 if ((checkCaller == checkCaller))
472478 then {
473479 let period = nextPeriod()
474480 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
475481 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
476482 let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
477483 if ((gwxHoldersRewardCurrent == gwxHoldersRewardCurrent))
478484 then {
479485 let auxAmount = fraction((deltaH * gwxHoldersRewardCurrent), emissionRate, MULT8)
480486 let em = if ((auxAmount > 0))
481487 then invoke(emissionContract, "emit", [auxAmount], nil)
482488 else unit
483489 if ((em == em))
484490 then {
485491 let matcherPart = 0
486492 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
487493 let gwxHoldersRewardUpdated = {
488494 let @ = invoke(emissionContract, "gwxHoldersRewardUpdate", nil, nil)
489495 if ($isInstanceOf(@, "Boolean"))
490496 then @
491497 else throw(($getType(@) + " couldn't be cast to Boolean"))
492498 }
493499 if ((gwxHoldersRewardUpdated == gwxHoldersRewardUpdated))
494500 then {
495501 let totalReward = (matcherPart + auxAmount)
496502 let actions = if (if ((totalReward == 0))
497503 then !(gwxHoldersRewardUpdated)
498504 else false)
499505 then nil
500506 else [IntegerEntry(keyLatestPeriod(), period), IntegerEntry(keyHeightForPeriod(period), height), IntegerEntry(keyAuxEmissionRewardForPeriod(period), auxAmount), IntegerEntry(keyGwxRewardEmissionStartHeight(), height), IntegerEntry(keyTotalAmountForPeriod(period), matcherPart), IntegerEntry(keyNextPeriod(), (period + 1)), StringEntry(keyLastPayoutInfo(), payoutInfo), StringEntry(keyPayoutHistoryInfo(period), payoutInfo)]
501507 $Tuple2(actions, unit)
502508 }
503509 else throw("Strict value is not equal to itself.")
504510 }
505511 else throw("Strict value is not equal to itself.")
506512 }
507513 else throw("Strict value is not equal to itself.")
508514 }
509515 else throw("Strict value is not equal to itself.")
510516 }
511517
512518
513519
514520 @Callable(i)
515521 func claimReward () = {
516522 let cfgArray = readConfigArrayOrFail()
517523 let address = toString(i.caller)
518- let $t01922419274 = commonClaimReward(address)
519- let amount = $t01922419274._1
520- let actions = $t01922419274._2
524+ let $t01948619536 = commonClaimReward(address)
525+ let amount = $t01948619536._1
526+ let actions = $t01948619536._2
521527 let checkAmount = if ((amount > 0))
522528 then true
523529 else throw("Nothing to claim")
524530 if ((checkAmount == checkAmount))
525531 then {
526532 let amountFromEmission = 0
527533 let claimedReferral = {
528534 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
529535 if ($isInstanceOf(@, "Int"))
530536 then @
531537 else throw(($getType(@) + " couldn't be cast to Int"))
532538 }
533539 let totalAmount = (amount + claimedReferral)
534540 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
535541 }
536542 else throw("Strict value is not equal to itself.")
537543 }
538544
539545
540546
541547 @Callable(i)
542548 func claimRewardREADONLY (address) = {
543- let $t01984719897 = commonClaimReward(address)
544- let amount = $t01984719897._1
545- let actions = $t01984719897._2
549+ let $t02010920159 = commonClaimReward(address)
550+ let amount = $t02010920159._1
551+ let actions = $t02010920159._2
546552 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
547553 let totalAmount = (amount + referralUnclaimed)
548554 $Tuple2(nil, totalAmount)
549555 }
550556
551557
552558
553559 @Callable(i)
554560 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
555561
556562
557563
558564 @Callable(i)
559565 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
560566
561567
562568
563569 @Callable(i)
564570 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
565571 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
566572 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
567573 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
568574 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
569575 }
570576
571577
572578
573579 @Callable(i)
574580 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
575581 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
576582 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
577583 $Tuple2(nil, [gWxAmountStart])
578584 }
579585
580586
581587
582588 @Callable(i)
583589 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
584590 then throw("permissions denied")
585591 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
586592
587593
588594
589595 @Callable(i)
590596 func latestPeriodEmissionRewardsREADONLY (address) = {
591597 let period = nextPeriod()
592598 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
593599 }
594600
595601
596602
597603 @Callable(i)
598604 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
599605 let nCoins = toBigInt(2)
600606 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
601607 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
602608 let x1 = parseBigIntValue(x1BigIntStr)
603609 let x2 = parseBigIntValue(x2BigIntStr)
604610 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
605611 let s = (x1 + x2)
606612 if ((s == zeroBigInt))
607613 then $Tuple2(nil, toString(zeroBigInt))
608614 else {
609615 let ann = (amp * nCoins)
610616 let arr = [0, 1, 2, 3, 4, 5, 6]
611617 func calc (acc,cur) = {
612- let $t02253022557 = acc
613- let d = $t02253022557._1
614- let dPrev = $t02253022557._2
615- let found = $t02253022557._3
618+ let $t02279222819 = acc
619+ let d = $t02279222819._1
620+ let dPrev = $t02279222819._2
621+ let found = $t02279222819._3
616622 if ((found != unit))
617623 then acc
618624 else {
619625 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
620626 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
621627 let dDiff = absBigInt((dNext - value(d)))
622628 if ((targetPrecision >= dDiff))
623629 then $Tuple3(dNext, d, cur)
624630 else $Tuple3(dNext, d, unit)
625631 }
626632 }
627633
628- let $t02315523218 = {
634+ let $t02341723480 = {
629635 let $l = arr
630636 let $s = size($l)
631637 let $acc0 = $Tuple3(s, unit, unit)
632638 func $f0_1 ($a,$i) = if (($i >= $s))
633639 then $a
634640 else calc($a, $l[$i])
635641
636642 func $f0_2 ($a,$i) = if (($i >= $s))
637643 then $a
638644 else throw("List size exceeds 7")
639645
640646 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
641647 }
642- let dNext = $t02315523218._1
643- let dPrev = $t02315523218._2
644- let found = $t02315523218._3
648+ let dNext = $t02341723480._1
649+ let dPrev = $t02341723480._2
650+ let found = $t02341723480._3
645651 if ((found != unit))
646652 then $Tuple2(nil, toString(dNext))
647653 else {
648654 let dDiff = absBigInt((dNext - value(dPrev)))
649655 throw(("D calculation error, dDiff = " + toString(dDiff)))
650656 }
651657 }
652658 }
653659
654660
655661
656662 @Callable(i)
657663 func tradeReward (userAddresses,rewards) = {
658664 let argsComparison = (size(userAddresses) == size(rewards))
659665 let maxRecipients = valueOrElse(getInteger(keyMaxRecipients()), 0)
660666 let payment = i.payments[0]
661667 let paymentAssetId = payment.assetId
662668 let paymentAmount = payment.amount
663- let checks = [if ((size(userAddresses) > maxRecipients))
669+ let checks = [if ((maxRecipients >= size(userAddresses)))
664670 then true
665671 else throwErr("Too many recipients"), if (argsComparison)
666672 then true
667673 else throwErr("Arguments size mismatch"), if ((paymentAssetId == wxAssetId))
668674 then true
669675 else throwErr("Wrong asset payment")]
670676 if ((checks == checks))
671677 then {
672678 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [paymentAmount, userAddresses, rewards, 0], nil)
673679 if ((tradeRewardInternal == tradeRewardInternal))
674680 then $Tuple2(nil, tradeRewardInternal)
675681 else throw("Strict value is not equal to itself.")
676682 }
677683 else throw("Strict value is not equal to itself.")
678684 }
679685
680686
681687
682688 @Callable(i)
683689 func setManager (pendingManagerPublicKey) = {
684690 let checkCaller = mustManager(i)
685691 if ((checkCaller == checkCaller))
686692 then {
687693 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
688694 if ((checkManagerPublicKey == checkManagerPublicKey))
689695 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
690696 else throw("Strict value is not equal to itself.")
691697 }
692698 else throw("Strict value is not equal to itself.")
693699 }
694700
695701
696702
697703 @Callable(i)
698704 func confirmManager () = {
699705 let pm = pendingManagerPublicKeyOrUnit()
700706 let hasPM = if (isDefined(pm))
701707 then true
702708 else throw("No pending manager")
703709 if ((hasPM == hasPM))
704710 then {
705711 let checkPM = if ((i.callerPublicKey == value(pm)))
706712 then true
707713 else throw("You are not pending manager")
708714 if ((checkPM == checkPM))
709715 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
710716 else throw("Strict value is not equal to itself.")
711717 }
712718 else throw("Strict value is not equal to itself.")
713719 }
714720
715721
716722 @Verifier(tx)
717723 func verify () = {
718724 let targetPublicKey = match managerPublicKeyOrUnit() {
719725 case pk: ByteVector =>
720726 pk
721727 case _: Unit =>
722728 tx.senderPublicKey
723729 case _ =>
724730 throw("Match error")
725731 }
726732 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
727733 }
728734

github/deemru/w8io/026f985 
212.78 ms