tx · APBEZEcYLZdwadZipwgJVCVNUhpr4gd6YV5ezYcrQqYK

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.01500000 Waves

2023.08.09 14:32 [2703006] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "APBEZEcYLZdwadZipwgJVCVNUhpr4gd6YV5ezYcrQqYK", "fee": 1500000, "feeAssetId": null, "timestamp": 1691580741152, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "2zQFNXfSQ2vvkWGKg8dnrhtAZDq7y4KuHDuALwcaJbC2583SZnksDd4JVYXgbjcGT6f8xGYZw7GyBqriHGwZp6RL" ], "script": "base64:BgKBFQgCEgMKAQISBgoEARgRARIECgIIARIAEgASAwoBCBIAEgQKAhgREgASAwoBCCIDU0VQIgVTQ0FMRSIFTVVMVDgiB01VTFQ4QkkiCnplcm9CaWdJbnQiFHByb2Nlc3NpbmdTdGFnZVRvdGFsIhVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMiBk1VTFQxOCIITVVMVDE4QkkiC3dhdmVzU3RyaW5nIg5nZXROdW1iZXJCeUtleSIDa2V5Ig9nZXROdW1iZXJPckZhaWwiDmdldFN0cmluZ0J5S2V5Ig9nZXRTdHJpbmdPckZhaWwiDHBhcnNlQXNzZXRJZCIFaW5wdXQiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiA2FicyIDdmFsIglhYnNCaWdJbnQiC2tleU1heERlcHRoIg9tYXhEZXB0aERlZmF1bHQiCG1heERlcHRoIhFrZXlGYWN0b3J5QWRkcmVzcyIRZmFjdG9yeUFkZHJlc3NTdHIiD2ZhY3RvcnlDb250cmFjdCISa2V5RW1pc3Npb25BZGRyZXNzIhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IhNrZXlOdW1Ub1VzZXJNYXBwaW5nIgNudW0iFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUiGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0IhNyZWZlcnJhbFByb2dyYW1OYW1lIhdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudCIbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0IhRyZWZlcnJhbE1pbkdXeEFtb3VudCIZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZSIdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQiFnJlZmVycmVyUmV3YXJkUGVybWlsbGUiGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUiHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlIgtrZXlSZWZlcnJlciIPcmVmZXJyYWxBZGRyZXNzIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILcHJvZ3JhbU5hbWUiDmNsYWltZXJBZGRyZXNzIhJlbWlzc2lvbkFkZHJlc3NTdHIiEGVtaXNzaW9uQ29udHJhY3QiDUlkeENmZ0Fzc2V0SWQiFklkeENmZ1BhY2VtYWtlckFkZHJlc3MiFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QiDklkeENmZ01heERlcHRoIglrZXlDb25maWciEmdldEVtaXNzaW9uQWRkcmVzcyIPZW1pc3Npb25BZGRyZXNzIgx3eEFzc2V0SWRTdHIiCXd4QXNzZXRJZCIVcmVhZENvbmZpZ0FycmF5T3JGYWlsIgxmb3JtYXRDb25maWciGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyIhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0ciIWYm9vc3RpbmdDb250cmFjdE9yRmFpbCIIY2ZnQXJyYXkiH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQiDWtleVVzZXJzQ291bnQiFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQiGmtleUd3eEhvbGRlcnNSZXdhcmRDdXJyZW50IhdrZXlHd3hIb2xkZXJzUmV3YXJkTmV4dCIUa2V5UG9vbFdlaWdodFZpcnR1YWwiEGtleVVzZXJVbmNsYWltZWQiCXVzZXJJbmRleCIba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzIh5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwiF2tleVRyYWRpbmdSZXdhcmRIaXN0b3J5IgR1c2VyIgFpIhBrZXlUcmFkaW5nUmV3YXJkIgt1c2VyQWRkcmVzcyIQa2V5TWF4UmVjaXBpZW50cyIMSGlzdG9yeUVudHJ5IgR0eXBlIgZhbW91bnQiCmhpc3RvcnlLRVkiC2hpc3RvcnlEQVRBIhNrZXlNYW5hZ2VyUHVibGljS2V5IhZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIgttdXN0TWFuYWdlciICcGQiAnBrIhVnZXRVc2VySW5kZXhCeUFkZHJlc3MiEGdldFRyYWRpbmdSZXdhcmQiF2tleVJld2FyZFBlckd3eEludGVncmFsIhxfcmVmcmVzaFJld2FyZFBlckd3eEludGVncmFsIhxyZXdhcmRQZXJHd3hJbnRlZ3JhbFByZXZpb3VzIh5yZXdhcmRQZXJHd3hJbnRlZ3JhbExhc3RIZWlnaHQiDGVtaXNzaW9uUmF0ZSIXZ3d4SG9sZGVyc1Jld2FyZEN1cnJlbnQiDmd3eEFtb3VudFRvdGFsIgFAIgJkaCIUcmV3YXJkUGVyR3d4SW50ZWdyYWwiH2tleVJld2FyZFBlckd3eEludGVncmFsVXNlckxhc3QiEl9yZWZyZXNoVXNlclJld2FyZCIccmV3YXJkUGVyR3d4SW50ZWdyYWxVc2VyTGFzdCINdXNlcklkeE9yRmFpbCINdXNlclVuY2xhaW1lZCIMJHQwOTkyNzEwMTQ0IhtyZXdhcmRQZXJHd3hJbnRlZ3JhbEFjdGlvbnMiDXVzZXJHd3hBbW91bnQiCnVzZXJSZXdhcmQiEWNvbW1vbkNsYWltUmV3YXJkIg51c2VyQWRkcmVzc1N0ciIHdXNlcklkeCITdXNlclVuY2xhaW1lZE9wdGlvbiIGcmV3YXJkIhB1c2VyQWRkcmVzc0J5dGVzIgtjaGVja0NhbGxlciIVcGF5bWVudEFtb3VudExlZnRPdmVyIg11c2VyQWRkcmVzc2VzIgdyZXdhcmRzIgtjdXJyZW50SXRlciIGY2hlY2tzIhN0cmFkZVJld2FyZEludGVybmFsIhd0cmFkaW5nUmV3YXJkSGlzdG9yeUtleSIOZ1d4QW1vdW50U3RhcnQiCHJlZmVycmVyIhFhY3RpdmVSZWZlcnJhbEludiINJHQwMTI5NzcxMzAzNCIHYWN0aW9ucyILY2hlY2tBbW91bnQiC3JlZmVycmFsSW52Ig5yZWZlcnJlclJld2FyZCIOcmVmZXJyYWxSZXdhcmQiD2NsYWltZWRSZWZlcnJhbCILdG90YWxBbW91bnQiB2FkZHJlc3MiDSR0MDE0MzYxMTQ0MTEiEXJlZmVycmFsVW5jbGFpbWVkIg5hcmdzQ29tcGFyaXNvbiINbWF4UmVjaXBpZW50cyIHcGF5bWVudCIOcGF5bWVudEFzc2V0SWQiDXBheW1lbnRBbW91bnQiEXVzZXJBZGRyZXNzU3RyaW5nIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXlSAAFhAgJfXwABYgDoBwABYwCAwtcvAAFkCQC2AgEFAWMAAWUJALYCAQAAAAFmAAAAAWcAAQABaACAgJC7utat8A0AAWkJALYCAQUBaAABagIFV0FWRVMBAWsBAWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBbAAAAQFtAQFsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBbAkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBbAIPIGlzIG5vdCBkZWZpbmVkAQFuAQFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWwCAAEBbwEBbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAWwJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAWwCDyBpcyBub3QgZGVmaW5lZAEBcAEBcQMJAAACBQFxBQFqBQR1bml0CQDZBAEFAXEBAXIBAXMJALkJAgkAzAgCAhBnd3hfcmV3YXJkLnJpZGU6CQDMCAIFAXMFA25pbAIBIAEBdAEBcwkAAgEJAQFyAQUBcwEBdQEBdgMJAGYCAAAFAXYJAQEtAQUBdgUBdgEBdwEBdgMJAL8CAgUBZQUBdgkAvgIBBQF2BQF2AAF4Agwlc19fbWF4RGVwdGgAAXkAHgABegkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQF4BQF5AQFBAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwABQgkBAW8BCQEBQQAAAUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAUIBAUQAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwEBRQAJALkJAgkAzAgCAgIlcwkAzAgCAhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWEAAUYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAUMJAQFFAAEBRwEBSAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCG51bTJ1c2VyCQDMCAIJAKQDAQUBSAUDbmlsBQFhAAFJCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQFhAAFKAgZ3eGxvY2sAAUsJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBSQUBSgABTAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIMbWluR1d4QW1vdW50BQNuaWwFAWEAAU0JAGgCAPQDBQFjAAFOCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAUwFAU0AAU8JALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmVyUmV3YXJkUGVybWlsbGUFA25pbAUBYQABUAAyAAFRCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAU8FAVAAAVIJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUBYQABUwAyAAFUCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAVIFAVMBAVUBAVYJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcmVmZXJyZXIJAMwIAgUBSwkAzAgCBQFWBQNuaWwFAWEBAVcCAVgBWQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQFYCQDMCAIFAVkFA25pbAUBYQABWgkBAW8BCQEBRAAAAmFhCQERQGV4dHJOYXRpdmUoMTA2MikBBQFaAAJhYgABAAJhYwACAAJhZAADAAJhZQAEAQJhZgACCiVzX19jb25maWcBAmFnAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQFEAAkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgkBAUQAAg8gaXMgbm90IGRlZmluZWQAAmFoCQECYWcAAAJhaQkAkQMCCQC1CQIJAQV2YWx1ZQEJAJ0IAgUCYWgJAQJhZgAFAWEAAQACYWoJANkEAQUCYWkBAmFrAAkAtQkCCQEBbwEJAQJhZgAFAWEBAmFsBAJhaQJhbQJhbgF6CQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgUCYWkJAMwIAgUCYW0JAMwIAgUCYW4JAMwIAgkApAMBBQF6BQNuaWwFAWEBAmFvAAQCYXAJAQJhawAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFwBQJhZAIoYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBub3QgZGVmaW5lZAECYXEAAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQJhcgACDyVzX19uZXh0VXNlck51bQECYXMAAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAmF0AAIfJXMlc19fZ3d4SG9sZGVyc1Jld2FyZF9fY3VycmVudAECYXUAAhwlcyVzX19nd3hIb2xkZXJzUmV3YXJkX19uZXh0AQJhdgACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MAQJhdwECYXgJALkJAgkAzAgCAgQlcyVkCQDMCAICDXVzZXJVbmNsYWltZWQJAMwIAgkApAMBBQJheAUDbmlsBQFhAQJheQAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUBYQACYXoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFvAQkBAmF5AAECYUECAmFCAmFDCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgINdHJhZGluZ1Jld2FyZAkAzAgCAgdoaXN0b3J5CQDMCAIFAmFCCQDMCAIJANgEAQgFAmFDDXRyYW5zYWN0aW9uSWQFA25pbAUBYQECYUQBAmFFCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg10cmFkaW5nUmV3YXJkCQDMCAIFAmFFBQNuaWwFAWEBAmFGAAkAuQkCCQDMCAICAiVzCQDMCAICDW1heFJlY2lwaWVudHMFA25pbAUBYQECYUcEAmFIAmFCAmFJAmFDBAJhSgkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFICQDMCAIFAmFCCQDMCAIJANgEAQgFAmFDDXRyYW5zYWN0aW9uSWQFA25pbAUBYQQCYUsJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYUkFA25pbAUBYQkBC1N0cmluZ0VudHJ5AgUCYUoFAmFLAQJhTAACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJhTQACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJhTgAEAmFPCQCiCAEJAQJhTQADCQABAgUCYU8CBlN0cmluZwQCYVAFAmFPCQERQGV4dHJOYXRpdmUoMTA2MikBBQJhUAUEdGhpcwECYVEABAJhUgkBAmFOAAQCYU8JAJ0IAgUCYVIJAQJhTAADCQABAgUCYU8CBlN0cmluZwQCYVAFAmFPCQDZBAEFAmFQAwkAAQIFAmFPAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFTAQJhQwQCYVQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQCYU8JAQJhUQADCQABAgUCYU8CCkJ5dGVWZWN0b3IEAmFVBQJhTwMJAAACCAUCYUMPY2FsbGVyUHVibGljS2V5BQJhVQYFAmFUAwkAAQIFAmFPAgRVbml0AwkAAAIIBQJhQwZjYWxsZXIFBHRoaXMGBQJhVAkAAgECC01hdGNoIGVycm9yAQJhVgICYW4CYUUEAWwJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAgh1c2VyMm51bQkAzAgCBQJhRQUDbmlsBQFhCQENcGFyc2VJbnRWYWx1ZQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUCYW4FAWwJAKwCAgkArAICCQCsAgICDVVzZXIgYWRkcmVzcyAFAmFFAi0gaXMgbm90IGZvdW5kIGluIGJvb3N0aW5nIGNvbnRyYWN0IGRhdGEsIGtleT0FAWwBAmFXAQJhRQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYUQBBQJhRQAAAQJhWAAJALkJAgkAzAgCAgIlcwkAzAgCAhRyZXdhcmRQZXJHd3hJbnRlZ3JhbAUDbmlsBQFhAQJhWQAEAmFaCQELdmFsdWVPckVsc2UCBAJhTwkAnQgCBQR0aGlzCQECYVgAAwkAAQIFAmFPAgZTdHJpbmcEAmFQBQJhTwkAqAMBBQJhUAMJAAECBQJhTwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yBQFlBAJiYQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAQJhcQAJAQFyAQkArAICAghpbnZhbGlkIAkBAmFxAAQCYmIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQJhYQkBAmFzAAkBAXIBCQCsAgICCGludmFsaWQgCQECYXMABAJiYwkBC3ZhbHVlT3JFbHNlAgkAmggCBQJhYQkBAmF0AAAABAJiZAoAAmJlCQD8BwQJAQJhbwACE2dldEd3eFRvdGFsUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmJlAgNJbnQFAmJlCQACAQkArAICCQADAQUCYmUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYmYJALYCAQkAZQIFBmhlaWdodAUCYmEEAmJnCQC3AgIFAmFaCQC8AgMFAmJmCQC5AgIJALkCAgkAtgIBBQJiYgkAtgIBBQJiYwUBaQkAuQICCQC2AgEFAmJkBQFkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcQAFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQECYVgACQCmAwEFAmJnBQNuaWwFAmJnAQJiaAECYUUJALkJAgkAzAgCAgQlcyVzCQDMCAICHHJld2FyZFBlckd3eEludGVncmFsVXNlckxhc3QJAMwIAgkApQgBBQJhRQUDbmlsBQFhAQJiaQECYUUEAmJqCQELdmFsdWVPckVsc2UCBAJhTwkAnQgCBQR0aGlzCQECYmgBBQJhRQMJAAECBQJhTwIGU3RyaW5nBAJhUAUCYU8JAKgDAQUCYVADCQABAgUCYU8CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgUBZQQCYmsJAQJhVgIJAKUIAQkBAmFvAAkApQgBBQJhRQQCYmwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmF3AQUCYmsAAAQCYm0JAQJhWQAEAmJuCAUCYm0CXzEEAmJnCAUCYm0CXzIEAmJvCgACYmUJAPwHBAkBAmFvAAIQZ2V0VXNlckd3eEFtb3VudAkAzAgCCQClCAEFAmFFBQNuaWwFA25pbAMJAAECBQJiZQIDSW50BQJiZQkAAgEJAKwCAgkAAwEFAmJlAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJwCQBkAgkAoAMBCQC8AgMJALYCAQUCYm8JALgCAgUCYmcFAmJqBQFpBQJibAkAlAoCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJoAQUCYUUJAKYDAQUCYmcFA25pbAUCYm4FAmJwAQJicQECYnIEAmFFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUCYnIJAQFyAQIUaW52YWxpZCB1c2VyIGFkZHJlc3MEAmFwCQECYWsABAJicwkBAmFWAgkAkQMCBQJhcAUCYWQFAmJyBAJidAkAnwgBCQECYXcBBQJicwQCYnUICQECYmkBBQJhRQJfMgkAlAoCBQJidQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF3AQUCYnMAAAUDbmlsCgJhQwERcmVmcmVzaFVzZXJSZXdhcmQBAmJ2BAJidwMJAAACCAUCYUMGY2FsbGVyCQECYW8ABgkBAXQBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQJidwUCYncJAQJiaQEJAQdBZGRyZXNzAQUCYnYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUMBE3RyYWRlUmV3YXJkSW50ZXJuYWwEAmJ4AmJ5AmJ6AmJBAwkAAAIFAmJBCQCQAwEFAmJ5BQNuaWwEAmJCCQDMCAIDCQAAAggFAmFDBmNhbGxlcgUEdGhpcwYJAQF0AQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgMJAGcCBQJieAkAkQMCBQJiegUCYkEGCQEBdAECHGluc3VmZmljaWVudCBwYXltZW50IGFzc2V0SWQFA25pbAMJAAACBQJiQgUCYkIEAmJDCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgkAZQIFAmJ4CQCRAwIFAmJ6BQJiQQkAzAgCBQJieQkAzAgCBQJiegkAzAgCCQBkAgUCYkEAAQUDbmlsBQNuaWwDCQAAAgUCYkMFAmJDBAJiRAkBAmFBAgkAkQMCBQJieQUCYkEFAmFDBAJhRQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJieQUCYkEJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYkQJAJEDAgUCYnoFAmJBCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUQBCQCRAwIFAmJ5BQJiQQkAkQMCBQJiegUCYkEFA25pbAUCYkMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUMBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkCAmFFAmJFBAJiRgkAnQgCBQJhegkBAVUBBQJhRQQCYkcDCQAAAgUCYkYFBHVuaXQFBHVuaXQJAPwHBAUCYXoCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUBSwkAzAgCBQJhRQkAzAgCCQBnAgUCYkUFAU4FA25pbAUDbmlsAwkAAAIFAmJHBQJiRwkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUMBHXByb2Nlc3NQZW5kaW5nUGVyaW9kc0FuZFVzZXJzAAkAlAoCBQNuaWwJAQF0AQIKZGVwcmVjYXRlZAJhQwELY2xhaW1SZXdhcmQABAJhcAkBAmFrAAQCYUUIBQJhQwZjYWxsZXIEAmJyCQClCAEFAmFFBAJiSAkBAmJxAQUCYnIEAmFJCAUCYkgCXzEEAmJJCAUCYkgCXzIEAmJKAwkAZgIFAmFJAAAGCQACAQIQbm90aGluZyB0byBjbGFpbQMJAAACBQJiSgUCYkoEAmJvCgACYmUJAPwHBAkBAmFvAAIQZ2V0VXNlckd3eEFtb3VudAkAzAgCBQJicgUDbmlsBQNuaWwDCQABAgUCYmUCA0ludAUCYmUJAAIBCQCsAgIJAAMBBQJiZQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJiRgkAnQgCBQJhegkBAVUBBQJicgQCYkcDCQAAAgUCYkYFBHVuaXQFBHVuaXQJAPwHBAUCYXoCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUBSwkAzAgCBQJhRQkAzAgCCQBnAgUCYm8FAU4FA25pbAUDbmlsAwkAAAIFAmJHBQJiRwQCYksDAwkAAAIFAmJGBQR1bml0BgkAZgIFAU4FAmJvBQR1bml0BAJiTAkAawMFAmFJBQFRBQFiBAJiTQkAawMFAmFJBQFUBQFiCQD8BwQFAmF6AgxpbmNVbmNsYWltZWQJAMwIAgUBSwkAzAgCBQJhRQkAzAgCBQJiTAkAzAgCBQJiTQUDbmlsBQNuaWwDCQAAAgUCYksFAmJLBAJiTgoAAmJlCQD8BwQFAmF6AgVjbGFpbQkAzAgCBQFLBQNuaWwFA25pbAMJAAECBQJiZQIDSW50BQJiZQkAAgEJAKwCAgkAAwEFAmJlAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUCYk4FAmJOBAJiTwkAZAIFAmFJBQJiTgkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmFDBmNhbGxlcgUCYUkJANkEAQkAkQMCBQJhcAUCYWIJAMwIAgkBAmFHBAIFY2xhaW0FAmJyBQJiTwUCYUMFA25pbAUCYkkFAmJPCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFDARNjbGFpbVJld2FyZFJFQURPTkxZAQJiUAQCYlEJAQJicQEFAmJQBAJhSQgFAmJRAl8xBAJiSQgFAmJRAl8yBAJiUgkBC3ZhbHVlT3JFbHNlAgkAmggCBQJhegkBAVcCBQFLBQJiUAAABAJiTwkAZAIFAmFJBQJiUgkAlAoCBQNuaWwFAmJPAmFDARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAmFDBmNhbGxlcgUBQwkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFxAAUGaGVpZ2h0BQNuaWwCYUMBC3RyYWRlUmV3YXJkAgJieQJiegQCYlMJAAACCQCQAwEFAmJ5CQCQAwEFAmJ6BAJiVAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYUYAAAAEAmJVCQCRAwIIBQJhQwhwYXltZW50cwAABAJiVggFAmJVB2Fzc2V0SWQEAmJXCAUCYlUGYW1vdW50BAJiQgkAzAgCAwkAZwIFAmJUCQCQAwEFAmJ5BgkBAXQBAhNUb28gbWFueSByZWNpcGllbnRzCQDMCAIDBQJiUwYJAQF0AQIXQXJndW1lbnRzIHNpemUgbWlzbWF0Y2gJAMwIAgMJAAACBQJiVgUCYWoGCQEBdAECE1dyb25nIGFzc2V0IHBheW1lbnQFA25pbAMJAAACBQJiQgUCYkIEAmJDCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgUCYlcJAMwIAgUCYnkJAMwIAgUCYnoJAMwIAgAABQNuaWwFA25pbAMJAAACBQJiQwUCYkMJAJQKAgUDbmlsBQJiQwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhQwESY2xhaW1UcmFkaW5nUmV3YXJkAAQCYUUIBQJhQwZjYWxsZXIEAmJYCQClCAEFAmFFBAJidQkBAmFXAQUCYlgDCQBmAgUCYnUAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFFBQJidQUCYWoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhRAEFAmJYAAAFA25pbAUCYnUJAQF0AQIQbm90aGluZyB0byBjbGFpbQJhQwEaY2xhaW1UcmFkaW5nUmV3YXJkUkVBRE9OTFkBAmFFCQCUCgIFA25pbAkBAmFXAQUCYUUBAmJZAQJiWgAEAmNhBAJhTwkBAmFRAAMJAAECBQJhTwIKQnl0ZVZlY3RvcgQCYVUFAmFPBQJhVQMJAAECBQJhTwIEVW5pdAgFAmJZD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJiWQlib2R5Qnl0ZXMJAJEDAggFAmJZBnByb29mcwAABQJjYTbcEwE=", "height": 2703006, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AM4CJw4MDMfKEh2A6QJx5BF8PwCGTvh2KuWNsEpvw2Zc Next: 85d7pw2xtRmy3syv4UdMdrDwAAQ3PKRgFdVQoAgNTxDr Diff:
OldNewDifferences
236236 }
237237
238238
239-func commonClaimReward (userAddress) = {
240- let cfgArray = readConfigArrayOrFail()
241- let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
242- let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
243- match userUnclaimedOption {
244- case _: Unit =>
245- $Tuple2(0, nil)
246- case u: Int =>
247- $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
248- case _ =>
249- throw("Match error")
250- }
251- }
252-
253-
254239 func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
255240
256241
295280 }, zeroBigInt)
296281 let userIdxOrFail = getUserIndexByAddress(toString(boostingContractOrFail()), toString(userAddress))
297282 let userUnclaimed = valueOrElse(getInteger(keyUserUnclaimed(userIdxOrFail)), 0)
298- let $t01034510562 = _refreshRewardPerGwxIntegral()
299- let rewardPerGwxIntegralActions = $t01034510562._1
300- let rewardPerGwxIntegral = $t01034510562._2
283+ let $t0992710144 = _refreshRewardPerGwxIntegral()
284+ let rewardPerGwxIntegralActions = $t0992710144._1
285+ let rewardPerGwxIntegral = $t0992710144._2
301286 let userGwxAmount = {
302287 let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [toString(userAddress)], nil)
303288 if ($isInstanceOf(@, "Int"))
306291 }
307292 let userReward = (toInt(fraction(toBigInt(userGwxAmount), (rewardPerGwxIntegral - rewardPerGwxIntegralUserLast), MULT18BI)) + userUnclaimed)
308293 $Tuple2(([StringEntry(keyRewardPerGwxIntegralUserLast(userAddress), toString(rewardPerGwxIntegral))] ++ rewardPerGwxIntegralActions), userReward)
294+ }
295+
296+
297+func commonClaimReward (userAddressStr) = {
298+ let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
299+ let cfgArray = readConfigArrayOrFail()
300+ let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddressStr)
301+ let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
302+ let reward = _refreshUserReward(userAddress)._2
303+ $Tuple2(reward, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
309304 }
310305
311306
369364 let cfgArray = readConfigArrayOrFail()
370365 let userAddress = i.caller
371366 let userAddressStr = toString(userAddress)
372- let $t01287312930 = commonClaimReward(userAddressStr)
373- let amount = $t01287312930._1
374- let actions = $t01287312930._2
367+ let $t01297713034 = commonClaimReward(userAddressStr)
368+ let amount = $t01297713034._1
369+ let actions = $t01297713034._2
375370 let checkAmount = if ((amount > 0))
376371 then true
377372 else throw("nothing to claim")
424419
425420 @Callable(i)
426421 func claimRewardREADONLY (address) = {
427- let $t01425714307 = commonClaimReward(address)
428- let amount = $t01425714307._1
429- let actions = $t01425714307._2
422+ let $t01436114411 = commonClaimReward(address)
423+ let amount = $t01436114411._1
424+ let actions = $t01436114411._2
430425 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
431426 let totalAmount = (amount + referralUnclaimed)
432427 $Tuple2(nil, totalAmount)
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 MULT8BI = toBigInt(MULT8)
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let processingStageTotal = 0
1515
1616 let processingStageShares = 1
1717
1818 let MULT18 = 1000000000000000000
1919
2020 let MULT18BI = toBigInt(MULT18)
2121
2222 let wavesString = "WAVES"
2323
2424 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
2525
2626
2727 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2828
2929
3030 func getStringByKey (key) = valueOrElse(getString(this, key), "")
3131
3232
3333 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
3434
3535
3636 func parseAssetId (input) = if ((input == wavesString))
3737 then unit
3838 else fromBase58String(input)
3939
4040
4141 func wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
4242
4343
4444 func throwErr (msg) = throw(wrapErr(msg))
4545
4646
4747 func abs (val) = if ((0 > val))
4848 then -(val)
4949 else val
5050
5151
5252 func absBigInt (val) = if ((zeroBigInt > val))
5353 then -(val)
5454 else val
5555
5656
5757 let keyMaxDepth = "%s__maxDepth"
5858
5959 let maxDepthDefault = 30
6060
6161 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
6262
6363 func keyFactoryAddress () = "%s%s__config__factoryAddress"
6464
6565
6666 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
6767
6868 let factoryContract = addressFromStringValue(factoryAddressStr)
6969
7070 func keyEmissionAddress () = "%s%s__config__emissionAddress"
7171
7272
7373 func keyVotingEmissionContract () = makeString(["%s", "votingEmissionContract"], SEP)
7474
7575
7676 let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract()))
7777
7878 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
7979
8080
8181 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
8282
8383 let referralProgramNameDefault = "wxlock"
8484
8585 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
8686
8787 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
8888
8989 let referralMinGWxAmountDefault = (500 * MULT8)
9090
9191 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
9292
9393 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
9494
9595 let referrerRewardPermilleDefault = 50
9696
9797 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
9898
9999 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
100100
101101 let referralRewardPermilleDefault = 50
102102
103103 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
104104
105105 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
106106
107107
108108 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
109109
110110
111111 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
112112
113113 let emissionContract = addressFromStringValue(emissionAddressStr)
114114
115115 let IdxCfgAssetId = 1
116116
117117 let IdxCfgPacemakerAddress = 2
118118
119119 let IdxCfgBoostingContract = 3
120120
121121 let IdxCfgMaxDepth = 4
122122
123123 func keyConfig () = "%s__config"
124124
125125
126126 func getEmissionAddress () = addressFromStringValue(valueOrErrorMessage(getString(this, keyEmissionAddress()), (("mandatory this." + keyEmissionAddress()) + " is not defined")))
127127
128128
129129 let emissionAddress = getEmissionAddress()
130130
131131 let wxAssetIdStr = split(value(getString(emissionAddress, keyConfig())), SEP)[1]
132132
133133 let wxAssetId = fromBase58String(wxAssetIdStr)
134134
135135 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
136136
137137
138138 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
139139
140140
141141 func boostingContractOrFail () = {
142142 let cfgArray = readConfigArrayOrFail()
143143 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
144144 }
145145
146146
147147 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
148148
149149
150150 func keyUsersCount () = "%s__nextUserNum"
151151
152152
153153 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
154154
155155
156156 func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
157157
158158
159159 func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
160160
161161
162162 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
163163
164164
165165 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
166166
167167
168168 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
169169
170170
171171 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
172172
173173 func keyTradingRewardHistory (user,i) = makeString(["%s%s%s%s", "tradingReward", "history", user, toBase58String(i.transactionId)], SEP)
174174
175175
176176 func keyTradingReward (userAddress) = makeString(["%s%s", "tradingReward", userAddress], SEP)
177177
178178
179179 func keyMaxRecipients () = makeString(["%s", "maxRecipients"], SEP)
180180
181181
182182 func HistoryEntry (type,user,amount,i) = {
183183 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
184184 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
185185 StringEntry(historyKEY, historyDATA)
186186 }
187187
188188
189189 func keyManagerPublicKey () = "%s__managerPublicKey"
190190
191191
192192 func keyManagerVaultAddress () = "%s__managerVaultAddress"
193193
194194
195195 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
196196 case s: String =>
197197 addressFromStringValue(s)
198198 case _ =>
199199 this
200200 }
201201
202202
203203 func managerPublicKeyOrUnit () = {
204204 let managerVaultAddress = getManagerVaultAddressOrThis()
205205 match getString(managerVaultAddress, keyManagerPublicKey()) {
206206 case s: String =>
207207 fromBase58String(s)
208208 case _: Unit =>
209209 unit
210210 case _ =>
211211 throw("Match error")
212212 }
213213 }
214214
215215
216216 func mustManager (i) = {
217217 let pd = throw("Permission denied")
218218 match managerPublicKeyOrUnit() {
219219 case pk: ByteVector =>
220220 if ((i.callerPublicKey == pk))
221221 then true
222222 else pd
223223 case _: Unit =>
224224 if ((i.caller == this))
225225 then true
226226 else pd
227227 case _ =>
228228 throw("Match error")
229229 }
230230 }
231231
232232
233233 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
234234 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
235235 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
236236 }
237237
238238
239-func commonClaimReward (userAddress) = {
240- let cfgArray = readConfigArrayOrFail()
241- let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
242- let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
243- match userUnclaimedOption {
244- case _: Unit =>
245- $Tuple2(0, nil)
246- case u: Int =>
247- $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
248- case _ =>
249- throw("Match error")
250- }
251- }
252-
253-
254239 func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
255240
256241
257242 func keyRewardPerGwxIntegral () = makeString(["%s", "rewardPerGwxIntegral"], SEP)
258243
259244
260245 func _refreshRewardPerGwxIntegral () = {
261246 let rewardPerGwxIntegralPrevious = valueOrElse( match getString(this, keyRewardPerGwxIntegral()) {
262247 case s: String =>
263248 parseBigInt(s)
264249 case _: Unit =>
265250 unit
266251 case _ =>
267252 throw("Match error")
268253 }, zeroBigInt)
269254 let rewardPerGwxIntegralLastHeight = valueOrErrorMessage(getInteger(this, keyGwxRewardEmissionStartHeight()), wrapErr(("invalid " + keyGwxRewardEmissionStartHeight())))
270255 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), wrapErr(("invalid " + keyRatePerBlockCurrent())))
271256 let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
272257 let gwxAmountTotal = {
273258 let @ = invoke(boostingContractOrFail(), "getGwxTotalREADONLY", nil, nil)
274259 if ($isInstanceOf(@, "Int"))
275260 then @
276261 else throw(($getType(@) + " couldn't be cast to Int"))
277262 }
278263 let dh = toBigInt((height - rewardPerGwxIntegralLastHeight))
279264 let rewardPerGwxIntegral = (rewardPerGwxIntegralPrevious + fraction(dh, ((toBigInt(emissionRate) * toBigInt(gwxHoldersRewardCurrent)) * MULT18BI), (toBigInt(gwxAmountTotal) * MULT8BI)))
280265 $Tuple2([IntegerEntry(keyGwxRewardEmissionStartHeight(), height), StringEntry(keyRewardPerGwxIntegral(), toString(rewardPerGwxIntegral))], rewardPerGwxIntegral)
281266 }
282267
283268
284269 func keyRewardPerGwxIntegralUserLast (userAddress) = makeString(["%s%s", "rewardPerGwxIntegralUserLast", toString(userAddress)], SEP)
285270
286271
287272 func _refreshUserReward (userAddress) = {
288273 let rewardPerGwxIntegralUserLast = valueOrElse( match getString(this, keyRewardPerGwxIntegralUserLast(userAddress)) {
289274 case s: String =>
290275 parseBigInt(s)
291276 case _: Unit =>
292277 unit
293278 case _ =>
294279 throw("Match error")
295280 }, zeroBigInt)
296281 let userIdxOrFail = getUserIndexByAddress(toString(boostingContractOrFail()), toString(userAddress))
297282 let userUnclaimed = valueOrElse(getInteger(keyUserUnclaimed(userIdxOrFail)), 0)
298- let $t01034510562 = _refreshRewardPerGwxIntegral()
299- let rewardPerGwxIntegralActions = $t01034510562._1
300- let rewardPerGwxIntegral = $t01034510562._2
283+ let $t0992710144 = _refreshRewardPerGwxIntegral()
284+ let rewardPerGwxIntegralActions = $t0992710144._1
285+ let rewardPerGwxIntegral = $t0992710144._2
301286 let userGwxAmount = {
302287 let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [toString(userAddress)], nil)
303288 if ($isInstanceOf(@, "Int"))
304289 then @
305290 else throw(($getType(@) + " couldn't be cast to Int"))
306291 }
307292 let userReward = (toInt(fraction(toBigInt(userGwxAmount), (rewardPerGwxIntegral - rewardPerGwxIntegralUserLast), MULT18BI)) + userUnclaimed)
308293 $Tuple2(([StringEntry(keyRewardPerGwxIntegralUserLast(userAddress), toString(rewardPerGwxIntegral))] ++ rewardPerGwxIntegralActions), userReward)
294+ }
295+
296+
297+func commonClaimReward (userAddressStr) = {
298+ let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
299+ let cfgArray = readConfigArrayOrFail()
300+ let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddressStr)
301+ let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
302+ let reward = _refreshUserReward(userAddress)._2
303+ $Tuple2(reward, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
309304 }
310305
311306
312307 @Callable(i)
313308 func refreshUserReward (userAddressBytes) = {
314309 let checkCaller = if ((i.caller == boostingContractOrFail()))
315310 then true
316311 else throwErr("permission denied")
317312 if ((checkCaller == checkCaller))
318313 then _refreshUserReward(Address(userAddressBytes))
319314 else throw("Strict value is not equal to itself.")
320315 }
321316
322317
323318
324319 @Callable(i)
325320 func tradeRewardInternal (paymentAmountLeftOver,userAddresses,rewards,currentIter) = if ((currentIter == size(userAddresses)))
326321 then nil
327322 else {
328323 let checks = [if ((i.caller == this))
329324 then true
330325 else throwErr("Permission denied"), if ((paymentAmountLeftOver >= rewards[currentIter]))
331326 then true
332327 else throwErr("insufficient payment assetId")]
333328 if ((checks == checks))
334329 then {
335330 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [(paymentAmountLeftOver - rewards[currentIter]), userAddresses, rewards, (currentIter + 1)], nil)
336331 if ((tradeRewardInternal == tradeRewardInternal))
337332 then {
338333 let tradingRewardHistoryKey = keyTradingRewardHistory(userAddresses[currentIter], i)
339334 let userAddress = addressFromStringValue(userAddresses[currentIter])
340335 $Tuple2([IntegerEntry(tradingRewardHistoryKey, rewards[currentIter]), IntegerEntry(keyTradingReward(userAddresses[currentIter]), rewards[currentIter])], tradeRewardInternal)
341336 }
342337 else throw("Strict value is not equal to itself.")
343338 }
344339 else throw("Strict value is not equal to itself.")
345340 }
346341
347342
348343
349344 @Callable(i)
350345 func updateReferralActivity (userAddress,gWxAmountStart) = {
351346 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
352347 let activeReferralInv = if ((referrer == unit))
353348 then unit
354349 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
355350 if ((activeReferralInv == activeReferralInv))
356351 then $Tuple2(nil, unit)
357352 else throw("Strict value is not equal to itself.")
358353 }
359354
360355
361356
362357 @Callable(i)
363358 func processPendingPeriodsAndUsers () = $Tuple2(nil, throwErr("deprecated"))
364359
365360
366361
367362 @Callable(i)
368363 func claimReward () = {
369364 let cfgArray = readConfigArrayOrFail()
370365 let userAddress = i.caller
371366 let userAddressStr = toString(userAddress)
372- let $t01287312930 = commonClaimReward(userAddressStr)
373- let amount = $t01287312930._1
374- let actions = $t01287312930._2
367+ let $t01297713034 = commonClaimReward(userAddressStr)
368+ let amount = $t01297713034._1
369+ let actions = $t01297713034._2
375370 let checkAmount = if ((amount > 0))
376371 then true
377372 else throw("nothing to claim")
378373 if ((checkAmount == checkAmount))
379374 then {
380375 let userGwxAmount = {
381376 let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [userAddressStr], nil)
382377 if ($isInstanceOf(@, "Int"))
383378 then @
384379 else throw(($getType(@) + " couldn't be cast to Int"))
385380 }
386381 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddressStr))
387382 let activeReferralInv = if ((referrer == unit))
388383 then unit
389384 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userGwxAmount >= referralMinGWxAmount)], nil)
390385 if ((activeReferralInv == activeReferralInv))
391386 then {
392387 let referralInv = if (if ((referrer == unit))
393388 then true
394389 else (referralMinGWxAmount > userGwxAmount))
395390 then unit
396391 else {
397392 let referrerReward = fraction(amount, referrerRewardPermille, SCALE)
398393 let referralReward = fraction(amount, referralRewardPermille, SCALE)
399394 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
400395 }
401396 if ((referralInv == referralInv))
402397 then {
403398 let claimedReferral = {
404399 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
405400 if ($isInstanceOf(@, "Int"))
406401 then @
407402 else throw(($getType(@) + " couldn't be cast to Int"))
408403 }
409404 if ((claimedReferral == claimedReferral))
410405 then {
411406 let totalAmount = (amount + claimedReferral)
412407 $Tuple2(([ScriptTransfer(i.caller, amount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", userAddressStr, totalAmount, i)] ++ actions), totalAmount)
413408 }
414409 else throw("Strict value is not equal to itself.")
415410 }
416411 else throw("Strict value is not equal to itself.")
417412 }
418413 else throw("Strict value is not equal to itself.")
419414 }
420415 else throw("Strict value is not equal to itself.")
421416 }
422417
423418
424419
425420 @Callable(i)
426421 func claimRewardREADONLY (address) = {
427- let $t01425714307 = commonClaimReward(address)
428- let amount = $t01425714307._1
429- let actions = $t01425714307._2
422+ let $t01436114411 = commonClaimReward(address)
423+ let amount = $t01436114411._1
424+ let actions = $t01436114411._2
430425 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
431426 let totalAmount = (amount + referralUnclaimed)
432427 $Tuple2(nil, totalAmount)
433428 }
434429
435430
436431
437432 @Callable(i)
438433 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
439434 then throw("permissions denied")
440435 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
441436
442437
443438
444439 @Callable(i)
445440 func tradeReward (userAddresses,rewards) = {
446441 let argsComparison = (size(userAddresses) == size(rewards))
447442 let maxRecipients = valueOrElse(getInteger(keyMaxRecipients()), 0)
448443 let payment = i.payments[0]
449444 let paymentAssetId = payment.assetId
450445 let paymentAmount = payment.amount
451446 let checks = [if ((maxRecipients >= size(userAddresses)))
452447 then true
453448 else throwErr("Too many recipients"), if (argsComparison)
454449 then true
455450 else throwErr("Arguments size mismatch"), if ((paymentAssetId == wxAssetId))
456451 then true
457452 else throwErr("Wrong asset payment")]
458453 if ((checks == checks))
459454 then {
460455 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [paymentAmount, userAddresses, rewards, 0], nil)
461456 if ((tradeRewardInternal == tradeRewardInternal))
462457 then $Tuple2(nil, tradeRewardInternal)
463458 else throw("Strict value is not equal to itself.")
464459 }
465460 else throw("Strict value is not equal to itself.")
466461 }
467462
468463
469464
470465 @Callable(i)
471466 func claimTradingReward () = {
472467 let userAddress = i.caller
473468 let userAddressString = toString(userAddress)
474469 let reward = getTradingReward(userAddressString)
475470 if ((reward > 0))
476471 then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
477472 else throwErr("nothing to claim")
478473 }
479474
480475
481476
482477 @Callable(i)
483478 func claimTradingRewardREADONLY (userAddress) = $Tuple2(nil, getTradingReward(userAddress))
484479
485480
486481 @Verifier(tx)
487482 func verify () = {
488483 let targetPublicKey = match managerPublicKeyOrUnit() {
489484 case pk: ByteVector =>
490485 pk
491486 case _: Unit =>
492487 tx.senderPublicKey
493488 case _ =>
494489 throw("Match error")
495490 }
496491 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
497492 }
498493

github/deemru/w8io/169f3d6 
83.57 ms