tx · CdLiBq2KP3iPWYfY5Wr5y3GnRxBsGXrSHvWE7GX45Jc

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.01500000 Waves

2023.08.17 15:49 [2714613] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "CdLiBq2KP3iPWYfY5Wr5y3GnRxBsGXrSHvWE7GX45Jc", "fee": 1500000, "feeAssetId": null, "timestamp": 1692276619172, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "33K91f9ohiindQBp876W5V2oud3ZT6rioL6vJzj9h1qV9ExhF2X3UmU7zjxroWUxcBaYtgmAtW3KVjg5QQLyPgC5" ], "script": "base64:BgKMFggCEgQKAgIBEgYKBAEYEQESBAoCCAESABIAEgMKAQgSABIECgIYERIAEgMKAQgiA1NFUCIFU0NBTEUiBU1VTFQ4IgdNVUxUOEJJIgp6ZXJvQmlnSW50IhRwcm9jZXNzaW5nU3RhZ2VUb3RhbCIVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzIgZNVUxUMTgiCE1VTFQxOEJJIgt3YXZlc1N0cmluZyIHd3JhcEVyciIDbXNnIgh0aHJvd0VyciIOZ2V0TnVtYmVyQnlLZXkiA2tleSIPZ2V0TnVtYmVyT3JGYWlsIg5nZXRTdHJpbmdCeUtleSIPZ2V0U3RyaW5nT3JGYWlsIgxwYXJzZUFzc2V0SWQiBWlucHV0IgNhYnMiA3ZhbCIJYWJzQmlnSW50IgtrZXlNYXhEZXB0aCIPbWF4RGVwdGhEZWZhdWx0IghtYXhEZXB0aCIRa2V5RmFjdG9yeUFkZHJlc3MiEWZhY3RvcnlBZGRyZXNzU3RyIg9mYWN0b3J5Q29udHJhY3QiEmtleUVtaXNzaW9uQWRkcmVzcyIZa2V5Vm90aW5nRW1pc3Npb25Db250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCITa2V5TnVtVG9Vc2VyTWFwcGluZyIDbnVtIhZrZXlSZWZlcnJhbFByb2dyYW1OYW1lIhpyZWZlcnJhbFByb2dyYW1OYW1lRGVmYXVsdCITcmVmZXJyYWxQcm9ncmFtTmFtZSIXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQiG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdCIUcmVmZXJyYWxNaW5HV3hBbW91bnQiGWtleVJlZmVycmVyUmV3YXJkUGVybWlsbGUiHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJlclJld2FyZFBlcm1pbGxlIhlrZXlSZWZlcnJhbFJld2FyZFBlcm1pbGxlIh1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdCIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZSILa2V5UmVmZXJyZXIiD3JlZmVycmFsQWRkcmVzcyIUa2V5VW5jbGFpbWVkUmVmZXJyYWwiC3Byb2dyYW1OYW1lIg5jbGFpbWVyQWRkcmVzcyISZW1pc3Npb25BZGRyZXNzU3RyIhBlbWlzc2lvbkNvbnRyYWN0Ig1JZHhDZmdBc3NldElkIhZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzIhZJZHhDZmdCb29zdGluZ0NvbnRyYWN0Ig5JZHhDZmdNYXhEZXB0aCIJa2V5Q29uZmlnIhJnZXRFbWlzc2lvbkFkZHJlc3MiD2VtaXNzaW9uQWRkcmVzcyIMd3hBc3NldElkU3RyIgl3eEFzc2V0SWQiFXJlYWRDb25maWdBcnJheU9yRmFpbCIMZm9ybWF0Q29uZmlnIhptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0ciIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIiFmJvb3N0aW5nQ29udHJhY3RPckZhaWwiCGNmZ0FycmF5Ih9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0Ig1rZXlVc2Vyc0NvdW50IhJrZXlVc2VyMk51bU1hcHBpbmciC3VzZXJBZGRyZXNzIhZrZXlSYXRlUGVyQmxvY2tDdXJyZW50IhprZXlHd3hIb2xkZXJzUmV3YXJkQ3VycmVudCIXa2V5R3d4SG9sZGVyc1Jld2FyZE5leHQiFGtleVBvb2xXZWlnaHRWaXJ0dWFsIhBrZXlVc2VyVW5jbGFpbWVkIgl1c2VySW5kZXgiG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcyIecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsIhdrZXlUcmFkaW5nUmV3YXJkSGlzdG9yeSIEdXNlciIBaSIQa2V5VHJhZGluZ1Jld2FyZCIQa2V5TWF4UmVjaXBpZW50cyIMSGlzdG9yeUVudHJ5IgR0eXBlIgZhbW91bnQiCmhpc3RvcnlLRVkiC2hpc3RvcnlEQVRBIhNrZXlNYW5hZ2VyUHVibGljS2V5IhZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIgttdXN0TWFuYWdlciICcGQiAnBrIhVnZXRVc2VySW5kZXhCeUFkZHJlc3MiEGdldFRyYWRpbmdSZXdhcmQiF2tleVJld2FyZFBlckd3eEludGVncmFsIhdnZXRHd3hBbW91bnRUb3RhbE9wdGlvbiILa2V5R3d4VG90YWwiG2dldFVzZXJHd3hBbW91bnRUb3RhbE9wdGlvbiIVa2V5VXNlckd3eEFtb3VudFRvdGFsIhxfcmVmcmVzaFJld2FyZFBlckd3eEludGVncmFsIhxyZXdhcmRQZXJHd3hJbnRlZ3JhbFByZXZpb3VzIh5yZXdhcmRQZXJHd3hJbnRlZ3JhbExhc3RIZWlnaHQiDGVtaXNzaW9uUmF0ZSIXZ3d4SG9sZGVyc1Jld2FyZEN1cnJlbnQiDmd3eEFtb3VudFRvdGFsIgJkaCIQZ3d4QW1vdW50VG90YWxCSSIUcmV3YXJkUGVyR3d4SW50ZWdyYWwiH2tleVJld2FyZFBlckd3eEludGVncmFsVXNlckxhc3QiEl9yZWZyZXNoVXNlclJld2FyZCIHdXNlck51bSINJHQwMTAxMjIxMDIxMCIbcmV3YXJkUGVyR3d4SW50ZWdyYWxBY3Rpb25zIhxyZXdhcmRQZXJHd3hJbnRlZ3JhbFVzZXJMYXN0Ig11c2VySWR4T3B0aW9uIg11c2VyVW5jbGFpbWVkIg11c2VyR3d4QW1vdW50Igp1c2VyUmV3YXJkIhFjb21tb25DbGFpbVJld2FyZCIOdXNlckFkZHJlc3NTdHIiDSR0MDExNTAxMTE1NjUiB2FjdGlvbnMiBnJld2FyZCIQdXNlckFkZHJlc3NCeXRlcyILY2hlY2tDYWxsZXIiDSR0MDExODQ1MTE5MjMiFXBheW1lbnRBbW91bnRMZWZ0T3ZlciINdXNlckFkZHJlc3NlcyIHcmV3YXJkcyILY3VycmVudEl0ZXIiBmNoZWNrcyITdHJhZGVSZXdhcmRJbnRlcm5hbCIXdHJhZGluZ1Jld2FyZEhpc3RvcnlLZXkiDmdXeEFtb3VudFN0YXJ0IghyZWZlcnJlciIRYWN0aXZlUmVmZXJyYWxJbnYiDSR0MDEzNjU1MTM3MTIiC2NoZWNrQW1vdW50IgFAIgtyZWZlcnJhbEludiIOcmVmZXJyZXJSZXdhcmQiDnJlZmVycmFsUmV3YXJkIg9jbGFpbWVkUmVmZXJyYWwiC3RvdGFsQW1vdW50IgdhZGRyZXNzIg0kdDAxNTAzOTE1MDg5IhFyZWZlcnJhbFVuY2xhaW1lZCIOYXJnc0NvbXBhcmlzb24iDW1heFJlY2lwaWVudHMiB3BheW1lbnQiDnBheW1lbnRBc3NldElkIg1wYXltZW50QW1vdW50IhF1c2VyQWRkcmVzc1N0cmluZyICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5VQABYQICX18AAWIA6AcAAWMAgMLXLwABZAkAtgIBBQFjAAFlCQC2AgEAAAABZgAAAAFnAAEAAWgAgICQu7rWrfANAAFpCQC2AgEFAWgAAWoCBVdBVkVTAQFrAQFsCQC5CQIJAMwIAgIQZ3d4X3Jld2FyZC5yaWRlOgkAzAgCBQFsBQNuaWwCASABAW0BAWwJAAIBCQEBawEFAWwBAW4BAW8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBbwAAAQFwAQFvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBbwkBAWsBCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFvAg8gaXMgbm90IGRlZmluZWQBAXEBAW8JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBbwIAAQFyAQFvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUBbwkBAWsBCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFvAg8gaXMgbm90IGRlZmluZWQBAXMBAXQDCQAAAgUBdAUBagUEdW5pdAkA2QQBBQF0AQF1AQF2AwkAZgIAAAUBdgkBAS0BBQF2BQF2AQF3AQF2AwkAvwICBQFlBQF2CQC+AgEFAXYFAXYAAXgCDCVzX19tYXhEZXB0aAABeQAeAAF6CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAXgFAXkBAUEAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAFCCQEBcgEJAQFBAAABQwkBEUBleHRyTmF0aXZlKDEwNjIpAQUBQgEBRAACHSVzJXNfX2NvbmZpZ19fZW1pc3Npb25BZGRyZXNzAQFFAAkAuQkCCQDMCAICAiVzCQDMCAICFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QFA25pbAUBYQABRgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUBQwkBAUUAAQFHAQFICQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQFIBQNuaWwFAWEAAUkJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICC3Byb2dyYW1OYW1lBQNuaWwFAWEAAUoCBnd4bG9jawABSwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQFJBQFKAAFMCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUBYQABTQkAaAIA9AMFAWMAAU4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBTAUBTQABTwkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQFhAAFQADIAAVEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBTwUBUAABUgkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUDbmlsBQFhAAFTADIAAVQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBUgUBUwEBVQEBVgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBQFLCQDMCAIFAVYFA25pbAUBYQEBVwIBWAFZCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFAVgJAMwIAgUBWQUDbmlsBQFhAAFaCQEBcgEJAQFEAAACYWEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAVoAAmFiAAEAAmFjAAIAAmFkAAMAAmFlAAQBAmFmAAIKJXNfX2NvbmZpZwECYWcACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkBAUQACQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuCQEBRAACDyBpcyBub3QgZGVmaW5lZAACYWgJAQJhZwAAAmFpCQCRAwIJALUJAgkBBXZhbHVlAQkAnQgCBQJhaAkBAmFmAAUBYQABAAJhagkA2QQBBQJhaQECYWsACQC1CQIJAQFyAQkBAmFmAAUBYQECYWwEAmFpAmFtAmFuAXoJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCBQJhaQkAzAgCBQJhbQkAzAgCBQJhbgkAzAgCCQCkAwEFAXoFA25pbAUBYQECYW8ABAJhcAkBAmFrAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYXAFAmFkAihib29zdGluZyBjb250cmFjdCBhZGRyZXNzIGlzIG5vdCBkZWZpbmVkAQJhcQACKCVzJXNfX2d3eFJld2FyZEVtaXNzaW9uUGFydF9fc3RhcnRIZWlnaHQBAmFyAAIPJXNfX25leHRVc2VyTnVtAQJhcwECYXQJALkJAgkAzAgCAhklcyVzJXNfX21hcHBpbmdfX3VzZXIybnVtCQDMCAIJAKUIAQUCYXQFA25pbAUBYQECYXUAAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAmF2AAIfJXMlc19fZ3d4SG9sZGVyc1Jld2FyZF9fY3VycmVudAECYXcAAhwlcyVzX19nd3hIb2xkZXJzUmV3YXJkX19uZXh0AQJheAACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MAQJheQECYXoJALkJAgkAzAgCAgQlcyVkCQDMCAICDXVzZXJVbmNsYWltZWQJAMwIAgkApAMBBQJhegUDbmlsBQFhAQJhQQAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUBYQACYUIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFyAQkBAmFBAAECYUMCAmFEAmFFCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgINdHJhZGluZ1Jld2FyZAkAzAgCAgdoaXN0b3J5CQDMCAIFAmFECQDMCAIJANgEAQgFAmFFDXRyYW5zYWN0aW9uSWQFA25pbAUBYQECYUYBAmF0CQC5CQIJAMwIAgIEJXMlcwkAzAgCAg10cmFkaW5nUmV3YXJkCQDMCAIFAmF0BQNuaWwFAWEBAmFHAAkAuQkCCQDMCAICAiVzCQDMCAICDW1heFJlY2lwaWVudHMFA25pbAUBYQECYUgEAmFJAmFEAmFKAmFFBAJhSwkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFJCQDMCAIFAmFECQDMCAIJANgEAQgFAmFFDXRyYW5zYWN0aW9uSWQFA25pbAUBYQQCYUwJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYUoFA25pbAUBYQkBC1N0cmluZ0VudHJ5AgUCYUsFAmFMAQJhTQACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJhTgACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJhTwAEAmFQCQCiCAEJAQJhTgADCQABAgUCYVACBlN0cmluZwQCYVEFAmFQCQERQGV4dHJOYXRpdmUoMTA2MikBBQJhUQUEdGhpcwECYVIABAJhUwkBAmFPAAQCYVAJAJ0IAgUCYVMJAQJhTQADCQABAgUCYVACBlN0cmluZwQCYVEFAmFQCQDZBAEFAmFRAwkAAQIFAmFQAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFUAQJhRQQCYVUJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQCYVAJAQJhUgADCQABAgUCYVACCkJ5dGVWZWN0b3IEAmFWBQJhUAMJAAACCAUCYUUPY2FsbGVyUHVibGljS2V5BQJhVgYFAmFVAwkAAQIFAmFQAgRVbml0AwkAAAIIBQJhRQZjYWxsZXIFBHRoaXMGBQJhVQkAAgECC01hdGNoIGVycm9yAQJhVwICYW4CYXQEAW8JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAgh1c2VyMm51bQkAzAgCBQJhdAUDbmlsBQFhCQENcGFyc2VJbnRWYWx1ZQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUCYW4FAW8JAKwCAgkArAICCQCsAgICDVVzZXIgYWRkcmVzcyAFAmF0Ai0gaXMgbm90IGZvdW5kIGluIGJvb3N0aW5nIGNvbnRyYWN0IGRhdGEsIGtleT0FAW8BAmFYAQJhdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYUYBBQJhdAAAAQJhWQAJALkJAgkAzAgCAgIlcwkAzAgCAhRyZXdhcmRQZXJHd3hJbnRlZ3JhbAUDbmlsBQFhAQJhWgAEAmJhAhAlcyVzX19nd3hfX3RvdGFsCQCaCAIJAQJhbwAFAmJhAQJiYgECYXQKAQJiYwECYXQJALkJAgkAzAgCAhQlcyVzX19nd3hBbW91bnRUb3RhbAkAzAgCCQClCAEFAmF0BQNuaWwFAWEJAJoIAgkBAmFvAAkBAmJjAQUCYXQBAmJkAAQCYmUJAQt2YWx1ZU9yRWxzZQIEAmFQCQCdCAIFBHRoaXMJAQJhWQADCQABAgUCYVACBlN0cmluZwQCYVEFAmFQCQCoAwEFAmFRAwkAAQIFAmFQAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IFAWUEAmJmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkBAmFxAAkBAWsBCQCsAgICCGludmFsaWQgCQECYXEABAJiZwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmFhCQECYXUACQEBawEJAKwCAgIIaW52YWxpZCAJAQJhdQAEAmJoCQELdmFsdWVPckVsc2UCCQCaCAIFAmFhCQECYXYAAAAEAmJpCQELdmFsdWVPckVsc2UCCQECYVoAAAAEAmJqCQC2AgEJAGUCBQZoZWlnaHQFAmJmBAJiawkAtgIBBQJiaQQCYmwJALcCAgUCYmUDCQAAAgUCYmsFAWUFAWUJALwCAwUCYmoJALkCAgkAuQICCQC2AgEFAmJnCQC2AgEFAmJoBQFpCQC5AgIFAmJrBQFkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcQAFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQECYVkACQCmAwEFAmJsBQNuaWwFAmJsAQJibQECYXQJALkJAgkAzAgCAgQlcyVzCQDMCAICHHJld2FyZFBlckd3eEludGVncmFsVXNlckxhc3QJAMwIAgkApQgBBQJhdAUDbmlsBQFhAQJibgICYXQCYm8EAmJwCQECYmQABAJicQgFAmJwAl8xBAJibAgFAmJwAl8yBAJicgQCYVAJAJ0IAgUEdGhpcwkBAmJtAQUCYXQDCQABAgUCYVACBlN0cmluZwQCYVEFAmFQCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQUCYVEJAQFrAQIaaW52YWxpZCB1c2VyIGxhc3QgaW50ZWdyYWwDCQABAgUCYVACBFVuaXQFAmJsCQACAQILTWF0Y2ggZXJyb3IEAmJzCQCdCAIJAQJhbwAJAQJhcwEFAmF0BAJidAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYXkBBQJibwAABAJidQkBC3ZhbHVlT3JFbHNlAgkBAmJiAQUCYXQAAAQCYnYJAGQCCQCgAwEJALwCAwkAtgIBBQJidQkAuAICBQJibAUCYnIFAWkFAmJ0CQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYm0BBQJhdAkApgMBBQJibAUDbmlsBQJicQUCYnYBAmJ3AQJieAQCYXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQJieAkBAWsBAhRpbnZhbGlkIHVzZXIgYWRkcmVzcwQCYXAJAQJhawAEAmJvCQECYVcCCQCRAwIFAmFwBQJhZAUCYngEAmJ5CQECYm4CBQJhdAUCYm8EAmJ6CAUCYnkCXzEEAmJBCAUCYnkCXzIJAJQKAgUCYkEJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmF5AQUCYm8AAAUDbmlsBQJiegoCYUUBEXJlZnJlc2hVc2VyUmV3YXJkAgJiQgJibwQCYkMDCQAAAggFAmFFBmNhbGxlcgkBAmFvAAYJAQFtAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgUCYkMFAmJDBAJiRAkBAmJuAgkBB0FkZHJlc3MBBQJiQgUCYm8EAmJ6CAUCYkQCXzEEAmJBCAUCYkQCXzIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXkBBQJibwUCYkEFA25pbAUCYnoFAmJBCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFFARN0cmFkZVJld2FyZEludGVybmFsBAJiRQJiRgJiRwJiSAMJAAACBQJiSAkAkAMBBQJiRgUDbmlsBAJiSQkAzAgCAwkAAAIIBQJhRQZjYWxsZXIFBHRoaXMGCQEBbQECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIDCQBnAgUCYkUJAJEDAgUCYkcFAmJIBgkBAW0BAhxpbnN1ZmZpY2llbnQgcGF5bWVudCBhc3NldElkBQNuaWwDCQAAAgUCYkkFAmJJBAJiSgkA/AcEBQR0aGlzAhN0cmFkZVJld2FyZEludGVybmFsCQDMCAIJAGUCBQJiRQkAkQMCBQJiRwUCYkgJAMwIAgUCYkYJAMwIAgUCYkcJAMwIAgkAZAIFAmJIAAEFA25pbAUDbmlsAwkAAAIFAmJKBQJiSgQCYksJAQJhQwIJAJEDAgUCYkYFAmJIBQJhRQQCYXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYkYFAmJICQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJLCQCRAwIFAmJHBQJiSAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFGAQkAkQMCBQJiRgUCYkgJAJEDAgUCYkcFAmJIBQNuaWwFAmJKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFFARZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5AgJhdAJiTAQCYk0JAJ0IAgUCYUIJAQFVAQUCYXQEAmJOAwkAAAIFAmJNBQR1bml0BQR1bml0CQD8BwQFAmFCAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFAUsJAMwIAgUCYXQJAMwIAgkAZwIFAmJMBQFOBQNuaWwFA25pbAMJAAACBQJiTgUCYk4JAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFFAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQEBbQECCmRlcHJlY2F0ZWQCYUUBC2NsYWltUmV3YXJkAAQCYXAJAQJhawAEAmF0CAUCYUUGY2FsbGVyBAJieAkApQgBBQJhdAQCYk8JAQJidwEFAmJ4BAJhSggFAmJPAl8xBAJieggFAmJPAl8yBAJiUAMJAGYCBQJhSgAABgkAAgECEG5vdGhpbmcgdG8gY2xhaW0DCQAAAgUCYlAFAmJQBAJidQoAAmJRCQD8BwQJAQJhbwACEGdldFVzZXJHd3hBbW91bnQJAMwIAgUCYngFA25pbAUDbmlsAwkAAQIFAmJRAgNJbnQFAmJRCQACAQkArAICCQADAQUCYlECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYk0JAJ0IAgUCYUIJAQFVAQUCYngEAmJOAwkAAAIFAmJNBQR1bml0BQR1bml0CQD8BwQFAmFCAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFAUsJAMwIAgUCYXQJAMwIAgkAZwIFAmJ1BQFOBQNuaWwFA25pbAMJAAACBQJiTgUCYk4EAmJSAwMJAAACBQJiTQUEdW5pdAYJAGYCBQFOBQJidQUEdW5pdAQCYlMJAGsDBQJhSgUBUQUBYgQCYlQJAGsDBQJhSgUBVAUBYgkA/AcEBQJhQgIMaW5jVW5jbGFpbWVkCQDMCAIFAUsJAMwIAgUCYXQJAMwIAgUCYlMJAMwIAgUCYlQFA25pbAUDbmlsAwkAAAIFAmJSBQJiUgQCYlUKAAJiUQkA/AcEBQJhQgIFY2xhaW0JAMwIAgUBSwUDbmlsBQNuaWwDCQABAgUCYlECA0ludAUCYlEJAAIBCQCsAgIJAAMBBQJiUQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFAmJVBQJiVQQCYlYJAGQCBQJhSgUCYlUJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJhRQZjYWxsZXIFAmFKCQDZBAEJAJEDAgUCYXAFAmFiCQDMCAIJAQJhSAQCBWNsYWltBQJieAUCYlYFAmFFBQNuaWwFAmJ6BQJiVgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhRQETY2xhaW1SZXdhcmRSRUFET05MWQECYlcEAmJYCQECYncBBQJiVwQCYUoIBQJiWAJfMQQCYnoIBQJiWAJfMgQCYlkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYUIJAQFXAgUBSwUCYlcAAAQCYlYJAGQCBQJhSgUCYlkJAJQKAgUDbmlsBQJiVgJhRQEVb25FbWlzc2lvbkZvckd3eFN0YXJ0AAMJAQIhPQIIBQJhRQZjYWxsZXIFAUMJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcQAFBmhlaWdodAUDbmlsAmFFAQt0cmFkZVJld2FyZAICYkYCYkcEAmJaCQAAAgkAkAMBBQJiRgkAkAMBBQJiRwQCY2EJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmFHAAAABAJjYgkAkQMCCAUCYUUIcGF5bWVudHMAAAQCY2MIBQJjYgdhc3NldElkBAJjZAgFAmNiBmFtb3VudAQCYkkJAMwIAgMJAGcCBQJjYQkAkAMBBQJiRgYJAQFtAQITVG9vIG1hbnkgcmVjaXBpZW50cwkAzAgCAwUCYloGCQEBbQECF0FyZ3VtZW50cyBzaXplIG1pc21hdGNoCQDMCAIDCQAAAgUCY2MFAmFqBgkBAW0BAhNXcm9uZyBhc3NldCBwYXltZW50BQNuaWwDCQAAAgUCYkkFAmJJBAJiSgkA/AcEBQR0aGlzAhN0cmFkZVJld2FyZEludGVybmFsCQDMCAIFAmNkCQDMCAIFAmJGCQDMCAIFAmJHCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCYkoFAmJKCQCUCgIFA25pbAUCYkoJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUUBEmNsYWltVHJhZGluZ1Jld2FyZAAEAmF0CAUCYUUGY2FsbGVyBAJjZQkApQgBBQJhdAQCYkEJAQJhWAEFAmNlAwkAZgIFAmJBAAAJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhdAUCYkEFAmFqCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUYBBQJjZQAABQNuaWwFAmJBCQEBbQECEG5vdGhpbmcgdG8gY2xhaW0CYUUBGmNsYWltVHJhZGluZ1Jld2FyZFJFQURPTkxZAQJhdAkAlAoCBQNuaWwJAQJhWAEFAmF0AQJjZgECY2cABAJjaAQCYVAJAQJhUgADCQABAgUCYVACCkJ5dGVWZWN0b3IEAmFWBQJhUAUCYVYDCQABAgUCYVACBFVuaXQIBQJjZg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCY2YJYm9keUJ5dGVzCQCRAwIIBQJjZgZwcm9vZnMAAAUCY2iJw1hP", "height": 2714613, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2aiNXQCFqPkXCuya54TKGupVLi6ygKVcBXHrHZFW1asM Next: F1jk2vaguPNe2csU8QgwMub7ZcvwW6GhDN8ZRT4PLLgA Diff:
OldNewDifferences
245245 func keyRewardPerGwxIntegral () = makeString(["%s", "rewardPerGwxIntegral"], SEP)
246246
247247
248+func getGwxAmountTotalOption () = {
249+ let keyGwxTotal = "%s%s__gwx__total"
250+ getInteger(boostingContractOrFail(), keyGwxTotal)
251+ }
252+
253+
254+func getUserGwxAmountTotalOption (userAddress) = {
255+ func keyUserGwxAmountTotal (userAddress) = makeString(["%s%s__gwxAmountTotal", toString(userAddress)], SEP)
256+
257+ getInteger(boostingContractOrFail(), keyUserGwxAmountTotal(userAddress))
258+ }
259+
260+
248261 func _refreshRewardPerGwxIntegral () = {
249262 let rewardPerGwxIntegralPrevious = valueOrElse( match getString(this, keyRewardPerGwxIntegral()) {
250263 case s: String =>
257270 let rewardPerGwxIntegralLastHeight = valueOrErrorMessage(getInteger(this, keyGwxRewardEmissionStartHeight()), wrapErr(("invalid " + keyGwxRewardEmissionStartHeight())))
258271 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), wrapErr(("invalid " + keyRatePerBlockCurrent())))
259272 let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
260- let gwxAmountTotal = {
261- let @ = invoke(boostingContractOrFail(), "getGwxTotalREADONLY", nil, nil)
262- if ($isInstanceOf(@, "Int"))
263- then @
264- else throw(($getType(@) + " couldn't be cast to Int"))
265- }
273+ let gwxAmountTotal = valueOrElse(getGwxAmountTotalOption(), 0)
266274 let dh = toBigInt((height - rewardPerGwxIntegralLastHeight))
267275 let gwxAmountTotalBI = toBigInt(gwxAmountTotal)
268276 let rewardPerGwxIntegral = (rewardPerGwxIntegralPrevious + (if ((gwxAmountTotalBI == zeroBigInt))
276284
277285
278286 func _refreshUserReward (userAddress,userNum) = {
279- let $t097629850 = _refreshRewardPerGwxIntegral()
280- let rewardPerGwxIntegralActions = $t097629850._1
281- let rewardPerGwxIntegral = $t097629850._2
287+ let $t01012210210 = _refreshRewardPerGwxIntegral()
288+ let rewardPerGwxIntegralActions = $t01012210210._1
289+ let rewardPerGwxIntegral = $t01012210210._2
282290 let rewardPerGwxIntegralUserLast = match getString(this, keyRewardPerGwxIntegralUserLast(userAddress)) {
283291 case s: String =>
284292 valueOrErrorMessage(parseBigInt(s), wrapErr("invalid user last integral"))
289297 }
290298 let userIdxOption = getString(boostingContractOrFail(), keyUser2NumMapping(userAddress))
291299 let userUnclaimed = valueOrElse(getInteger(keyUserUnclaimed(userNum)), 0)
292- let userGwxAmount = {
293- let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [toString(userAddress)], nil)
294- if ($isInstanceOf(@, "Int"))
295- then @
296- else throw(($getType(@) + " couldn't be cast to Int"))
297- }
300+ let userGwxAmount = valueOrElse(getUserGwxAmountTotalOption(userAddress), 0)
298301 let userReward = (toInt(fraction(toBigInt(userGwxAmount), (rewardPerGwxIntegral - rewardPerGwxIntegralUserLast), MULT18BI)) + userUnclaimed)
299302 $Tuple2(([StringEntry(keyRewardPerGwxIntegralUserLast(userAddress), toString(rewardPerGwxIntegral))] ++ rewardPerGwxIntegralActions), userReward)
300303 }
304307 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
305308 let cfgArray = readConfigArrayOrFail()
306309 let userNum = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddressStr)
307- let $t01118011244 = _refreshUserReward(userAddress, userNum)
308- let actions = $t01118011244._1
309- let reward = $t01118011244._2
310+ let $t01150111565 = _refreshUserReward(userAddress, userNum)
311+ let actions = $t01150111565._1
312+ let reward = $t01150111565._2
310313 $Tuple2(reward, ([IntegerEntry(keyUserUnclaimed(userNum), 0)] ++ actions))
311314 }
312315
318321 else throwErr("permission denied")
319322 if ((checkCaller == checkCaller))
320323 then {
321- let $t01152411602 = _refreshUserReward(Address(userAddressBytes), userNum)
322- let actions = $t01152411602._1
323- let reward = $t01152411602._2
324+ let $t01184511923 = _refreshUserReward(Address(userAddressBytes), userNum)
325+ let actions = $t01184511923._1
326+ let reward = $t01184511923._2
324327 $Tuple2(([IntegerEntry(keyUserUnclaimed(userNum), reward)] ++ actions), reward)
325328 }
326329 else throw("Strict value is not equal to itself.")
376379 let cfgArray = readConfigArrayOrFail()
377380 let userAddress = i.caller
378381 let userAddressStr = toString(userAddress)
379- let $t01333413391 = commonClaimReward(userAddressStr)
380- let amount = $t01333413391._1
381- let actions = $t01333413391._2
382+ let $t01365513712 = commonClaimReward(userAddressStr)
383+ let amount = $t01365513712._1
384+ let actions = $t01365513712._2
382385 let checkAmount = if ((amount > 0))
383386 then true
384387 else throw("nothing to claim")
431434
432435 @Callable(i)
433436 func claimRewardREADONLY (address) = {
434- let $t01471814768 = commonClaimReward(address)
435- let amount = $t01471814768._1
436- let actions = $t01471814768._2
437+ let $t01503915089 = commonClaimReward(address)
438+ let amount = $t01503915089._1
439+ let actions = $t01503915089._2
437440 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
438441 let totalAmount = (amount + referralUnclaimed)
439442 $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 wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
2525
2626
2727 func throwErr (msg) = throw(wrapErr(msg))
2828
2929
3030 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
3131
3232
3333 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), wrapErr((("mandatory this." + key) + " is not defined")))
3434
3535
3636 func getStringByKey (key) = valueOrElse(getString(this, key), "")
3737
3838
3939 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), wrapErr((("mandatory this." + key) + " is not defined")))
4040
4141
4242 func parseAssetId (input) = if ((input == wavesString))
4343 then unit
4444 else fromBase58String(input)
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 keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", toString(userAddress)], SEP)
154154
155155
156156 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
157157
158158
159159 func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
160160
161161
162162 func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
163163
164164
165165 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
166166
167167
168168 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
169169
170170
171171 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
172172
173173
174174 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
175175
176176 func keyTradingRewardHistory (user,i) = makeString(["%s%s%s%s", "tradingReward", "history", user, toBase58String(i.transactionId)], SEP)
177177
178178
179179 func keyTradingReward (userAddress) = makeString(["%s%s", "tradingReward", userAddress], SEP)
180180
181181
182182 func keyMaxRecipients () = makeString(["%s", "maxRecipients"], SEP)
183183
184184
185185 func HistoryEntry (type,user,amount,i) = {
186186 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
187187 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
188188 StringEntry(historyKEY, historyDATA)
189189 }
190190
191191
192192 func keyManagerPublicKey () = "%s__managerPublicKey"
193193
194194
195195 func keyManagerVaultAddress () = "%s__managerVaultAddress"
196196
197197
198198 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
199199 case s: String =>
200200 addressFromStringValue(s)
201201 case _ =>
202202 this
203203 }
204204
205205
206206 func managerPublicKeyOrUnit () = {
207207 let managerVaultAddress = getManagerVaultAddressOrThis()
208208 match getString(managerVaultAddress, keyManagerPublicKey()) {
209209 case s: String =>
210210 fromBase58String(s)
211211 case _: Unit =>
212212 unit
213213 case _ =>
214214 throw("Match error")
215215 }
216216 }
217217
218218
219219 func mustManager (i) = {
220220 let pd = throw("Permission denied")
221221 match managerPublicKeyOrUnit() {
222222 case pk: ByteVector =>
223223 if ((i.callerPublicKey == pk))
224224 then true
225225 else pd
226226 case _: Unit =>
227227 if ((i.caller == this))
228228 then true
229229 else pd
230230 case _ =>
231231 throw("Match error")
232232 }
233233 }
234234
235235
236236 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
237237 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
238238 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
239239 }
240240
241241
242242 func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
243243
244244
245245 func keyRewardPerGwxIntegral () = makeString(["%s", "rewardPerGwxIntegral"], SEP)
246246
247247
248+func getGwxAmountTotalOption () = {
249+ let keyGwxTotal = "%s%s__gwx__total"
250+ getInteger(boostingContractOrFail(), keyGwxTotal)
251+ }
252+
253+
254+func getUserGwxAmountTotalOption (userAddress) = {
255+ func keyUserGwxAmountTotal (userAddress) = makeString(["%s%s__gwxAmountTotal", toString(userAddress)], SEP)
256+
257+ getInteger(boostingContractOrFail(), keyUserGwxAmountTotal(userAddress))
258+ }
259+
260+
248261 func _refreshRewardPerGwxIntegral () = {
249262 let rewardPerGwxIntegralPrevious = valueOrElse( match getString(this, keyRewardPerGwxIntegral()) {
250263 case s: String =>
251264 parseBigInt(s)
252265 case _: Unit =>
253266 unit
254267 case _ =>
255268 throw("Match error")
256269 }, zeroBigInt)
257270 let rewardPerGwxIntegralLastHeight = valueOrErrorMessage(getInteger(this, keyGwxRewardEmissionStartHeight()), wrapErr(("invalid " + keyGwxRewardEmissionStartHeight())))
258271 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), wrapErr(("invalid " + keyRatePerBlockCurrent())))
259272 let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
260- let gwxAmountTotal = {
261- let @ = invoke(boostingContractOrFail(), "getGwxTotalREADONLY", nil, nil)
262- if ($isInstanceOf(@, "Int"))
263- then @
264- else throw(($getType(@) + " couldn't be cast to Int"))
265- }
273+ let gwxAmountTotal = valueOrElse(getGwxAmountTotalOption(), 0)
266274 let dh = toBigInt((height - rewardPerGwxIntegralLastHeight))
267275 let gwxAmountTotalBI = toBigInt(gwxAmountTotal)
268276 let rewardPerGwxIntegral = (rewardPerGwxIntegralPrevious + (if ((gwxAmountTotalBI == zeroBigInt))
269277 then zeroBigInt
270278 else fraction(dh, ((toBigInt(emissionRate) * toBigInt(gwxHoldersRewardCurrent)) * MULT18BI), (gwxAmountTotalBI * MULT8BI))))
271279 $Tuple2([IntegerEntry(keyGwxRewardEmissionStartHeight(), height), StringEntry(keyRewardPerGwxIntegral(), toString(rewardPerGwxIntegral))], rewardPerGwxIntegral)
272280 }
273281
274282
275283 func keyRewardPerGwxIntegralUserLast (userAddress) = makeString(["%s%s", "rewardPerGwxIntegralUserLast", toString(userAddress)], SEP)
276284
277285
278286 func _refreshUserReward (userAddress,userNum) = {
279- let $t097629850 = _refreshRewardPerGwxIntegral()
280- let rewardPerGwxIntegralActions = $t097629850._1
281- let rewardPerGwxIntegral = $t097629850._2
287+ let $t01012210210 = _refreshRewardPerGwxIntegral()
288+ let rewardPerGwxIntegralActions = $t01012210210._1
289+ let rewardPerGwxIntegral = $t01012210210._2
282290 let rewardPerGwxIntegralUserLast = match getString(this, keyRewardPerGwxIntegralUserLast(userAddress)) {
283291 case s: String =>
284292 valueOrErrorMessage(parseBigInt(s), wrapErr("invalid user last integral"))
285293 case _: Unit =>
286294 rewardPerGwxIntegral
287295 case _ =>
288296 throw("Match error")
289297 }
290298 let userIdxOption = getString(boostingContractOrFail(), keyUser2NumMapping(userAddress))
291299 let userUnclaimed = valueOrElse(getInteger(keyUserUnclaimed(userNum)), 0)
292- let userGwxAmount = {
293- let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [toString(userAddress)], nil)
294- if ($isInstanceOf(@, "Int"))
295- then @
296- else throw(($getType(@) + " couldn't be cast to Int"))
297- }
300+ let userGwxAmount = valueOrElse(getUserGwxAmountTotalOption(userAddress), 0)
298301 let userReward = (toInt(fraction(toBigInt(userGwxAmount), (rewardPerGwxIntegral - rewardPerGwxIntegralUserLast), MULT18BI)) + userUnclaimed)
299302 $Tuple2(([StringEntry(keyRewardPerGwxIntegralUserLast(userAddress), toString(rewardPerGwxIntegral))] ++ rewardPerGwxIntegralActions), userReward)
300303 }
301304
302305
303306 func commonClaimReward (userAddressStr) = {
304307 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
305308 let cfgArray = readConfigArrayOrFail()
306309 let userNum = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddressStr)
307- let $t01118011244 = _refreshUserReward(userAddress, userNum)
308- let actions = $t01118011244._1
309- let reward = $t01118011244._2
310+ let $t01150111565 = _refreshUserReward(userAddress, userNum)
311+ let actions = $t01150111565._1
312+ let reward = $t01150111565._2
310313 $Tuple2(reward, ([IntegerEntry(keyUserUnclaimed(userNum), 0)] ++ actions))
311314 }
312315
313316
314317 @Callable(i)
315318 func refreshUserReward (userAddressBytes,userNum) = {
316319 let checkCaller = if ((i.caller == boostingContractOrFail()))
317320 then true
318321 else throwErr("permission denied")
319322 if ((checkCaller == checkCaller))
320323 then {
321- let $t01152411602 = _refreshUserReward(Address(userAddressBytes), userNum)
322- let actions = $t01152411602._1
323- let reward = $t01152411602._2
324+ let $t01184511923 = _refreshUserReward(Address(userAddressBytes), userNum)
325+ let actions = $t01184511923._1
326+ let reward = $t01184511923._2
324327 $Tuple2(([IntegerEntry(keyUserUnclaimed(userNum), reward)] ++ actions), reward)
325328 }
326329 else throw("Strict value is not equal to itself.")
327330 }
328331
329332
330333
331334 @Callable(i)
332335 func tradeRewardInternal (paymentAmountLeftOver,userAddresses,rewards,currentIter) = if ((currentIter == size(userAddresses)))
333336 then nil
334337 else {
335338 let checks = [if ((i.caller == this))
336339 then true
337340 else throwErr("Permission denied"), if ((paymentAmountLeftOver >= rewards[currentIter]))
338341 then true
339342 else throwErr("insufficient payment assetId")]
340343 if ((checks == checks))
341344 then {
342345 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [(paymentAmountLeftOver - rewards[currentIter]), userAddresses, rewards, (currentIter + 1)], nil)
343346 if ((tradeRewardInternal == tradeRewardInternal))
344347 then {
345348 let tradingRewardHistoryKey = keyTradingRewardHistory(userAddresses[currentIter], i)
346349 let userAddress = addressFromStringValue(userAddresses[currentIter])
347350 $Tuple2([IntegerEntry(tradingRewardHistoryKey, rewards[currentIter]), IntegerEntry(keyTradingReward(userAddresses[currentIter]), rewards[currentIter])], tradeRewardInternal)
348351 }
349352 else throw("Strict value is not equal to itself.")
350353 }
351354 else throw("Strict value is not equal to itself.")
352355 }
353356
354357
355358
356359 @Callable(i)
357360 func updateReferralActivity (userAddress,gWxAmountStart) = {
358361 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
359362 let activeReferralInv = if ((referrer == unit))
360363 then unit
361364 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
362365 if ((activeReferralInv == activeReferralInv))
363366 then $Tuple2(nil, unit)
364367 else throw("Strict value is not equal to itself.")
365368 }
366369
367370
368371
369372 @Callable(i)
370373 func processPendingPeriodsAndUsers () = $Tuple2(nil, throwErr("deprecated"))
371374
372375
373376
374377 @Callable(i)
375378 func claimReward () = {
376379 let cfgArray = readConfigArrayOrFail()
377380 let userAddress = i.caller
378381 let userAddressStr = toString(userAddress)
379- let $t01333413391 = commonClaimReward(userAddressStr)
380- let amount = $t01333413391._1
381- let actions = $t01333413391._2
382+ let $t01365513712 = commonClaimReward(userAddressStr)
383+ let amount = $t01365513712._1
384+ let actions = $t01365513712._2
382385 let checkAmount = if ((amount > 0))
383386 then true
384387 else throw("nothing to claim")
385388 if ((checkAmount == checkAmount))
386389 then {
387390 let userGwxAmount = {
388391 let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [userAddressStr], nil)
389392 if ($isInstanceOf(@, "Int"))
390393 then @
391394 else throw(($getType(@) + " couldn't be cast to Int"))
392395 }
393396 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddressStr))
394397 let activeReferralInv = if ((referrer == unit))
395398 then unit
396399 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userGwxAmount >= referralMinGWxAmount)], nil)
397400 if ((activeReferralInv == activeReferralInv))
398401 then {
399402 let referralInv = if (if ((referrer == unit))
400403 then true
401404 else (referralMinGWxAmount > userGwxAmount))
402405 then unit
403406 else {
404407 let referrerReward = fraction(amount, referrerRewardPermille, SCALE)
405408 let referralReward = fraction(amount, referralRewardPermille, SCALE)
406409 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
407410 }
408411 if ((referralInv == referralInv))
409412 then {
410413 let claimedReferral = {
411414 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
412415 if ($isInstanceOf(@, "Int"))
413416 then @
414417 else throw(($getType(@) + " couldn't be cast to Int"))
415418 }
416419 if ((claimedReferral == claimedReferral))
417420 then {
418421 let totalAmount = (amount + claimedReferral)
419422 $Tuple2(([ScriptTransfer(i.caller, amount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", userAddressStr, totalAmount, i)] ++ actions), totalAmount)
420423 }
421424 else throw("Strict value is not equal to itself.")
422425 }
423426 else throw("Strict value is not equal to itself.")
424427 }
425428 else throw("Strict value is not equal to itself.")
426429 }
427430 else throw("Strict value is not equal to itself.")
428431 }
429432
430433
431434
432435 @Callable(i)
433436 func claimRewardREADONLY (address) = {
434- let $t01471814768 = commonClaimReward(address)
435- let amount = $t01471814768._1
436- let actions = $t01471814768._2
437+ let $t01503915089 = commonClaimReward(address)
438+ let amount = $t01503915089._1
439+ let actions = $t01503915089._2
437440 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
438441 let totalAmount = (amount + referralUnclaimed)
439442 $Tuple2(nil, totalAmount)
440443 }
441444
442445
443446
444447 @Callable(i)
445448 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
446449 then throw("permissions denied")
447450 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
448451
449452
450453
451454 @Callable(i)
452455 func tradeReward (userAddresses,rewards) = {
453456 let argsComparison = (size(userAddresses) == size(rewards))
454457 let maxRecipients = valueOrElse(getInteger(keyMaxRecipients()), 0)
455458 let payment = i.payments[0]
456459 let paymentAssetId = payment.assetId
457460 let paymentAmount = payment.amount
458461 let checks = [if ((maxRecipients >= size(userAddresses)))
459462 then true
460463 else throwErr("Too many recipients"), if (argsComparison)
461464 then true
462465 else throwErr("Arguments size mismatch"), if ((paymentAssetId == wxAssetId))
463466 then true
464467 else throwErr("Wrong asset payment")]
465468 if ((checks == checks))
466469 then {
467470 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [paymentAmount, userAddresses, rewards, 0], nil)
468471 if ((tradeRewardInternal == tradeRewardInternal))
469472 then $Tuple2(nil, tradeRewardInternal)
470473 else throw("Strict value is not equal to itself.")
471474 }
472475 else throw("Strict value is not equal to itself.")
473476 }
474477
475478
476479
477480 @Callable(i)
478481 func claimTradingReward () = {
479482 let userAddress = i.caller
480483 let userAddressString = toString(userAddress)
481484 let reward = getTradingReward(userAddressString)
482485 if ((reward > 0))
483486 then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
484487 else throwErr("nothing to claim")
485488 }
486489
487490
488491
489492 @Callable(i)
490493 func claimTradingRewardREADONLY (userAddress) = $Tuple2(nil, getTradingReward(userAddress))
491494
492495
493496 @Verifier(tx)
494497 func verify () = {
495498 let targetPublicKey = match managerPublicKeyOrUnit() {
496499 case pk: ByteVector =>
497500 pk
498501 case _: Unit =>
499502 tx.senderPublicKey
500503 case _ =>
501504 throw("Match error")
502505 }
503506 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
504507 }
505508

github/deemru/w8io/873ac7e 
59.99 ms