tx · 6m19aRey3fg8rVt9hMRt3f6xpDAKPVbDdrqcDPDeJDtM

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02000000 Waves

2023.07.21 12:32 [2675441] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "6m19aRey3fg8rVt9hMRt3f6xpDAKPVbDdrqcDPDeJDtM", "fee": 2000000, "feeAssetId": null, "timestamp": 1689932001186, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "54QwUgw7mnzNznRVDZKrrLnuGpvGqbHiDT2xBhxGbhGgTGxnSNjziaaNKPrb9XNTPMNpADFjY9CQXbzYbjHkUFow" ], "script": "base64:BgL5HAgCEgYKBAEYEQESBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgQKAhgREgASAwoBCCIDU0VQIgVTQ0FMRSIFTVVMVDgiCnplcm9CaWdJbnQiFHByb2Nlc3NpbmdTdGFnZVRvdGFsIhVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMiC3dhdmVzU3RyaW5nIg5nZXROdW1iZXJCeUtleSIDa2V5Ig9nZXROdW1iZXJPckZhaWwiDmdldFN0cmluZ0J5S2V5Ig9nZXRTdHJpbmdPckZhaWwiDHBhcnNlQXNzZXRJZCIFaW5wdXQiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiA2FicyIDdmFsIglhYnNCaWdJbnQiC2tleU1heERlcHRoIg9tYXhEZXB0aERlZmF1bHQiCG1heERlcHRoIhFrZXlGYWN0b3J5QWRkcmVzcyIRZmFjdG9yeUFkZHJlc3NTdHIiD2ZhY3RvcnlDb250cmFjdCISa2V5RW1pc3Npb25BZGRyZXNzIhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IhNrZXlOdW1Ub1VzZXJNYXBwaW5nIgNudW0iFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUiGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0IhNyZWZlcnJhbFByb2dyYW1OYW1lIhdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudCIbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0IhRyZWZlcnJhbE1pbkdXeEFtb3VudCIZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZSIdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQiFnJlZmVycmVyUmV3YXJkUGVybWlsbGUiGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUiHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlIgtrZXlSZWZlcnJlciIPcmVmZXJyYWxBZGRyZXNzIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILcHJvZ3JhbU5hbWUiDmNsYWltZXJBZGRyZXNzIhJlbWlzc2lvbkFkZHJlc3NTdHIiEGVtaXNzaW9uQ29udHJhY3QiDUlkeENmZ0Fzc2V0SWQiFklkeENmZ1BhY2VtYWtlckFkZHJlc3MiFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QiDklkeENmZ01heERlcHRoIglrZXlDb25maWciEmdldEVtaXNzaW9uQWRkcmVzcyIPZW1pc3Npb25BZGRyZXNzIgx3eEFzc2V0SWRTdHIiCXd4QXNzZXRJZCIVcmVhZENvbmZpZ0FycmF5T3JGYWlsIgxmb3JtYXRDb25maWciGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyIhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0ciIWYm9vc3RpbmdDb250cmFjdE9yRmFpbCIIY2ZnQXJyYXkiH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQiDWtleVVzZXJzQ291bnQiFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQiGmtleUd3eEhvbGRlcnNSZXdhcmRDdXJyZW50IhdrZXlHd3hIb2xkZXJzUmV3YXJkTmV4dCIUa2V5UG9vbFdlaWdodFZpcnR1YWwiFGtleU5leHRQcm9jZXNzZWRVc2VyIg9rZXlMYXRlc3RQZXJpb2QiDWtleU5leHRQZXJpb2QiEmtleVByb2Nlc3NpbmdTdGFnZSIWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZCIQa2V5VXNlclVuY2xhaW1lZCIJdXNlckluZGV4IhtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIiHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIiEmtleUhlaWdodEZvclBlcmlvZCIGcGVyaW9kIh1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZCIXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QiEWtleUxhc3RQYXlvdXRJbmZvIhBQZXJpb2RQYXlvdXRJbmZvIg1tYXRjaGVyUmV3YXJkIg5lbWlzc2lvblJld2FyZCIUa2V5UGF5b3V0SGlzdG9yeUluZm8iF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kIhZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kIhtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MiHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbCIXa2V5VHJhZGluZ1Jld2FyZEhpc3RvcnkiBHVzZXIiAWkiEGtleVRyYWRpbmdSZXdhcmQiC3VzZXJBZGRyZXNzIhBrZXlNYXhSZWNpcGllbnRzIgxIaXN0b3J5RW50cnkiBHR5cGUiBmFtb3VudCIKaGlzdG9yeUtFWSILaGlzdG9yeURBVEEiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMiByRtYXRjaDAiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiE21hbmFnZXJWYXVsdEFkZHJlc3MiC211c3RNYW5hZ2VyIgJwZCICcGsiDmNhbGNVc2VyV2VpZ2h0Ihdib29zdGluZ0NvbnRyYWN0QWRkcmVzcyIPaGVpZ2h0Rm9yUGVyaW9kIgVrTGFzdCIEa0tleSIEa1JhdyILa1VzZXJXZWlnaHQiAWsiAWIiAXciAXAiAnB2IhZjYWxjVXNlcldlaWdodEZvckNsYWltIhB1c2VyV2VpZ2h0T3JVbml0IhVnZXRVc2VySW5kZXhCeUFkZHJlc3MiCm5leHRQZXJpb2QiEWNvbW1vbkNsYWltUmV3YXJkIgd1c2VySWR4IhN1c2VyVW5jbGFpbWVkT3B0aW9uIgF1IhBnZXRUcmFkaW5nUmV3YXJkIhVwYXltZW50QW1vdW50TGVmdE92ZXIiDXVzZXJBZGRyZXNzZXMiB3Jld2FyZHMiC2N1cnJlbnRJdGVyIgZjaGVja3MiE3RyYWRlUmV3YXJkSW50ZXJuYWwiF3RyYWRpbmdSZXdhcmRIaXN0b3J5S2V5Ig5nV3hBbW91bnRTdGFydCIIcmVmZXJyZXIiEWFjdGl2ZVJlZmVycmFsSW52Ig9wcm9jZXNzaW5nU3RhZ2UiDWN1cnJlbnRQZXJpb2QiC2N1cnJlbnRVc2VyIgxsYXRlc3RQZXJpb2QiCnVzZXJzQ291bnQiDnRvdGFsV2VpZ2h0S2V5Igt0b3RhbFdlaWdodCINJHQwMTQ1MTAxNDYyNiIKdXNlcldlaWdodCILdXNlckFjdGlvbnMiDnRvdGFsV2VpZ2h0TmV3IhFwcm9jZXNzaW5nQWN0aW9ucyIadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QiG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZCIPdXNlclRvdGFsQW1vdW50IgtyZWZlcnJhbEludiIOcmVmZXJyZXJSZXdhcmQiDnJlZmVycmFsUmV3YXJkIhB1bmNsYWltZWRBY3Rpb25zIgdjb3VudGVyIgZyZXN1bHQiAUAiC2NoZWNrQ2FsbGVyIgZkZWx0YUgiDGVtaXNzaW9uUmF0ZSIXZ3d4SG9sZGVyc1Jld2FyZEN1cnJlbnQiCWF1eEFtb3VudCICZW0iC21hdGNoZXJQYXJ0IgpwYXlvdXRJbmZvIhdnd3hIb2xkZXJzUmV3YXJkVXBkYXRlZCILdG90YWxSZXdhcmQiB2FjdGlvbnMiB2FkZHJlc3MiDSR0MDE5ODE1MTk4NjUiC2NoZWNrQW1vdW50IhJhbW91bnRGcm9tRW1pc3Npb24iD2NsYWltZWRSZWZlcnJhbCILdG90YWxBbW91bnQiDSR0MDIwNDM4MjA0ODgiEXJlZmVycmFsVW5jbGFpbWVkIg5nd3hBbW91bnRTdGFydCIPbG9ja1N0YXJ0SGVpZ2h0IhJsb2NrRHVyYXRpb25CbG9ja3MiDWxvY2tFbmRIZWlnaHQiDHNjYWxlOFBhcmFtSyIMc2NhbGU4UGFyYW1CIgx3eExvY2tBbW91bnQiDGxvY2tEdXJhdGlvbiIPbWF4TG9ja0R1cmF0aW9uIgdjb2VmZlg4Igt4MUJpZ0ludFN0ciILeDJCaWdJbnRTdHIiDGFtcEJpZ0ludFN0ciITYVByZWNpc2lvbkJpZ0ludFN0ciIYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyIgZuQ29pbnMiCmFQcmVjaXNpb24iD3RhcmdldFByZWNpc2lvbiICeDEiAngyIgNhbXAiA2FubiIDYXJyIgRjYWxjIgNhY2MiA2N1ciINJHQwMjMxMjEyMzE0OCIBZCIFZFByZXYiBWZvdW5kIgJkcCIFZE5leHQiBWREaWZmIg0kdDAyMzc0NjIzODA5IgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIOYXJnc0NvbXBhcmlzb24iDW1heFJlY2lwaWVudHMiB3BheW1lbnQiDnBheW1lbnRBc3NldElkIg1wYXltZW50QW1vdW50IgZyZXdhcmQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleV8AAWECAl9fAAFiAOgHAAFjAIDC1y8AAWQJALYCAQAAAAFlAAAAAWYAAQABZwIFV0FWRVMBAWgBAWkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBaQAAAQFqAQFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBaQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBaQIPIGlzIG5vdCBkZWZpbmVkAQFrAQFpCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWkCAAEBbAEBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAWkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAWkCDyBpcyBub3QgZGVmaW5lZAEBbQEBbgMJAAACBQFuBQFnBQR1bml0CQDZBAEFAW4BAW8BAXAJALkJAgkAzAgCAhBnd3hfcmV3YXJkLnJpZGU6CQDMCAIFAXAFA25pbAIBIAEBcQEBcAkAAgEJAQFvAQUBcAEBcgEBcwMJAGYCAAAFAXMJAQEtAQUBcwUBcwEBdAEBcwMJAL8CAgUBZAUBcwkAvgIBBQFzBQFzAAF1Agwlc19fbWF4RGVwdGgAAXYAHgABdwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQF1BQF2AQF4AAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwABeQkBAWwBCQEBeAAAAXoJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXkBAUEAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwEBQgAJALkJAgkAzAgCAgIlcwkAzAgCAhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWEAAUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAXoJAQFCAAEBRAEBRQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCG51bTJ1c2VyCQDMCAIJAKQDAQUBRQUDbmlsBQFhAAFGCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQFhAAFHAgZ3eGxvY2sAAUgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBRgUBRwABSQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIMbWluR1d4QW1vdW50BQNuaWwFAWEAAUoJAGgCAPQDBQFjAAFLCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAUkFAUoAAUwJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmVyUmV3YXJkUGVybWlsbGUFA25pbAUBYQABTQAyAAFOCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAUwFAU0AAU8JALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUBYQABUAAyAAFRCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAU8FAVABAVIBAVMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcmVmZXJyZXIJAMwIAgUBSAkAzAgCBQFTBQNuaWwFAWEBAVQCAVUBVgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQFVCQDMCAIFAVYFA25pbAUBYQABVwkBAWwBCQEBQQAAAVgJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAVcAAVkAAQABWgACAAJhYQADAAJhYgAEAQJhYwACCiVzX19jb25maWcBAmFkAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQFBAAkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgkBAUEAAg8gaXMgbm90IGRlZmluZWQAAmFlCQECYWQAAAJhZgkAkQMCCQC1CQIJAQV2YWx1ZQEJAJ0IAgUCYWUJAQJhYwAFAWEAAQACYWcJANkEAQUCYWYBAmFoAAkAtQkCCQEBbAEJAQJhYwAFAWEBAmFpBAJhZgJhagJhawF3CQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgUCYWYJAMwIAgUCYWoJAMwIAgUCYWsJAMwIAgkApAMBBQF3BQNuaWwFAWEBAmFsAAQCYW0JAQJhaAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFtBQJhYQIoYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBub3QgZGVmaW5lZAECYW4AAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQJhbwACDyVzX19uZXh0VXNlck51bQECYXAAAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAmFxAAIfJXMlc19fZ3d4SG9sZGVyc1Jld2FyZF9fY3VycmVudAECYXIAAhwlcyVzX19nd3hIb2xkZXJzUmV3YXJkX19uZXh0AQJhcwACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MAQJhdAACFSVzX19uZXh0UHJvY2Vzc2VkVXNlcgECYXUAAhAlc19fbGF0ZXN0UGVyaW9kAQJhdgACDiVzX19uZXh0UGVyaW9kAQJhdwACEyVzX19wcm9jZXNzaW5nU3RhZ2UBAmF4AAIXJXNfX25leHRQcm9jZXNzZWRQZXJpb2QBAmF5AQJhegkAuQkCCQDMCAICBCVzJWQJAMwIAgINdXNlclVuY2xhaW1lZAkAzAgCCQCkAwEFAmF6BQNuaWwFAWEBAmFBAQJhegkAuQkCCQDMCAICFyVzJWRfX25leHRDbGFpbWVkUGVyaW9kCQDMCAIJAKQDAQUCYXoFA25pbAUBYQECYUIBAmF6CQC5CQIJAMwIAgIZJXMlZF9fbGFzdFByb2Nlc3NlZFBlcmlvZAkAzAgCCQCkAwEFAmF6BQNuaWwFAWEBAmFDAQJhRAkAuQkCCQDMCAICGiVzJWRfX3N0YXJ0SGVpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYUUBAmFECQC5CQIJAMwIAgIXJXMlZF9fYXV4RW1pc3Npb25SZXdhcmQJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhRgECYUQJALkJAgkAzAgCAholcyVkX190b3RhbEFtb3VudEZvclBlcmlvZAkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFHAAISJXNfX2xhc3RQYXlvdXRJbmZvAQJhSAMCYUQCYUkCYUoJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBBQJhRAkAzAgCCQCkAwEFAmFJCQDMCAIJAKQDAQUCYUoFA25pbAUBYQECYUsBAmFECQC5CQIJAMwIAgIYJXMlcyVkX19wYXlvdXRzX19oaXN0b3J5CQDMCAIJAKQDAQUCYUQFA25pbAUBYQECYUwBAmFECQC5CQIJAMwIAgIaJXMlZF9fdG90YWxXZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhTQICYUQCYXoJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFAmF6CQDMCAICAWsJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhTgICYUQCYXoJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFAmF6CQDMCAICAWIJAMwIAgkApAMBBQJhRAUDbmlsBQFhAQJhTwICYUQCYXoJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFAmF6CQDMCAICBndlaWdodAkAzAgCCQCkAwEFAmFEBQNuaWwFAWEBAmFQAAkAuQkCCQDMCAICBCVzJXMJAMwIAgIGY29uZmlnCQDMCAICGHJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwUDbmlsBQFhAAJhUQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAWwBCQECYVAAAQJhUgICYVMCYVQJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAg10cmFkaW5nUmV3YXJkCQDMCAICB2hpc3RvcnkJAMwIAgUCYVMJAMwIAgkA2AQBCAUCYVQNdHJhbnNhY3Rpb25JZAUDbmlsBQFhAQJhVQECYVYJALkJAgkAzAgCAgQlcyVzCQDMCAICDXRyYWRpbmdSZXdhcmQJAMwIAgUCYVYFA25pbAUBYQECYVcACQC5CQIJAMwIAgICJXMJAMwIAgINbWF4UmVjaXBpZW50cwUDbmlsBQFhAQJhWAQCYVkCYVMCYVoCYVQEAmJhCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2hpc3RvcnkJAMwIAgUCYVkJAMwIAgUCYVMJAMwIAgkA2AQBCAUCYVQNdHJhbnNhY3Rpb25JZAUDbmlsBQFhBAJiYgkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQJhWgUDbmlsBQFhCQELU3RyaW5nRW50cnkCBQJiYQUCYmIBAmJjAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAmJkAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBAmJlAAQCYmYJAKIIAQkBAmJkAAMJAAECBQJiZgIGU3RyaW5nBAJiZwUCYmYJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmJnBQR0aGlzAQJiaAAEAmJpCQECYmUABAJiZgkAnQgCBQJiaQkBAmJjAAMJAAECBQJiZgIGU3RyaW5nBAJiZwUCYmYJANkEAQUCYmcDCQABAgUCYmYCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYmoBAmFUBAJiawkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAJiZgkBAmJoAAMJAAECBQJiZgIKQnl0ZVZlY3RvcgQCYmwFAmJmAwkAAAIIBQJhVA9jYWxsZXJQdWJsaWNLZXkFAmJsBgUCYmsDCQABAgUCYmYCBFVuaXQDCQAAAggFAmFUBmNhbGxlcgUEdGhpcwYFAmJrCQACAQILTWF0Y2ggZXJyb3IBAmJtBAJibgJibwJhRAJhegQCYnAJAQJhQgEFAmF6BAJicQkBAmFNAgUCYUQFAmF6BAJicgkAmggCBQJibgUCYnEEAmJzCQECYU8CBQJhRAUCYXoDCQEJaXNEZWZpbmVkAQUCYnIEAmJ0CQEFdmFsdWUBBQJicgQCYnUJAQV2YWx1ZQEJAJoIAgUCYm4JAQJhTgIFAmFEBQJhegQCYnYJAGQCCQBoAgUCYnQFAmJvBQJidQMJAGYCBQJidgAACQCUCgIJAGkCBQJidgUBYgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYnAFAmFECQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJicwUCYnYFA25pbAkAlAoCAAAFA25pbAQCYncJAJoIAgUEdGhpcwUCYnADAwkBCWlzRGVmaW5lZAEFAmJ3CQBnAgUCYUQJAQV2YWx1ZQEFAmJ3BwQCYngJAQV2YWx1ZQEFAmJ3BAJidAkBBXZhbHVlAQkAmggCBQJibgkBAmFNAgUCYngFAmF6BAJidQkBBXZhbHVlAQkAmggCBQJibgkBAmFOAgUCYngFAmF6BAJidgkAZAIJAGgCBQJidAUCYm8FAmJ1AwkAZgIFAmJ2AAAJAJQKAgkAaQIFAmJ2BQFiCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJicwUCYnYFA25pbAkAlAoCAAAFA25pbAkAlAoCAAAFA25pbAECYnkEAmJuAmJvAmFEAmF6BAJicwkBAmFPAgUCYUQFAmF6BAJiegkAnwgBBQJicwQCYmYFAmJ6AwkAAQIFAmJmAgRVbml0AAADCQABAgUCYmYCA0ludAQCYnYFAmJmCQBpAgUCYnYFAWIJAAIBAgtNYXRjaCBlcnJvcgECYkECAmFrAmFWBAFpCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIdXNlcjJudW0JAMwIAgUCYVYFA25pbAUBYQkBDXBhcnNlSW50VmFsdWUBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFAmFrBQFpCQCsAgIJAKwCAgkArAICAg1Vc2VyIGFkZHJlc3MgBQJhVgItIGlzIG5vdCBmb3VuZCBpbiBib29zdGluZyBjb250cmFjdCBkYXRhLCBrZXk9BQFpAQJiQgAJAQFoAQkBAmF2AAECYkMBAmFWBAJhbQkBAmFoAAQCYkQJAQJiQQIJAJEDAgUCYW0FAmFhBQJhVgQCYkUJAJ8IAQkBAmF5AQUCYkQEAmJmBQJiRQMJAAECBQJiZgIEVW5pdAkAlAoCAAAFA25pbAMJAAECBQJiZgIDSW50BAJiRgUCYmYJAJQKAgUCYkYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJheQEFAmJEAAAFA25pbAkAAgECC01hdGNoIGVycm9yAQJiRwECYVYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFVAQUCYVYAABICYVQBE3RyYWRlUmV3YXJkSW50ZXJuYWwEAmJIAmJJAmJKAmJLAwkAAAIFAmJLCQCQAwEFAmJJBQNuaWwEAmJMCQDMCAIDCQAAAggFAmFUBmNhbGxlcgUEdGhpcwYJAQFxAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgMJAGcCBQJiSAkAkQMCBQJiSgUCYksGCQEBcQECHGluc3VmZmljaWVudCBwYXltZW50IGFzc2V0SWQFA25pbAMJAAACBQJiTAUCYkwEAmJNCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgkAZQIFAmJICQCRAwIFAmJKBQJiSwkAzAgCBQJiSQkAzAgCBQJiSgkAzAgCCQBkAgUCYksAAQUDbmlsBQNuaWwDCQAAAgUCYk0FAmJNBAJiTgkBAmFSAgkAkQMCBQJiSQUCYksFAmFUBAJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJiSQUCYksJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYk4JAJEDAgUCYkoFAmJLCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYVUBCQCRAwIFAmJJBQJiSwkAkQMCBQJiSgUCYksFA25pbAUCYk0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVQBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkCAmFWAmJPBAJiUAkAnQgCBQJhUQkBAVIBBQJhVgQCYlEDCQAAAgUCYlAFBHVuaXQFBHVuaXQJAPwHBAUCYVECFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUBSAkAzAgCBQJhVgkAzAgCCQBnAgUCYk8FAUsFA25pbAUDbmlsAwkAAAIFAmJRBQJiUQkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVQBDmZpbmFsaXplSGVscGVyAAQCYlIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmF3AAUBZQQCYlMJAQFoAQkBAmF4AAQCYlQJAQFoAQkBAmF0AAQCYlUJAQFoAQkBAmF1AAQCYlYJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBAmFsAAkBAmFvAAAABAJiVwkBAmFMAQUCYlMEAmJYCQEBaAEJAQJhTAEFAmJTBAJibwkBAWgBCQECYUMBBQJiUwMJAGYCBQJiUwUCYlUJAJQKAgUDbmlsBwMJAAACBQJiUgUBZQQCYlkJAQJibQQJAQJhbAAFAmJvBQJiUwUCYlQEAmJaCAUCYlkCXzEEAmNhCAUCYlkCXzIEAmNiCQBkAgUCYlgFAmJaBAJjYwMJAGYCCQBlAgUCYlYAAQUCYlQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAAJAGQCBQJiVAABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdwAFAWYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAAAAAUDbmlsCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiVwUCY2IFA25pbAUCY2MFAmNhBgMJAAACBQJiUgUBZgQCYloJAQJieQQJAQJhbAAFAmJvBQJiUwUCYlQEAmNkCQBrAwkBAWgBCQECYUYBBQJiUwUCYloFAmJYBAJjZQkAawMJAQFoAQkBAmFFAQUCYlMFAmJaBQJiWAQCY2YJAGQCBQJjZQUCY2QEAmJFCQCfCAEJAQJheQEFAmJUBAJhVgkBEUBleHRyTmF0aXZlKDEwNTMpAgkBAmFsAAkBAUQBBQJiVAQCYlAJAJ0IAgUCYVEJAQFSAQUCYVYEAmJRAwkAAAIFAmJQBQR1bml0BQR1bml0CQD8BwQFAmFRAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFAUgJAMwIAgUCYVYJAMwIAgkAZwIFAmJaBQFLBQNuaWwFA25pbAMJAAACBQJiUQUCYlEEAmNnAwMJAAACBQJiUAUEdW5pdAYJAGYCBQFLBQJiWgUEdW5pdAQCY2gJAGsDBQJjZgUBTgUBYgQCY2kJAGsDBQJjZgUBUQUBYgkA/AcEBQJhUQIMaW5jVW5jbGFpbWVkCQDMCAIFAUgJAMwIAgUCYVYJAMwIAgUCY2gJAMwIAgUCY2kFA25pbAUDbmlsAwkAAAIFAmNnBQJjZwQCY2oJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJheQEFAmJUCQBkAgkBC3ZhbHVlT3JFbHNlAgUCYkUAAAUCY2YFA25pbAQCY2MDCQBmAgkAZQIFAmJWAAEFAmJUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQACQBkAgUCYlQAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXgACQBkAgUCYlMAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF0AAAACQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdwAFA25pbAkAlAoCCQDOCAIFAmNqBQJjYwYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhhpbnZhbGlkIHByb2Nlc3Npbmcgc3RhZ2UCYVQBD2ZpbmFsaXplV3JhcHBlcgECY2sEAmNsCgACY20JAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAmNtAgdCb29sZWFuBQJjbQkAAgEJAKwCAgkAAwEFAmNtAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFAmNsBQJjbAMJAQEhAQUCY2wDCQAAAgUCY2sFAXcJAAIBAhJOb3RoaW5nIHRvIHByb2Nlc3MJAJQKAgUDbmlsBQR1bml0AwkAZgIFAmNrAAAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBlAgUCY2sAAQUDbmlsBQNuaWwJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQF3BQNuaWwFA25pbAJhVAEHZGVwb3NpdAAEAmNuAwkAAAIIBQJhVAZjYWxsZXIFAUMGCQECYmoBBQJhVAMJAAACBQJjbgUCY24EAmFECQECYkIABAJjbwkAZQIFBmhlaWdodAkBAWoBCQECYW4ABAJjcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAVgJAQJhcAAJAKwCAgkArAICAhxtYW5kYXRvcnkgZW1pc3Npb25fY29udHJhY3QuCQECYXAAAg8gaXMgbm90IGRlZmluZWQEAmNxCQELdmFsdWVPckVsc2UCCQCaCAIFAVgJAQJhcQAAAAMJAAACBQJjcQUCY3EEAmNyCQBrAwkAaAIFAmNvBQJjcQUCY3AFAWMEAmNzAwkAZgIFAmNyAAAJAPwHBAUBWAIEZW1pdAkAzAgCBQJjcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY3MFAmNzBAJjdAAABAJjdQkBAmFIAwUCYUQFAmN0BQJjcgQCY3YKAAJjbQkA/AcEBQFYAhZnd3hIb2xkZXJzUmV3YXJkVXBkYXRlBQNuaWwFA25pbAMJAAECBQJjbQIHQm9vbGVhbgUCY20JAAIBCQCsAgIJAAMBBQJjbQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJjdgUCY3YEAmN3CQBkAgUCY3QFAmNyBAJjeAMDCQAAAgUCY3cAAAkBASEBBQJjdgcFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF1AAUCYUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhQwEFAmFEBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhRQEFAmFEBQJjcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFuAAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUYBBQJhRAUCY3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdgAJAGQCBQJhRAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhRwAFAmN1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhSwEFAmFEBQJjdQUDbmlsCQCUCgIFAmN4BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUAQtjbGFpbVJld2FyZAAEAmFtCQECYWgABAJjeQkApQgBCAUCYVQGY2FsbGVyBAJjegkBAmJDAQUCY3kEAmFaCAUCY3oCXzEEAmN4CAUCY3oCXzIEAmNBAwkAZgIFAmFaAAAGCQACAQIQTm90aGluZyB0byBjbGFpbQMJAAACBQJjQQUCY0EEAmNCAAAEAmNDCgACY20JAPwHBAUCYVECBWNsYWltCQDMCAIFAUgFA25pbAUDbmlsAwkAAQIFAmNtAgNJbnQFAmNtCQACAQkArAICCQADAQUCY20CGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCY0QJAGQCBQJhWgUCY0MJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJhVAZjYWxsZXIFAmNECQDZBAEJAJEDAgUCYW0FAVkJAMwIAgkBAmFYBAIFY2xhaW0FAmN5BQJhWgUCYVQFA25pbAUCY3gJAMwIAgUCY0QJAMwIAgUCY0IFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhVAETY2xhaW1SZXdhcmRSRUFET05MWQECY3kEAmNFCQECYkMBBQJjeQQCYVoIBQJjRQJfMQQCY3gIBQJjRQJfMgQCY0YJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYVEJAQFUAgUBSAUCY3kAAAQCY0QJAGQCBQJhWgUCY0YJAJQKAgUDbmlsBQJjRAJhVAEdbGF0ZXN0RmluYWxpemVkUGVyaW9kUkVBRE9OTFkBAmN5CQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYXUAAP///////////wECYVQBIWxhdGVzdEZpbmFsaXplZFBlcmlvZEluZm9SRUFET05MWQECY3kJAJQKAgUDbmlsCQEBawEJAQJhRwACYVQBFWNhbGNHd3hQYXJhbXNSRUFET05MWQMCY0cCY0gCY0kEAmNKCQBkAgUCY0gFAmNJBAJjSwkBAS0BCQBrAwUCY0cFAWIFAmNJBAJjTAkAaAIJAGsDBQJjRwUBYgUCY0kFAmNKCQCUCgIFA25pbAkAzAgCBQJjSwkAzAgCBQJjTAkAzAgCCQECYkIABQNuaWwCYVQBGmNhbGNHd3hBbW91bnRTdGFydFJFQURPTkxZAwJjTQJjTgJjTwQCY1AJAGsDBQJjTgUBYwUCY08EAmJPCQBrAwUCY00FAmNQBQFjCQCUCgIFA25pbAkAzAgCBQJiTwUDbmlsAmFUARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAmFUBmNhbGxlcgUBegkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFuAAUGaGVpZ2h0BQNuaWwCYVQBI2xhdGVzdFBlcmlvZEVtaXNzaW9uUmV3YXJkc1JFQURPTkxZAQJjeQQCYUQJAQJiQgAJAJQKAgUDbmlsCQDMCAIJAQFoAQkBAmFFAQUCYUQFA25pbAJhVAEFY2FsY0QFAmNRAmNSAmNTAmNUAmNVBAJjVgkAtgIBAAIEAmNXCQCnAwEFAmNUBAJjWAkApwMBBQJjVQQCY1kJAKcDAQUCY1EEAmNaCQCnAwEFAmNSBAJkYQkAuQICCQCnAwEFAmNTBQJjVwQCYmcJALcCAgUCY1kFAmNaAwkAAAIFAmJnBQFkCQCUCgIFA25pbAkApgMBBQFkBAJkYgkAuQICBQJkYQUCY1YEAmRjCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgUDbmlsCgECZGQCAmRlAmRmBAJkZwUCZGUEAmRoCAUCZGcCXzEEAmRpCAUCZGcCXzIEAmRqCAUCZGcCXzMDCQECIT0CBQJkagUEdW5pdAUCZGUEAmRrCQC6AgIJALkCAgkAuQICBQJkaAUCZGgFAmRoCQC5AgIJALkCAgkAuQICBQJjWQUCY1oFAmNWBQJjVgQCZGwJALoCAgkAuQICCQC3AgIJALoCAgkAuQICBQJkYgUCYmcFAmNXCQC5AgIFAmRrBQJjVgUCZGgJALcCAgkAugICCQC5AgIJALgCAgUCZGIFAmNXBQJkaAUCY1cJALkCAgkAtwICBQJjVgkAtgIBAAEFAmRrBAJkbQkBAXQBCQC4AgIFAmRsCQEFdmFsdWUBBQJkaAMJAMACAgUCY1gFAmRtCQCVCgMFAmRsBQJkaAUCZGYJAJUKAwUCZGwFAmRoBQR1bml0BAJkbgoAAmRvBQJkYwoAAmRwCQCQAwEFAmRvCgACZHEJAJUKAwUCYmcFBHVuaXQFBHVuaXQKAQJkcgICZHMCZHQDCQBnAgUCZHQFAmRwBQJkcwkBAmRkAgUCZHMJAJEDAgUCZG8FAmR0CgECZHUCAmRzAmR0AwkAZwIFAmR0BQJkcAUCZHMJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA3CQECZHUCCQECZHICCQECZHICCQECZHICCQECZHICCQECZHICCQECZHICCQECZHICBQJkcQAAAAEAAgADAAQABQAGAAcEAmRsCAUCZG4CXzEEAmRpCAUCZG4CXzIEAmRqCAUCZG4CXzMDCQECIT0CBQJkagUEdW5pdAkAlAoCBQNuaWwJAKYDAQUCZGwEAmRtCQEBdAEJALgCAgUCZGwJAQV2YWx1ZQEFAmRpCQACAQkArAICAh1EIGNhbGN1bGF0aW9uIGVycm9yLCBkRGlmZiA9IAkApgMBBQJkbQJhVAELdHJhZGVSZXdhcmQCAmJJAmJKBAJkdgkAAAIJAJADAQUCYkkJAJADAQUCYkoEAmR3CQELdmFsdWVPckVsc2UCCQCfCAEJAQJhVwAAAAQCZHgJAJEDAggFAmFUCHBheW1lbnRzAAAEAmR5CAUCZHgHYXNzZXRJZAQCZHoIBQJkeAZhbW91bnQEAmJMCQDMCAIDCQBnAgUCZHcJAJADAQUCYkkGCQEBcQECE1RvbyBtYW55IHJlY2lwaWVudHMJAMwIAgMFAmR2BgkBAXEBAhdBcmd1bWVudHMgc2l6ZSBtaXNtYXRjaAkAzAgCAwkAAAIFAmR5BQJhZwYJAQFxAQITV3JvbmcgYXNzZXQgcGF5bWVudAUDbmlsAwkAAAIFAmJMBQJiTAQCYk0JAPwHBAUEdGhpcwITdHJhZGVSZXdhcmRJbnRlcm5hbAkAzAgCBQJkegkAzAgCBQJiSQkAzAgCBQJiSgkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAmJNBQJiTQkAlAoCBQNuaWwFAmJNCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFUARJjbGFpbVRyYWRpbmdSZXdhcmQABAJhVggFAmFUBmNhbGxlcgQCZEEJAQJiRwEJAKUIAQUCYVYDCQBmAgUCZEEAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFWBQJkQQUCYWcFA25pbAUCZEEJAQFxAQIQbm90aGluZyB0byBjbGFpbQJhVAEaY2xhaW1UcmFkaW5nUmV3YXJkUkVBRE9OTFkBAmFWCQCUCgIFA25pbAkBAmJHAQUCYVYBAmRCAQJkQwAEAmREBAJiZgkBAmJoAAMJAAECBQJiZgIKQnl0ZVZlY3RvcgQCYmwFAmJmBQJibAMJAAECBQJiZgIEVW5pdAgFAmRCD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJkQglib2R5Qnl0ZXMJAJEDAggFAmRCBnByb29mcwAABQJkRI32qhc=", "height": 2675441, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Few37TreB2HyVBET45Hp7BTmMxqLqED95tjENNNzjmnf Next: 7RHViMziaZz32mSVDWqEhu9Rrq2NGb1ccG3BmG6B8Bbh Diff:
OldNewDifferences
695695 @Callable(i)
696696 func claimTradingReward () = {
697697 let userAddress = i.caller
698- let userAddressString = toString(userAddress)
699- let reward = getTradingReward(userAddressString)
698+ let reward = getTradingReward(toString(userAddress))
700699 if ((reward > 0))
701- then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
700+ then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId)], reward)
702701 else throwErr("nothing to claim")
703702 }
704703
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 userAddressString = toString(userAddress)
699- let reward = getTradingReward(userAddressString)
698+ let reward = getTradingReward(toString(userAddress))
700699 if ((reward > 0))
701- then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
700+ then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId)], reward)
702701 else throwErr("nothing to claim")
703702 }
704703
705704
706705
707706 @Callable(i)
708707 func claimTradingRewardREADONLY (userAddress) = $Tuple2(nil, getTradingReward(userAddress))
709708
710709
711710 @Verifier(tx)
712711 func verify () = {
713712 let targetPublicKey = match managerPublicKeyOrUnit() {
714713 case pk: ByteVector =>
715714 pk
716715 case _: Unit =>
717716 tx.senderPublicKey
718717 case _ =>
719718 throw("Match error")
720719 }
721720 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
722721 }
723722

github/deemru/w8io/169f3d6 
82.13 ms