tx · BkhWA9UPqTs7853Fbefgbr9AK5ksv5YKxfVoqnpzZL6u

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02000000 Waves

2023.07.11 18:37 [2661433] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "BkhWA9UPqTs7853Fbefgbr9AK5ksv5YKxfVoqnpzZL6u", "fee": 2000000, "feeAssetId": null, "timestamp": 1689089860399, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "22FUqDFYMTCZbAqYUn1KfQfVGkJZk7bXoUZX3mUc9TpoiFFMq8pbMpPiC7nH7cb4kQiqjumWuUjEbaAvmU87UJXW" ], "script": "base64:BgKMHQgCEgYKBAEYEQESBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgQKAhgREgASAwoBCCIDU0VQIgVTQ0FMRSIFTVVMVDgiCnplcm9CaWdJbnQiFHByb2Nlc3NpbmdTdGFnZVRvdGFsIhVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMiC3dhdmVzU3RyaW5nIg5nZXROdW1iZXJCeUtleSIDa2V5Ig9nZXROdW1iZXJPckZhaWwiDmdldFN0cmluZ0J5S2V5Ig9nZXRTdHJpbmdPckZhaWwiDHBhcnNlQXNzZXRJZCIFaW5wdXQiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiA2FicyIDdmFsIglhYnNCaWdJbnQiC2tleU1heERlcHRoIg9tYXhEZXB0aERlZmF1bHQiCG1heERlcHRoIhFrZXlGYWN0b3J5QWRkcmVzcyIRZmFjdG9yeUFkZHJlc3NTdHIiD2ZhY3RvcnlDb250cmFjdCISa2V5RW1pc3Npb25BZGRyZXNzIhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IhNrZXlOdW1Ub1VzZXJNYXBwaW5nIgNudW0iFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUiGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0IhNyZWZlcnJhbFByb2dyYW1OYW1lIhdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudCIbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0IhRyZWZlcnJhbE1pbkdXeEFtb3VudCIZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZSIdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQiFnJlZmVycmVyUmV3YXJkUGVybWlsbGUiGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUiHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlIgtrZXlSZWZlcnJlciIPcmVmZXJyYWxBZGRyZXNzIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILcHJvZ3JhbU5hbWUiDmNsYWltZXJBZGRyZXNzIhJlbWlzc2lvbkFkZHJlc3NTdHIiEGVtaXNzaW9uQ29udHJhY3QiDUlkeENmZ0Fzc2V0SWQiFklkeENmZ1BhY2VtYWtlckFkZHJlc3MiFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QiDklkeENmZ01heERlcHRoIglrZXlDb25maWciEmdldEVtaXNzaW9uQWRkcmVzcyIPZW1pc3Npb25BZGRyZXNzIgx3eEFzc2V0SWRTdHIiCXd4QXNzZXRJZCIVcmVhZENvbmZpZ0FycmF5T3JGYWlsIgxmb3JtYXRDb25maWciGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyIhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0ciIWYm9vc3RpbmdDb250cmFjdE9yRmFpbCIIY2ZnQXJyYXkiH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQiDWtleVVzZXJzQ291bnQiFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQiGmtleUd3eEhvbGRlcnNSZXdhcmRDdXJyZW50IhdrZXlHd3hIb2xkZXJzUmV3YXJkTmV4dCIUa2V5UG9vbFdlaWdodFZpcnR1YWwiFGtleU5leHRQcm9jZXNzZWRVc2VyIg9rZXlMYXRlc3RQZXJpb2QiDWtleU5leHRQZXJpb2QiEmtleVByb2Nlc3NpbmdTdGFnZSIWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZCIQa2V5VXNlclVuY2xhaW1lZCIJdXNlckluZGV4IhtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIiHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIiEmtleUhlaWdodEZvclBlcmlvZCIGcGVyaW9kIh1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZCIXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QiEWtleUxhc3RQYXlvdXRJbmZvIhBQZXJpb2RQYXlvdXRJbmZvIg1tYXRjaGVyUmV3YXJkIg5lbWlzc2lvblJld2FyZCIUa2V5UGF5b3V0SGlzdG9yeUluZm8iF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kIhZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kIhtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MiHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbCIXa2V5VHJhZGluZ1Jld2FyZEhpc3RvcnkiBHVzZXIiAWkiEGtleVRyYWRpbmdSZXdhcmQiC3VzZXJBZGRyZXNzIhBrZXlNYXhSZWNpcGllbnRzIgxIaXN0b3J5RW50cnkiBHR5cGUiBmFtb3VudCIKaGlzdG9yeUtFWSILaGlzdG9yeURBVEEiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMiByRtYXRjaDAiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiE21hbmFnZXJWYXVsdEFkZHJlc3MiC211c3RNYW5hZ2VyIgJwZCICcGsiDmNhbGNVc2VyV2VpZ2h0Ihdib29zdGluZ0NvbnRyYWN0QWRkcmVzcyIPaGVpZ2h0Rm9yUGVyaW9kIgVrTGFzdCIEa0tleSIEa1JhdyILa1VzZXJXZWlnaHQiAWsiAWIiAXciAXAiAnB2IhZjYWxjVXNlcldlaWdodEZvckNsYWltIhB1c2VyV2VpZ2h0T3JVbml0IhVnZXRVc2VySW5kZXhCeUFkZHJlc3MiCm5leHRQZXJpb2QiEWNvbW1vbkNsYWltUmV3YXJkIgd1c2VySWR4IhN1c2VyVW5jbGFpbWVkT3B0aW9uIgF1IhBnZXRUcmFkaW5nUmV3YXJkIhVwYXltZW50QW1vdW50TGVmdE92ZXIiDXVzZXJBZGRyZXNzZXMiB3Jld2FyZHMiC2N1cnJlbnRJdGVyIgZjaGVja3MiE3RyYWRlUmV3YXJkSW50ZXJuYWwiF3RyYWRpbmdSZXdhcmRIaXN0b3J5S2V5Ig5nV3hBbW91bnRTdGFydCIIcmVmZXJyZXIiEWFjdGl2ZVJlZmVycmFsSW52Ig9wcm9jZXNzaW5nU3RhZ2UiDWN1cnJlbnRQZXJpb2QiC2N1cnJlbnRVc2VyIgxsYXRlc3RQZXJpb2QiCnVzZXJzQ291bnQiDnRvdGFsV2VpZ2h0S2V5Igt0b3RhbFdlaWdodCINJHQwMTQ1MTAxNDYyNiIKdXNlcldlaWdodCILdXNlckFjdGlvbnMiDnRvdGFsV2VpZ2h0TmV3IhFwcm9jZXNzaW5nQWN0aW9ucyIadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QiG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZCIPdXNlclRvdGFsQW1vdW50IgtyZWZlcnJhbEludiIOcmVmZXJyZXJSZXdhcmQiDnJlZmVycmFsUmV3YXJkIhB1bmNsYWltZWRBY3Rpb25zIgdjb3VudGVyIgZyZXN1bHQiAUAiC2NoZWNrQ2FsbGVyIgZkZWx0YUgiDGVtaXNzaW9uUmF0ZSIXZ3d4SG9sZGVyc1Jld2FyZEN1cnJlbnQiCWF1eEFtb3VudCICZW0iC21hdGNoZXJQYXJ0IgpwYXlvdXRJbmZvIhdnd3hIb2xkZXJzUmV3YXJkVXBkYXRlZCILdG90YWxSZXdhcmQiB2FjdGlvbnMiB2FkZHJlc3MiDSR0MDE5ODE1MTk4NjUiC2NoZWNrQW1vdW50IhJhbW91bnRGcm9tRW1pc3Npb24iD2NsYWltZWRSZWZlcnJhbCILdG90YWxBbW91bnQiDSR0MDIwNDM4MjA0ODgiEXJlZmVycmFsVW5jbGFpbWVkIg5nd3hBbW91bnRTdGFydCIPbG9ja1N0YXJ0SGVpZ2h0IhJsb2NrRHVyYXRpb25CbG9ja3MiDWxvY2tFbmRIZWlnaHQiDHNjYWxlOFBhcmFtSyIMc2NhbGU4UGFyYW1CIgx3eExvY2tBbW91bnQiDGxvY2tEdXJhdGlvbiIPbWF4TG9ja0R1cmF0aW9uIgdjb2VmZlg4Igt4MUJpZ0ludFN0ciILeDJCaWdJbnRTdHIiDGFtcEJpZ0ludFN0ciITYVByZWNpc2lvbkJpZ0ludFN0ciIYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyIgZuQ29pbnMiCmFQcmVjaXNpb24iD3RhcmdldFByZWNpc2lvbiICeDEiAngyIgNhbXAiA2FubiIDYXJyIgRjYWxjIgNhY2MiA2N1ciINJHQwMjMxMjEyMzE0OCIBZCIFZFByZXYiBWZvdW5kIgJkcCIFZE5leHQiBWREaWZmIg0kdDAyMzc0NjIzODA5IgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIOYXJnc0NvbXBhcmlzb24iDW1heFJlY2lwaWVudHMiB3BheW1lbnQiDnBheW1lbnRBc3NldElkIg1wYXltZW50QW1vdW50IhF1c2VyQWRkcmVzc1N0cmluZyIGcmV3YXJkIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXlfAAFhAgJfXwABYgDoBwABYwCAwtcvAAFkCQC2AgEAAAABZQAAAAFmAAEAAWcCBVdBVkVTAQFoAQFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWkAAAEBagEBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAWkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAWkCDyBpcyBub3QgZGVmaW5lZAEBawEBaQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQFpAgABAWwBAWkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQFpCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFpAg8gaXMgbm90IGRlZmluZWQBAW0BAW4DCQAAAgUBbgUBZwUEdW5pdAkA2QQBBQFuAQFvAQFwCQC5CQIJAMwIAgIQZ3d4X3Jld2FyZC5yaWRlOgkAzAgCBQFwBQNuaWwCASABAXEBAXAJAAIBCQEBbwEFAXABAXIBAXMDCQBmAgAABQFzCQEBLQEFAXMFAXMBAXQBAXMDCQC/AgIFAWQFAXMJAL4CAQUBcwUBcwABdQIMJXNfX21heERlcHRoAAF2AB4AAXcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBdQUBdgEBeAACHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MAAXkJAQFsAQkBAXgAAAF6CQERQGV4dHJOYXRpdmUoMTA2MikBBQF5AQFBAAIdJXMlc19fY29uZmlnX19lbWlzc2lvbkFkZHJlc3MBAUIACQC5CQIJAMwIAgICJXMJAMwIAgIWdm90aW5nRW1pc3Npb25Db250cmFjdAUDbmlsBQFhAAFDCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQF6CQEBQgABAUQBAUUJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAghudW0ydXNlcgkAzAgCCQCkAwEFAUUFA25pbAUBYQABRgkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgILcHJvZ3JhbU5hbWUFA25pbAUBYQABRwIGd3hsb2NrAAFICQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAUYFAUcAAUkJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICDG1pbkdXeEFtb3VudAUDbmlsBQFhAAFKCQBoAgD0AwUBYwABSwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFJBQFKAAFMCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAhZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQNuaWwFAWEAAU0AMgABTgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFMBQFNAAFPCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQNuaWwFAWEAAVAAMgABUQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFPBQFQAQFSAQFTCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFAUgJAMwIAgUBUwUDbmlsBQFhAQFUAgFVAVYJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyYWwJAMwIAgUBVQkAzAgCBQFWBQNuaWwFAWEAAVcJAQFsAQkBAUEAAAFYCQERQGV4dHJOYXRpdmUoMTA2MikBBQFXAAFZAAEAAVoAAgACYWEAAwACYWIABAECYWMAAgolc19fY29uZmlnAQJhZAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQEBQQAJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4JAQFBAAIPIGlzIG5vdCBkZWZpbmVkAAJhZQkBAmFkAAACYWYJAJEDAgkAtQkCCQEFdmFsdWUBCQCdCAIFAmFlCQECYWMABQFhAAEAAmFnCQDZBAEFAmFmAQJhaAAJALUJAgkBAWwBCQECYWMABQFhAQJhaQQCYWYCYWoCYWsBdwkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAIFAmFmCQDMCAIFAmFqCQDMCAIFAmFrCQDMCAIJAKQDAQUBdwUDbmlsBQFhAQJhbAAEAmFtCQECYWgACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhbQUCYWECKGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgbm90IGRlZmluZWQBAmFuAAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAECYW8AAg8lc19fbmV4dFVzZXJOdW0BAmFwAAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQJhcQACHyVzJXNfX2d3eEhvbGRlcnNSZXdhcmRfX2N1cnJlbnQBAmFyAAIcJXMlc19fZ3d4SG9sZGVyc1Jld2FyZF9fbmV4dAECYXMAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAECYXQAAhUlc19fbmV4dFByb2Nlc3NlZFVzZXIBAmF1AAIQJXNfX2xhdGVzdFBlcmlvZAECYXYAAg4lc19fbmV4dFBlcmlvZAECYXcAAhMlc19fcHJvY2Vzc2luZ1N0YWdlAQJheAACFyVzX19uZXh0UHJvY2Vzc2VkUGVyaW9kAQJheQECYXoJALkJAgkAzAgCAgQlcyVkCQDMCAICDXVzZXJVbmNsYWltZWQJAMwIAgkApAMBBQJhegUDbmlsBQFhAQJhQQECYXoJALkJAgkAzAgCAhclcyVkX19uZXh0Q2xhaW1lZFBlcmlvZAkAzAgCCQCkAwEFAmF6BQNuaWwFAWEBAmFCAQJhegkAuQkCCQDMCAICGSVzJWRfX2xhc3RQcm9jZXNzZWRQZXJpb2QJAMwIAgkApAMBBQJhegUDbmlsBQFhAQJhQwECYUQJALkJAgkAzAgCAholcyVkX19zdGFydEhlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFFAQJhRAkAuQkCCQDMCAICFyVzJWRfX2F1eEVtaXNzaW9uUmV3YXJkCQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYUYBAmFECQC5CQIJAMwIAgIaJXMlZF9fdG90YWxBbW91bnRGb3JQZXJpb2QJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhRwACEiVzX19sYXN0UGF5b3V0SW5mbwECYUgDAmFEAmFJAmFKCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQUCYUQJAMwIAgkApAMBBQJhSQkAzAgCCQCkAwEFAmFKBQNuaWwFAWEBAmFLAQJhRAkAuQkCCQDMCAICGCVzJXMlZF9fcGF5b3V0c19faGlzdG9yeQkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFMAQJhRAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsV2VpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYU0CAmFEAmF6CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQJhegkAzAgCAgFrCQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYU4CAmFEAmF6CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQJhegkAzAgCAgFiCQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYU8CAmFEAmF6CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQJhegkAzAgCAgZ3ZWlnaHQJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhUAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUBYQACYVEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFsAQkBAmFQAAECYVICAmFTAmFUCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgINdHJhZGluZ1Jld2FyZAkAzAgCAgdoaXN0b3J5CQDMCAIFAmFTCQDMCAIJANgEAQgFAmFUDXRyYW5zYWN0aW9uSWQFA25pbAUBYQECYVUBAmFWCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg10cmFkaW5nUmV3YXJkCQDMCAIFAmFWBQNuaWwFAWEBAmFXAAkAuQkCCQDMCAICAiVzCQDMCAICDW1heFJlY2lwaWVudHMFA25pbAUBYQECYVgEAmFZAmFTAmFaAmFUBAJiYQkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFZCQDMCAIFAmFTCQDMCAIJANgEAQgFAmFUDXRyYW5zYWN0aW9uSWQFA25pbAUBYQQCYmIJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYVoFA25pbAUBYQkBC1N0cmluZ0VudHJ5AgUCYmEFAmJiAQJiYwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJiZAACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJiZQAEAmJmCQCiCAEJAQJiZAADCQABAgUCYmYCBlN0cmluZwQCYmcFAmJmCQERQGV4dHJOYXRpdmUoMTA2MikBBQJiZwUEdGhpcwECYmgABAJiaQkBAmJlAAQCYmYJAJ0IAgUCYmkJAQJiYwADCQABAgUCYmYCBlN0cmluZwQCYmcFAmJmCQDZBAEFAmJnAwkAAQIFAmJmAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmJqAQJhVAQCYmsJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQCYmYJAQJiaAADCQABAgUCYmYCCkJ5dGVWZWN0b3IEAmJsBQJiZgMJAAACCAUCYVQPY2FsbGVyUHVibGljS2V5BQJibAYFAmJrAwkAAQIFAmJmAgRVbml0AwkAAAIIBQJhVAZjYWxsZXIFBHRoaXMGBQJiawkAAgECC01hdGNoIGVycm9yAQJibQQCYm4CYm8CYUQCYXoEAmJwCQECYUIBBQJhegQCYnEJAQJhTQIFAmFEBQJhegQCYnIJAJoIAgUCYm4FAmJxBAJicwkBAmFPAgUCYUQFAmF6AwkBCWlzRGVmaW5lZAEFAmJyBAJidAkBBXZhbHVlAQUCYnIEAmJ1CQEFdmFsdWUBCQCaCAIFAmJuCQECYU4CBQJhRAUCYXoEAmJ2CQBkAgkAaAIFAmJ0BQJibwUCYnUDCQBmAgUCYnYAAAkAlAoCCQBpAgUCYnYFAWIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJwBQJhRAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYnMFAmJ2BQNuaWwJAJQKAgAABQNuaWwEAmJ3CQCaCAIFBHRoaXMFAmJwAwMJAQlpc0RlZmluZWQBBQJidwkAZwIFAmFECQEFdmFsdWUBBQJidwcEAmJ4CQEFdmFsdWUBBQJidwQCYnQJAQV2YWx1ZQEJAJoIAgUCYm4JAQJhTQIFAmJ4BQJhegQCYnUJAQV2YWx1ZQEJAJoIAgUCYm4JAQJhTgIFAmJ4BQJhegQCYnYJAGQCCQBoAgUCYnQFAmJvBQJidQMJAGYCBQJidgAACQCUCgIJAGkCBQJidgUBYgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYnMFAmJ2BQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBAmJ5BAJibgJibwJhRAJhegQCYnMJAQJhTwIFAmFEBQJhegQCYnoJAJ8IAQUCYnMEAmJmBQJiegMJAAECBQJiZgIEVW5pdAAAAwkAAQIFAmJmAgNJbnQEAmJ2BQJiZgkAaQIFAmJ2BQFiCQACAQILTWF0Y2ggZXJyb3IBAmJBAgJhawJhVgQBaQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCHVzZXIybnVtCQDMCAIFAmFWBQNuaWwFAWEJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBQJhawUBaQkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAUCYVYCLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUBaQECYkIACQEBaAEJAQJhdgABAmJDAQJhVgQCYW0JAQJhaAAEAmJECQECYkECCQCRAwIFAmFtBQJhYQUCYVYEAmJFCQCfCAEJAQJheQEFAmJEBAJiZgUCYkUDCQABAgUCYmYCBFVuaXQJAJQKAgAABQNuaWwDCQABAgUCYmYCA0ludAQCYkYFAmJmCQCUCgIFAmJGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXkBBQJiRAAABQNuaWwJAAIBAgtNYXRjaCBlcnJvcgECYkcBAmFWCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJhVQEFAmFWAAASAmFUARN0cmFkZVJld2FyZEludGVybmFsBAJiSAJiSQJiSgJiSwMJAAACBQJiSwkAkAMBBQJiSQUDbmlsBAJiTAkAzAgCAwkAAAIIBQJhVAZjYWxsZXIFBHRoaXMGCQEBcQECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIDCQBnAgUCYkgJAJEDAgUCYkoFAmJLBgkBAXEBAhxpbnN1ZmZpY2llbnQgcGF5bWVudCBhc3NldElkBQNuaWwDCQAAAgUCYkwFAmJMBAJiTQkA/AcEBQR0aGlzAhN0cmFkZVJld2FyZEludGVybmFsCQDMCAIJAGUCBQJiSAkAkQMCBQJiSgUCYksJAMwIAgUCYkkJAMwIAgUCYkoJAMwIAgkAZAIFAmJLAAEFA25pbAUDbmlsAwkAAAIFAmJNBQJiTQQCYk4JAQJhUgIJAJEDAgUCYkkFAmJLBQJhVAQCYVYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYkkFAmJLCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJOCQCRAwIFAmJKBQJiSwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFVAQkAkQMCBQJiSQUCYksJAJEDAgUCYkoFAmJLBQNuaWwFAmJNCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUARZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5AgJhVgJiTwQCYlAJAJ0IAgUCYVEJAQFSAQUCYVYEAmJRAwkAAAIFAmJQBQR1bml0BQR1bml0CQD8BwQFAmFRAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFAUgJAMwIAgUCYVYJAMwIAgkAZwIFAmJPBQFLBQNuaWwFA25pbAMJAAACBQJiUQUCYlEJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUAQ5maW5hbGl6ZUhlbHBlcgAEAmJSCQELdmFsdWVPckVsc2UCCQCfCAEJAQJhdwAFAWUEAmJTCQEBaAEJAQJheAAEAmJUCQEBaAEJAQJhdAAEAmJVCQEBaAEJAQJhdQAEAmJWCQELdmFsdWVPckVsc2UCCQCaCAIJAQJhbAAJAQJhbwAAAAQCYlcJAQJhTAEFAmJTBAJiWAkBAWgBCQECYUwBBQJiUwQCYm8JAQFoAQkBAmFDAQUCYlMDCQBmAgUCYlMFAmJVCQCUCgIFA25pbAcDCQAAAgUCYlIFAWUEAmJZCQECYm0ECQECYWwABQJibwUCYlMFAmJUBAJiWggFAmJZAl8xBAJjYQgFAmJZAl8yBAJjYgkAZAIFAmJYBQJiWgQCY2MDCQBmAgkAZQIFAmJWAAEFAmJUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQACQBkAgUCYlQAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXcABQFmCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYlcFAmNiBQNuaWwFAmNjBQJjYQYDCQAAAgUCYlIFAWYEAmJaCQECYnkECQECYWwABQJibwUCYlMFAmJUBAJjZAkAawMJAQFoAQkBAmFGAQUCYlMFAmJaBQJiWAQCY2UJAGsDCQEBaAEJAQJhRQEFAmJTBQJiWgUCYlgEAmNmCQBkAgUCY2UFAmNkBAJiRQkAnwgBCQECYXkBBQJiVAQCYVYJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQJhbAAJAQFEAQUCYlQEAmJQCQCdCAIFAmFRCQEBUgEFAmFWBAJiUQMJAAACBQJiUAUEdW5pdAUEdW5pdAkA/AcEBQJhUQIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBQFICQDMCAIFAmFWCQDMCAIJAGcCBQJiWgUBSwUDbmlsBQNuaWwDCQAAAgUCYlEFAmJRBAJjZwMDCQAAAgUCYlAFBHVuaXQGCQBmAgUBSwUCYloFBHVuaXQEAmNoCQBrAwUCY2YFAU4FAWIEAmNpCQBrAwUCY2YFAVEFAWIJAPwHBAUCYVECDGluY1VuY2xhaW1lZAkAzAgCBQFICQDMCAIFAmFWCQDMCAIFAmNoCQDMCAIFAmNpBQNuaWwFA25pbAMJAAACBQJjZwUCY2cEAmNqCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXkBBQJiVAkAZAIJAQt2YWx1ZU9yRWxzZQIFAmJFAAAFAmNmBQNuaWwEAmNjAwkAZgIJAGUCBQJiVgABBQJiVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF0AAkAZAIFAmJUAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF4AAkAZAIFAmJTAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAAAAAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXcABQNuaWwJAJQKAgkAzggCBQJjagUCY2MGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYaW52YWxpZCBwcm9jZXNzaW5nIHN0YWdlAmFUAQ9maW5hbGl6ZVdyYXBwZXIBAmNrBAJjbAoAAmNtCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAMJAAECBQJjbQIHQm9vbGVhbgUCY20JAAIBCQCsAgIJAAMBBQJjbQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJjbAUCY2wDCQEBIQEFAmNsAwkAAAIFAmNrBQF3CQACAQISTm90aGluZyB0byBwcm9jZXNzCQCUCgIFA25pbAUEdW5pdAMJAGYCBQJjawAACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgkAZQIFAmNrAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhVAEdcHJvY2Vzc1BlbmRpbmdQZXJpb2RzQW5kVXNlcnMACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgUBdwUDbmlsBQNuaWwCYVQBB2RlcG9zaXQABAJjbgMJAAACCAUCYVQGY2FsbGVyBQFDBgkBAmJqAQUCYVQDCQAAAgUCY24FAmNuBAJhRAkBAmJCAAQCY28JAGUCBQZoZWlnaHQJAQFqAQkBAmFuAAQCY3AJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQFYCQECYXAACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBAmFwAAIPIGlzIG5vdCBkZWZpbmVkBAJjcQkBC3ZhbHVlT3JFbHNlAgkAmggCBQFYCQECYXEAAAADCQAAAgUCY3EFAmNxBAJjcgkAawMJAGgCBQJjbwUCY3EFAmNwBQFjBAJjcwMJAGYCBQJjcgAACQD8BwQFAVgCBGVtaXQJAMwIAgUCY3IFA25pbAUDbmlsBQR1bml0AwkAAAIFAmNzBQJjcwQCY3QAAAQCY3UJAQJhSAMFAmFEBQJjdAUCY3IEAmN2CgACY20JAPwHBAUBWAIWZ3d4SG9sZGVyc1Jld2FyZFVwZGF0ZQUDbmlsBQNuaWwDCQABAgUCY20CB0Jvb2xlYW4FAmNtCQACAQkArAICCQADAQUCY20CHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUCY3YFAmN2BAJjdwkAZAIFAmN0BQJjcgQCY3gDAwkAAAIFAmN3AAAJAQEhAQUCY3YHBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdQAFAmFECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUMBBQJhRAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUUBBQJhRAUCY3IJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhbgAFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFGAQUCYUQFAmN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXYACQBkAgUCYUQAAQkAzAgCCQELU3RyaW5nRW50cnkCCQECYUcABQJjdQkAzAgCCQELU3RyaW5nRW50cnkCCQECYUsBBQJhRAUCY3UFA25pbAkAlAoCBQJjeAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhVAELY2xhaW1SZXdhcmQABAJhbQkBAmFoAAQCY3kJAKUIAQgFAmFUBmNhbGxlcgQCY3oJAQJiQwEFAmN5BAJhWggFAmN6Al8xBAJjeAgFAmN6Al8yBAJjQQMJAGYCBQJhWgAABgkAAgECEE5vdGhpbmcgdG8gY2xhaW0DCQAAAgUCY0EFAmNBBAJjQgAABAJjQwoAAmNtCQD8BwQFAmFRAgVjbGFpbQkAzAgCBQFIBQNuaWwFA25pbAMJAAECBQJjbQIDSW50BQJjbQkAAgEJAKwCAgkAAwEFAmNtAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmNECQBkAgUCYVoFAmNDCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCYVQGY2FsbGVyBQJjRAkA2QQBCQCRAwIFAmFtBQFZCQDMCAIJAQJhWAQCBWNsYWltBQJjeQUCYVoFAmFUBQNuaWwFAmN4CQDMCAIFAmNECQDMCAIFAmNCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVQBE2NsYWltUmV3YXJkUkVBRE9OTFkBAmN5BAJjRQkBAmJDAQUCY3kEAmFaCAUCY0UCXzEEAmN4CAUCY0UCXzIEAmNGCQELdmFsdWVPckVsc2UCCQCaCAIFAmFRCQEBVAIFAUgFAmN5AAAEAmNECQBkAgUCYVoFAmNGCQCUCgIFA25pbAUCY0QCYVQBHWxhdGVzdEZpbmFsaXplZFBlcmlvZFJFQURPTkxZAQJjeQkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmF1AAD///////////8BAmFUASFsYXRlc3RGaW5hbGl6ZWRQZXJpb2RJbmZvUkVBRE9OTFkBAmN5CQCUCgIFA25pbAkBAWsBCQECYUcAAmFUARVjYWxjR3d4UGFyYW1zUkVBRE9OTFkDAmNHAmNIAmNJBAJjSgkAZAIFAmNIBQJjSQQCY0sJAQEtAQkAawMFAmNHBQFiBQJjSQQCY0wJAGgCCQBrAwUCY0cFAWIFAmNJBQJjSgkAlAoCBQNuaWwJAMwIAgUCY0sJAMwIAgUCY0wJAMwIAgkBAmJCAAUDbmlsAmFUARpjYWxjR3d4QW1vdW50U3RhcnRSRUFET05MWQMCY00CY04CY08EAmNQCQBrAwUCY04FAWMFAmNPBAJiTwkAawMFAmNNBQJjUAUBYwkAlAoCBQNuaWwJAMwIAgUCYk8FA25pbAJhVAEVb25FbWlzc2lvbkZvckd3eFN0YXJ0AAMJAQIhPQIIBQJhVAZjYWxsZXIFAXoJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhbgAFBmhlaWdodAUDbmlsAmFUASNsYXRlc3RQZXJpb2RFbWlzc2lvblJld2FyZHNSRUFET05MWQECY3kEAmFECQECYkIACQCUCgIFA25pbAkAzAgCCQEBaAEJAQJhRQEFAmFEBQNuaWwCYVQBBWNhbGNEBQJjUQJjUgJjUwJjVAJjVQQCY1YJALYCAQACBAJjVwkApwMBBQJjVAQCY1gJAKcDAQUCY1UEAmNZCQCnAwEFAmNRBAJjWgkApwMBBQJjUgQCZGEJALkCAgkApwMBBQJjUwUCY1cEAmJnCQC3AgIFAmNZBQJjWgMJAAACBQJiZwUBZAkAlAoCBQNuaWwJAKYDAQUBZAQCZGIJALkCAgUCZGEFAmNWBAJkYwkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYFA25pbAoBAmRkAgJkZQJkZgQCZGcFAmRlBAJkaAgFAmRnAl8xBAJkaQgFAmRnAl8yBAJkaggFAmRnAl8zAwkBAiE9AgUCZGoFBHVuaXQFAmRlBAJkawkAugICCQC5AgIJALkCAgUCZGgFAmRoBQJkaAkAuQICCQC5AgIJALkCAgUCY1kFAmNaBQJjVgUCY1YEAmRsCQC6AgIJALkCAgkAtwICCQC6AgIJALkCAgUCZGIFAmJnBQJjVwkAuQICBQJkawUCY1YFAmRoCQC3AgIJALoCAgkAuQICCQC4AgIFAmRiBQJjVwUCZGgFAmNXCQC5AgIJALcCAgUCY1YJALYCAQABBQJkawQCZG0JAQF0AQkAuAICBQJkbAkBBXZhbHVlAQUCZGgDCQDAAgIFAmNYBQJkbQkAlQoDBQJkbAUCZGgFAmRmCQCVCgMFAmRsBQJkaAUEdW5pdAQCZG4KAAJkbwUCZGMKAAJkcAkAkAMBBQJkbwoAAmRxCQCVCgMFAmJnBQR1bml0BQR1bml0CgECZHICAmRzAmR0AwkAZwIFAmR0BQJkcAUCZHMJAQJkZAIFAmRzCQCRAwIFAmRvBQJkdAoBAmR1AgJkcwJkdAMJAGcCBQJkdAUCZHAFAmRzCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNwkBAmR1AgkBAmRyAgkBAmRyAgkBAmRyAgkBAmRyAgkBAmRyAgkBAmRyAgkBAmRyAgUCZHEAAAABAAIAAwAEAAUABgAHBAJkbAgFAmRuAl8xBAJkaQgFAmRuAl8yBAJkaggFAmRuAl8zAwkBAiE9AgUCZGoFBHVuaXQJAJQKAgUDbmlsCQCmAwEFAmRsBAJkbQkBAXQBCQC4AgIFAmRsCQEFdmFsdWUBBQJkaQkAAgEJAKwCAgIdRCBjYWxjdWxhdGlvbiBlcnJvciwgZERpZmYgPSAJAKYDAQUCZG0CYVQBC3RyYWRlUmV3YXJkAgJiSQJiSgQCZHYJAAACCQCQAwEFAmJJCQCQAwEFAmJKBAJkdwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYVcAAAAEAmR4CQCRAwIIBQJhVAhwYXltZW50cwAABAJkeQgFAmR4B2Fzc2V0SWQEAmR6CAUCZHgGYW1vdW50BAJiTAkAzAgCAwkAZwIFAmR3CQCQAwEFAmJJBgkBAXEBAhNUb28gbWFueSByZWNpcGllbnRzCQDMCAIDBQJkdgYJAQFxAQIXQXJndW1lbnRzIHNpemUgbWlzbWF0Y2gJAMwIAgMJAAACBQJkeQUCYWcGCQEBcQECE1dyb25nIGFzc2V0IHBheW1lbnQFA25pbAMJAAACBQJiTAUCYkwEAmJNCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgUCZHoJAMwIAgUCYkkJAMwIAgUCYkoJAMwIAgAABQNuaWwFA25pbAMJAAACBQJiTQUCYk0JAJQKAgUDbmlsBQJiTQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhVAESY2xhaW1UcmFkaW5nUmV3YXJkAAQCYVYIBQJhVAZjYWxsZXIEAmRBCQClCAEFAmFWBAJkQgkBAmJHAQUCZEEDCQBmAgUCZEIAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFWBQJkQgUCYWcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhVQEFAmRBAAAFA25pbAUCZEIJAQFxAQIQbm90aGluZyB0byBjbGFpbQJhVAEaY2xhaW1UcmFkaW5nUmV3YXJkUkVBRE9OTFkBAmFWCQCUCgIFA25pbAkBAmJHAQUCYVYBAmRDAQJkRAAEAmRFBAJiZgkBAmJoAAMJAAECBQJiZgIKQnl0ZVZlY3RvcgQCYmwFAmJmBQJibAMJAAECBQJiZgIEVW5pdAgFAmRDD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJkQwlib2R5Qnl0ZXMJAJEDAggFAmRDBnByb29mcwAABQJkReC5ky4=", "height": 2661433, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2mpHwStDBLkv35JpNCpUxnV7cYBhDfi4mBkQqndPd8Pp Next: FcGj6nyN8E5oU5UU7gXrQ686vixxyrXxauuC5z8XFjES Diff:
OldNewDifferences
695695 @Callable(i)
696696 func claimTradingReward () = {
697697 let userAddress = i.caller
698- let reward = getTradingReward(toString(userAddress))
698+ let userAddressString = toString(userAddress)
699+ let reward = getTradingReward(userAddressString)
699700 if ((reward > 0))
700- then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId)], reward)
701+ then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
701702 else throwErr("nothing to claim")
702703 }
703704
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
4040
4141 func abs (val) = if ((0 > val))
4242 then -(val)
4343 else val
4444
4545
4646 func absBigInt (val) = if ((zeroBigInt > val))
4747 then -(val)
4848 else val
4949
5050
5151 let keyMaxDepth = "%s__maxDepth"
5252
5353 let maxDepthDefault = 30
5454
5555 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
5656
5757 func keyFactoryAddress () = "%s%s__config__factoryAddress"
5858
5959
6060 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
6161
6262 let factoryContract = addressFromStringValue(factoryAddressStr)
6363
6464 func keyEmissionAddress () = "%s%s__config__emissionAddress"
6565
6666
6767 func keyVotingEmissionContract () = makeString(["%s", "votingEmissionContract"], SEP)
6868
6969
7070 let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract()))
7171
7272 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
7373
7474
7575 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
7676
7777 let referralProgramNameDefault = "wxlock"
7878
7979 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
8080
8181 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
8282
8383 let referralMinGWxAmountDefault = (500 * MULT8)
8484
8585 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
8686
8787 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
8888
8989 let referrerRewardPermilleDefault = 50
9090
9191 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
9292
9393 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
9494
9595 let referralRewardPermilleDefault = 50
9696
9797 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
9898
9999 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
100100
101101
102102 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
103103
104104
105105 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
106106
107107 let emissionContract = addressFromStringValue(emissionAddressStr)
108108
109109 let IdxCfgAssetId = 1
110110
111111 let IdxCfgPacemakerAddress = 2
112112
113113 let IdxCfgBoostingContract = 3
114114
115115 let IdxCfgMaxDepth = 4
116116
117117 func keyConfig () = "%s__config"
118118
119119
120120 func getEmissionAddress () = addressFromStringValue(valueOrErrorMessage(getString(this, keyEmissionAddress()), (("mandatory this." + keyEmissionAddress()) + " is not defined")))
121121
122122
123123 let emissionAddress = getEmissionAddress()
124124
125125 let wxAssetIdStr = split(value(getString(emissionAddress, keyConfig())), SEP)[1]
126126
127127 let wxAssetId = fromBase58String(wxAssetIdStr)
128128
129129 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
130130
131131
132132 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
133133
134134
135135 func boostingContractOrFail () = {
136136 let cfgArray = readConfigArrayOrFail()
137137 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
138138 }
139139
140140
141141 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
142142
143143
144144 func keyUsersCount () = "%s__nextUserNum"
145145
146146
147147 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
148148
149149
150150 func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
151151
152152
153153 func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
154154
155155
156156 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
157157
158158
159159 func keyNextProcessedUser () = "%s__nextProcessedUser"
160160
161161
162162 func keyLatestPeriod () = "%s__latestPeriod"
163163
164164
165165 func keyNextPeriod () = "%s__nextPeriod"
166166
167167
168168 func keyProcessingStage () = "%s__processingStage"
169169
170170
171171 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
172172
173173
174174 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
175175
176176
177177 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
178178
179179
180180 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
181181
182182
183183 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
184184
185185
186186 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
187187
188188
189189 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
190190
191191
192192 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
193193
194194
195195 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
196196
197197
198198 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
199199
200200
201201 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
202202
203203
204204 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
205205
206206
207207 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
208208
209209
210210 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
211211
212212
213213 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
214214
215215
216216 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
217217
218218 func keyTradingRewardHistory (user,i) = makeString(["%s%s%s%s", "tradingReward", "history", user, toBase58String(i.transactionId)], SEP)
219219
220220
221221 func keyTradingReward (userAddress) = makeString(["%s%s", "tradingReward", userAddress], SEP)
222222
223223
224224 func keyMaxRecipients () = makeString(["%s", "maxRecipients"], SEP)
225225
226226
227227 func HistoryEntry (type,user,amount,i) = {
228228 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
229229 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
230230 StringEntry(historyKEY, historyDATA)
231231 }
232232
233233
234234 func keyManagerPublicKey () = "%s__managerPublicKey"
235235
236236
237237 func keyManagerVaultAddress () = "%s__managerVaultAddress"
238238
239239
240240 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
241241 case s: String =>
242242 addressFromStringValue(s)
243243 case _ =>
244244 this
245245 }
246246
247247
248248 func managerPublicKeyOrUnit () = {
249249 let managerVaultAddress = getManagerVaultAddressOrThis()
250250 match getString(managerVaultAddress, keyManagerPublicKey()) {
251251 case s: String =>
252252 fromBase58String(s)
253253 case _: Unit =>
254254 unit
255255 case _ =>
256256 throw("Match error")
257257 }
258258 }
259259
260260
261261 func mustManager (i) = {
262262 let pd = throw("Permission denied")
263263 match managerPublicKeyOrUnit() {
264264 case pk: ByteVector =>
265265 if ((i.callerPublicKey == pk))
266266 then true
267267 else pd
268268 case _: Unit =>
269269 if ((i.caller == this))
270270 then true
271271 else pd
272272 case _ =>
273273 throw("Match error")
274274 }
275275 }
276276
277277
278278 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
279279 let kLast = keyLastProcessedPeriodOfUser(userIndex)
280280 let kKey = keyUserKValueForPeriod(period, userIndex)
281281 let kRaw = getInteger(boostingContractAddress, kKey)
282282 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
283283 if (isDefined(kRaw))
284284 then {
285285 let k = value(kRaw)
286286 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
287287 let w = ((k * heightForPeriod) + b)
288288 if ((w > 0))
289289 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
290290 else $Tuple2(0, nil)
291291 }
292292 else {
293293 let p = getInteger(this, kLast)
294294 if (if (isDefined(p))
295295 then (period >= value(p))
296296 else false)
297297 then {
298298 let pv = value(p)
299299 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
300300 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
301301 let w = ((k * heightForPeriod) + b)
302302 if ((w > 0))
303303 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
304304 else $Tuple2(0, nil)
305305 }
306306 else $Tuple2(0, nil)
307307 }
308308 }
309309
310310
311311 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
312312 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
313313 let userWeightOrUnit = getInteger(kUserWeight)
314314 match userWeightOrUnit {
315315 case _: Unit =>
316316 0
317317 case w: Int =>
318318 (w / SCALE)
319319 case _ =>
320320 throw("Match error")
321321 }
322322 }
323323
324324
325325 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
326326 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
327327 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
328328 }
329329
330330
331331 func nextPeriod () = getNumberByKey(keyNextPeriod())
332332
333333
334334 func commonClaimReward (userAddress) = {
335335 let cfgArray = readConfigArrayOrFail()
336336 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
337337 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
338338 match userUnclaimedOption {
339339 case _: Unit =>
340340 $Tuple2(0, nil)
341341 case u: Int =>
342342 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
343343 case _ =>
344344 throw("Match error")
345345 }
346346 }
347347
348348
349349 func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
350350
351351
352352 @Callable(i)
353353 func tradeRewardInternal (paymentAmountLeftOver,userAddresses,rewards,currentIter) = if ((currentIter == size(userAddresses)))
354354 then nil
355355 else {
356356 let checks = [if ((i.caller == this))
357357 then true
358358 else throwErr("Permission denied"), if ((paymentAmountLeftOver >= rewards[currentIter]))
359359 then true
360360 else throwErr("insufficient payment assetId")]
361361 if ((checks == checks))
362362 then {
363363 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [(paymentAmountLeftOver - rewards[currentIter]), userAddresses, rewards, (currentIter + 1)], nil)
364364 if ((tradeRewardInternal == tradeRewardInternal))
365365 then {
366366 let tradingRewardHistoryKey = keyTradingRewardHistory(userAddresses[currentIter], i)
367367 let userAddress = addressFromStringValue(userAddresses[currentIter])
368368 $Tuple2([IntegerEntry(tradingRewardHistoryKey, rewards[currentIter]), IntegerEntry(keyTradingReward(userAddresses[currentIter]), rewards[currentIter])], tradeRewardInternal)
369369 }
370370 else throw("Strict value is not equal to itself.")
371371 }
372372 else throw("Strict value is not equal to itself.")
373373 }
374374
375375
376376
377377 @Callable(i)
378378 func updateReferralActivity (userAddress,gWxAmountStart) = {
379379 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
380380 let activeReferralInv = if ((referrer == unit))
381381 then unit
382382 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
383383 if ((activeReferralInv == activeReferralInv))
384384 then $Tuple2(nil, unit)
385385 else throw("Strict value is not equal to itself.")
386386 }
387387
388388
389389
390390 @Callable(i)
391391 func finalizeHelper () = {
392392 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
393393 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
394394 let currentUser = getNumberByKey(keyNextProcessedUser())
395395 let latestPeriod = getNumberByKey(keyLatestPeriod())
396396 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
397397 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
398398 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
399399 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
400400 if ((currentPeriod > latestPeriod))
401401 then $Tuple2(nil, false)
402402 else if ((processingStage == processingStageTotal))
403403 then {
404404 let $t01451014626 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
405405 let userWeight = $t01451014626._1
406406 let userActions = $t01451014626._2
407407 let totalWeightNew = (totalWeight + userWeight)
408408 let processingActions = if (((usersCount - 1) > currentUser))
409409 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
410410 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
411411 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
412412 }
413413 else if ((processingStage == processingStageShares))
414414 then {
415415 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
416416 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
417417 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
418418 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
419419 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
420420 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
421421 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
422422 let activeReferralInv = if ((referrer == unit))
423423 then unit
424424 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
425425 if ((activeReferralInv == activeReferralInv))
426426 then {
427427 let referralInv = if (if ((referrer == unit))
428428 then true
429429 else (referralMinGWxAmount > userWeight))
430430 then unit
431431 else {
432432 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
433433 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
434434 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
435435 }
436436 if ((referralInv == referralInv))
437437 then {
438438 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
439439 let processingActions = if (((usersCount - 1) > currentUser))
440440 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
441441 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
442442 $Tuple2((unclaimedActions ++ processingActions), true)
443443 }
444444 else throw("Strict value is not equal to itself.")
445445 }
446446 else throw("Strict value is not equal to itself.")
447447 }
448448 else throw("invalid processing stage")
449449 }
450450
451451
452452
453453 @Callable(i)
454454 func finalizeWrapper (counter) = {
455455 let result = {
456456 let @ = invoke(this, "finalizeHelper", nil, nil)
457457 if ($isInstanceOf(@, "Boolean"))
458458 then @
459459 else throw(($getType(@) + " couldn't be cast to Boolean"))
460460 }
461461 if ((result == result))
462462 then if (!(result))
463463 then if ((counter == maxDepth))
464464 then throw("Nothing to process")
465465 else $Tuple2(nil, unit)
466466 else if ((counter > 0))
467467 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
468468 else $Tuple2(nil, unit)
469469 else throw("Strict value is not equal to itself.")
470470 }
471471
472472
473473
474474 @Callable(i)
475475 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
476476
477477
478478
479479 @Callable(i)
480480 func deposit () = {
481481 let checkCaller = if ((i.caller == votingEmissionContract))
482482 then true
483483 else mustManager(i)
484484 if ((checkCaller == checkCaller))
485485 then {
486486 let period = nextPeriod()
487487 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
488488 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
489489 let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
490490 if ((gwxHoldersRewardCurrent == gwxHoldersRewardCurrent))
491491 then {
492492 let auxAmount = fraction((deltaH * gwxHoldersRewardCurrent), emissionRate, MULT8)
493493 let em = if ((auxAmount > 0))
494494 then invoke(emissionContract, "emit", [auxAmount], nil)
495495 else unit
496496 if ((em == em))
497497 then {
498498 let matcherPart = 0
499499 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
500500 let gwxHoldersRewardUpdated = {
501501 let @ = invoke(emissionContract, "gwxHoldersRewardUpdate", nil, nil)
502502 if ($isInstanceOf(@, "Boolean"))
503503 then @
504504 else throw(($getType(@) + " couldn't be cast to Boolean"))
505505 }
506506 if ((gwxHoldersRewardUpdated == gwxHoldersRewardUpdated))
507507 then {
508508 let totalReward = (matcherPart + auxAmount)
509509 let actions = if (if ((totalReward == 0))
510510 then !(gwxHoldersRewardUpdated)
511511 else false)
512512 then nil
513513 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)]
514514 $Tuple2(actions, unit)
515515 }
516516 else throw("Strict value is not equal to itself.")
517517 }
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 else throw("Strict value is not equal to itself.")
521521 }
522522 else throw("Strict value is not equal to itself.")
523523 }
524524
525525
526526
527527 @Callable(i)
528528 func claimReward () = {
529529 let cfgArray = readConfigArrayOrFail()
530530 let address = toString(i.caller)
531531 let $t01981519865 = commonClaimReward(address)
532532 let amount = $t01981519865._1
533533 let actions = $t01981519865._2
534534 let checkAmount = if ((amount > 0))
535535 then true
536536 else throw("Nothing to claim")
537537 if ((checkAmount == checkAmount))
538538 then {
539539 let amountFromEmission = 0
540540 let claimedReferral = {
541541 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
542542 if ($isInstanceOf(@, "Int"))
543543 then @
544544 else throw(($getType(@) + " couldn't be cast to Int"))
545545 }
546546 let totalAmount = (amount + claimedReferral)
547547 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
548548 }
549549 else throw("Strict value is not equal to itself.")
550550 }
551551
552552
553553
554554 @Callable(i)
555555 func claimRewardREADONLY (address) = {
556556 let $t02043820488 = commonClaimReward(address)
557557 let amount = $t02043820488._1
558558 let actions = $t02043820488._2
559559 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
560560 let totalAmount = (amount + referralUnclaimed)
561561 $Tuple2(nil, totalAmount)
562562 }
563563
564564
565565
566566 @Callable(i)
567567 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
568568
569569
570570
571571 @Callable(i)
572572 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
573573
574574
575575
576576 @Callable(i)
577577 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
578578 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
579579 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
580580 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
581581 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
582582 }
583583
584584
585585
586586 @Callable(i)
587587 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
588588 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
589589 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
590590 $Tuple2(nil, [gWxAmountStart])
591591 }
592592
593593
594594
595595 @Callable(i)
596596 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
597597 then throw("permissions denied")
598598 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
599599
600600
601601
602602 @Callable(i)
603603 func latestPeriodEmissionRewardsREADONLY (address) = {
604604 let period = nextPeriod()
605605 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
606606 }
607607
608608
609609
610610 @Callable(i)
611611 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
612612 let nCoins = toBigInt(2)
613613 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
614614 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
615615 let x1 = parseBigIntValue(x1BigIntStr)
616616 let x2 = parseBigIntValue(x2BigIntStr)
617617 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
618618 let s = (x1 + x2)
619619 if ((s == zeroBigInt))
620620 then $Tuple2(nil, toString(zeroBigInt))
621621 else {
622622 let ann = (amp * nCoins)
623623 let arr = [0, 1, 2, 3, 4, 5, 6]
624624 func calc (acc,cur) = {
625625 let $t02312123148 = acc
626626 let d = $t02312123148._1
627627 let dPrev = $t02312123148._2
628628 let found = $t02312123148._3
629629 if ((found != unit))
630630 then acc
631631 else {
632632 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
633633 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
634634 let dDiff = absBigInt((dNext - value(d)))
635635 if ((targetPrecision >= dDiff))
636636 then $Tuple3(dNext, d, cur)
637637 else $Tuple3(dNext, d, unit)
638638 }
639639 }
640640
641641 let $t02374623809 = {
642642 let $l = arr
643643 let $s = size($l)
644644 let $acc0 = $Tuple3(s, unit, unit)
645645 func $f0_1 ($a,$i) = if (($i >= $s))
646646 then $a
647647 else calc($a, $l[$i])
648648
649649 func $f0_2 ($a,$i) = if (($i >= $s))
650650 then $a
651651 else throw("List size exceeds 7")
652652
653653 $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)
654654 }
655655 let dNext = $t02374623809._1
656656 let dPrev = $t02374623809._2
657657 let found = $t02374623809._3
658658 if ((found != unit))
659659 then $Tuple2(nil, toString(dNext))
660660 else {
661661 let dDiff = absBigInt((dNext - value(dPrev)))
662662 throw(("D calculation error, dDiff = " + toString(dDiff)))
663663 }
664664 }
665665 }
666666
667667
668668
669669 @Callable(i)
670670 func tradeReward (userAddresses,rewards) = {
671671 let argsComparison = (size(userAddresses) == size(rewards))
672672 let maxRecipients = valueOrElse(getInteger(keyMaxRecipients()), 0)
673673 let payment = i.payments[0]
674674 let paymentAssetId = payment.assetId
675675 let paymentAmount = payment.amount
676676 let checks = [if ((maxRecipients >= size(userAddresses)))
677677 then true
678678 else throwErr("Too many recipients"), if (argsComparison)
679679 then true
680680 else throwErr("Arguments size mismatch"), if ((paymentAssetId == wxAssetId))
681681 then true
682682 else throwErr("Wrong asset payment")]
683683 if ((checks == checks))
684684 then {
685685 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [paymentAmount, userAddresses, rewards, 0], nil)
686686 if ((tradeRewardInternal == tradeRewardInternal))
687687 then $Tuple2(nil, tradeRewardInternal)
688688 else throw("Strict value is not equal to itself.")
689689 }
690690 else throw("Strict value is not equal to itself.")
691691 }
692692
693693
694694
695695 @Callable(i)
696696 func claimTradingReward () = {
697697 let userAddress = i.caller
698- let reward = getTradingReward(toString(userAddress))
698+ let userAddressString = toString(userAddress)
699+ let reward = getTradingReward(userAddressString)
699700 if ((reward > 0))
700- then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId)], reward)
701+ then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
701702 else throwErr("nothing to claim")
702703 }
703704
704705
705706
706707 @Callable(i)
707708 func claimTradingRewardREADONLY (userAddress) = $Tuple2(nil, getTradingReward(userAddress))
708709
709710
710711 @Verifier(tx)
711712 func verify () = {
712713 let targetPublicKey = match managerPublicKeyOrUnit() {
713714 case pk: ByteVector =>
714715 pk
715716 case _: Unit =>
716717 tx.senderPublicKey
717718 case _ =>
718719 throw("Match error")
719720 }
720721 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
721722 }
722723

github/deemru/w8io/873ac7e 
164.78 ms