tx · 2aiNXQCFqPkXCuya54TKGupVLi6ygKVcBXHrHZFW1asM

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.01500000 Waves

2023.08.16 14:12 [2713052] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "2aiNXQCFqPkXCuya54TKGupVLi6ygKVcBXHrHZFW1asM", "fee": 1500000, "feeAssetId": null, "timestamp": 1692184238571, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "521nRjk4euWyVNRkiQsYFWVgvF889CZmDMW5gWic8RrnvNyv1Z278XYuK8fDKdsndn5k5Cz97GjeeitbgtQ9ytgk" ], "script": "base64:BgKwFQgCEgQKAgIBEgYKBAEYEQESBAoCCAESABIAEgMKAQgSABIECgIYERIAEgMKAQgiA1NFUCIFU0NBTEUiBU1VTFQ4IgdNVUxUOEJJIgp6ZXJvQmlnSW50IhRwcm9jZXNzaW5nU3RhZ2VUb3RhbCIVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzIgZNVUxUMTgiCE1VTFQxOEJJIgt3YXZlc1N0cmluZyIHd3JhcEVyciIDbXNnIgh0aHJvd0VyciIOZ2V0TnVtYmVyQnlLZXkiA2tleSIPZ2V0TnVtYmVyT3JGYWlsIg5nZXRTdHJpbmdCeUtleSIPZ2V0U3RyaW5nT3JGYWlsIgxwYXJzZUFzc2V0SWQiBWlucHV0IgNhYnMiA3ZhbCIJYWJzQmlnSW50IgtrZXlNYXhEZXB0aCIPbWF4RGVwdGhEZWZhdWx0IghtYXhEZXB0aCIRa2V5RmFjdG9yeUFkZHJlc3MiEWZhY3RvcnlBZGRyZXNzU3RyIg9mYWN0b3J5Q29udHJhY3QiEmtleUVtaXNzaW9uQWRkcmVzcyIZa2V5Vm90aW5nRW1pc3Npb25Db250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCITa2V5TnVtVG9Vc2VyTWFwcGluZyIDbnVtIhZrZXlSZWZlcnJhbFByb2dyYW1OYW1lIhpyZWZlcnJhbFByb2dyYW1OYW1lRGVmYXVsdCITcmVmZXJyYWxQcm9ncmFtTmFtZSIXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQiG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdCIUcmVmZXJyYWxNaW5HV3hBbW91bnQiGWtleVJlZmVycmVyUmV3YXJkUGVybWlsbGUiHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJlclJld2FyZFBlcm1pbGxlIhlrZXlSZWZlcnJhbFJld2FyZFBlcm1pbGxlIh1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdCIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZSILa2V5UmVmZXJyZXIiD3JlZmVycmFsQWRkcmVzcyIUa2V5VW5jbGFpbWVkUmVmZXJyYWwiC3Byb2dyYW1OYW1lIg5jbGFpbWVyQWRkcmVzcyISZW1pc3Npb25BZGRyZXNzU3RyIhBlbWlzc2lvbkNvbnRyYWN0Ig1JZHhDZmdBc3NldElkIhZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzIhZJZHhDZmdCb29zdGluZ0NvbnRyYWN0Ig5JZHhDZmdNYXhEZXB0aCIJa2V5Q29uZmlnIhJnZXRFbWlzc2lvbkFkZHJlc3MiD2VtaXNzaW9uQWRkcmVzcyIMd3hBc3NldElkU3RyIgl3eEFzc2V0SWQiFXJlYWRDb25maWdBcnJheU9yRmFpbCIMZm9ybWF0Q29uZmlnIhptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0ciIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIiFmJvb3N0aW5nQ29udHJhY3RPckZhaWwiCGNmZ0FycmF5Ih9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0Ig1rZXlVc2Vyc0NvdW50IhJrZXlVc2VyMk51bU1hcHBpbmciC3VzZXJBZGRyZXNzIhZrZXlSYXRlUGVyQmxvY2tDdXJyZW50IhprZXlHd3hIb2xkZXJzUmV3YXJkQ3VycmVudCIXa2V5R3d4SG9sZGVyc1Jld2FyZE5leHQiFGtleVBvb2xXZWlnaHRWaXJ0dWFsIhBrZXlVc2VyVW5jbGFpbWVkIgl1c2VySW5kZXgiG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcyIecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsIhdrZXlUcmFkaW5nUmV3YXJkSGlzdG9yeSIEdXNlciIBaSIQa2V5VHJhZGluZ1Jld2FyZCIQa2V5TWF4UmVjaXBpZW50cyIMSGlzdG9yeUVudHJ5IgR0eXBlIgZhbW91bnQiCmhpc3RvcnlLRVkiC2hpc3RvcnlEQVRBIhNrZXlNYW5hZ2VyUHVibGljS2V5IhZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIgttdXN0TWFuYWdlciICcGQiAnBrIhVnZXRVc2VySW5kZXhCeUFkZHJlc3MiEGdldFRyYWRpbmdSZXdhcmQiF2tleVJld2FyZFBlckd3eEludGVncmFsIhxfcmVmcmVzaFJld2FyZFBlckd3eEludGVncmFsIhxyZXdhcmRQZXJHd3hJbnRlZ3JhbFByZXZpb3VzIh5yZXdhcmRQZXJHd3hJbnRlZ3JhbExhc3RIZWlnaHQiDGVtaXNzaW9uUmF0ZSIXZ3d4SG9sZGVyc1Jld2FyZEN1cnJlbnQiDmd3eEFtb3VudFRvdGFsIgFAIgJkaCIQZ3d4QW1vdW50VG90YWxCSSIUcmV3YXJkUGVyR3d4SW50ZWdyYWwiH2tleVJld2FyZFBlckd3eEludGVncmFsVXNlckxhc3QiEl9yZWZyZXNoVXNlclJld2FyZCIHdXNlck51bSILJHQwOTc2Mjk4NTAiG3Jld2FyZFBlckd3eEludGVncmFsQWN0aW9ucyIccmV3YXJkUGVyR3d4SW50ZWdyYWxVc2VyTGFzdCINdXNlcklkeE9wdGlvbiINdXNlclVuY2xhaW1lZCINdXNlckd3eEFtb3VudCIKdXNlclJld2FyZCIRY29tbW9uQ2xhaW1SZXdhcmQiDnVzZXJBZGRyZXNzU3RyIg0kdDAxMTE4MDExMjQ0IgdhY3Rpb25zIgZyZXdhcmQiEHVzZXJBZGRyZXNzQnl0ZXMiC2NoZWNrQ2FsbGVyIg0kdDAxMTUyNDExNjAyIhVwYXltZW50QW1vdW50TGVmdE92ZXIiDXVzZXJBZGRyZXNzZXMiB3Jld2FyZHMiC2N1cnJlbnRJdGVyIgZjaGVja3MiE3RyYWRlUmV3YXJkSW50ZXJuYWwiF3RyYWRpbmdSZXdhcmRIaXN0b3J5S2V5Ig5nV3hBbW91bnRTdGFydCIIcmVmZXJyZXIiEWFjdGl2ZVJlZmVycmFsSW52Ig0kdDAxMzMzNDEzMzkxIgtjaGVja0Ftb3VudCILcmVmZXJyYWxJbnYiDnJlZmVycmVyUmV3YXJkIg5yZWZlcnJhbFJld2FyZCIPY2xhaW1lZFJlZmVycmFsIgt0b3RhbEFtb3VudCIHYWRkcmVzcyINJHQwMTQ3MTgxNDc2OCIRcmVmZXJyYWxVbmNsYWltZWQiDmFyZ3NDb21wYXJpc29uIg1tYXhSZWNpcGllbnRzIgdwYXltZW50Ig5wYXltZW50QXNzZXRJZCINcGF5bWVudEFtb3VudCIRdXNlckFkZHJlc3NTdHJpbmciAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleVMAAWECAl9fAAFiAOgHAAFjAIDC1y8AAWQJALYCAQUBYwABZQkAtgIBAAAAAWYAAAABZwABAAFoAICAkLu61q3wDQABaQkAtgIBBQFoAAFqAgVXQVZFUwEBawEBbAkAuQkCCQDMCAICEGd3eF9yZXdhcmQucmlkZToJAMwIAgUBbAUDbmlsAgEgAQFtAQFsCQACAQkBAWsBBQFsAQFuAQFvCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAW8AAAEBcAEBbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAW8JAQFrAQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBbwIPIGlzIG5vdCBkZWZpbmVkAQFxAQFvCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAW8CAAEBcgEBbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAW8JAQFrAQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBbwIPIGlzIG5vdCBkZWZpbmVkAQFzAQF0AwkAAAIFAXQFAWoFBHVuaXQJANkEAQUBdAEBdQEBdgMJAGYCAAAFAXYJAQEtAQUBdgUBdgEBdwEBdgMJAL8CAgUBZQUBdgkAvgIBBQF2BQF2AAF4Agwlc19fbWF4RGVwdGgAAXkAHgABegkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQF4BQF5AQFBAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwABQgkBAXIBCQEBQQAAAUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAUIBAUQAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwEBRQAJALkJAgkAzAgCAgIlcwkAzAgCAhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWEAAUYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAUMJAQFFAAEBRwEBSAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCG51bTJ1c2VyCQDMCAIJAKQDAQUBSAUDbmlsBQFhAAFJCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQFhAAFKAgZ3eGxvY2sAAUsJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBSQUBSgABTAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIMbWluR1d4QW1vdW50BQNuaWwFAWEAAU0JAGgCAPQDBQFjAAFOCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAUwFAU0AAU8JALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmVyUmV3YXJkUGVybWlsbGUFA25pbAUBYQABUAAyAAFRCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAU8FAVAAAVIJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUBYQABUwAyAAFUCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAVIFAVMBAVUBAVYJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcmVmZXJyZXIJAMwIAgUBSwkAzAgCBQFWBQNuaWwFAWEBAVcCAVgBWQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQFYCQDMCAIFAVkFA25pbAUBYQABWgkBAXIBCQEBRAAAAmFhCQERQGV4dHJOYXRpdmUoMTA2MikBBQFaAAJhYgABAAJhYwACAAJhZAADAAJhZQAEAQJhZgACCiVzX19jb25maWcBAmFnAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQFEAAkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgkBAUQAAg8gaXMgbm90IGRlZmluZWQAAmFoCQECYWcAAAJhaQkAkQMCCQC1CQIJAQV2YWx1ZQEJAJ0IAgUCYWgJAQJhZgAFAWEAAQACYWoJANkEAQUCYWkBAmFrAAkAtQkCCQEBcgEJAQJhZgAFAWEBAmFsBAJhaQJhbQJhbgF6CQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgUCYWkJAMwIAgUCYW0JAMwIAgUCYW4JAMwIAgkApAMBBQF6BQNuaWwFAWEBAmFvAAQCYXAJAQJhawAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFwBQJhZAIoYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBub3QgZGVmaW5lZAECYXEAAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQJhcgACDyVzX19uZXh0VXNlck51bQECYXMBAmF0CQC5CQIJAMwIAgIZJXMlcyVzX19tYXBwaW5nX191c2VyMm51bQkAzAgCCQClCAEFAmF0BQNuaWwFAWEBAmF1AAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQJhdgACHyVzJXNfX2d3eEhvbGRlcnNSZXdhcmRfX2N1cnJlbnQBAmF3AAIcJXMlc19fZ3d4SG9sZGVyc1Jld2FyZF9fbmV4dAECYXgAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAECYXkBAmF6CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg11c2VyVW5jbGFpbWVkCQDMCAIJAKQDAQUCYXoFA25pbAUBYQECYUEACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgZjb25maWcJAMwIAgIYcmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzBQNuaWwFAWEAAmFCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBcgEJAQJhQQABAmFDAgJhRAJhRQkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICDXRyYWRpbmdSZXdhcmQJAMwIAgIHaGlzdG9yeQkAzAgCBQJhRAkAzAgCCQDYBAEIBQJhRQ10cmFuc2FjdGlvbklkBQNuaWwFAWEBAmFGAQJhdAkAuQkCCQDMCAICBCVzJXMJAMwIAgINdHJhZGluZ1Jld2FyZAkAzAgCBQJhdAUDbmlsBQFhAQJhRwAJALkJAgkAzAgCAgIlcwkAzAgCAg1tYXhSZWNpcGllbnRzBQNuaWwFAWEBAmFIBAJhSQJhRAJhSgJhRQQCYUsJALkJAgkAzAgCAhElcyVzJXMlc19faGlzdG9yeQkAzAgCBQJhSQkAzAgCBQJhRAkAzAgCCQDYBAEIBQJhRQ10cmFuc2FjdGlvbklkBQNuaWwFAWEEAmFMCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFAmFKBQNuaWwFAWEJAQtTdHJpbmdFbnRyeQIFAmFLBQJhTAECYU0AAhQlc19fbWFuYWdlclB1YmxpY0tleQECYU4AAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwECYU8ABAJhUAkAoggBCQECYU4AAwkAAQIFAmFQAgZTdHJpbmcEAmFRBQJhUAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYVEFBHRoaXMBAmFSAAQCYVMJAQJhTwAEAmFQCQCdCAIFAmFTCQECYU0AAwkAAQIFAmFQAgZTdHJpbmcEAmFRBQJhUAkA2QQBBQJhUQMJAAECBQJhUAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJhVAECYUUEAmFVCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEAmFQCQECYVIAAwkAAQIFAmFQAgpCeXRlVmVjdG9yBAJhVgUCYVADCQAAAggFAmFFD2NhbGxlclB1YmxpY0tleQUCYVYGBQJhVQMJAAECBQJhUAIEVW5pdAMJAAACCAUCYUUGY2FsbGVyBQR0aGlzBgUCYVUJAAIBAgtNYXRjaCBlcnJvcgECYVcCAmFuAmF0BAFvCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIdXNlcjJudW0JAMwIAgUCYXQFA25pbAUBYQkBDXBhcnNlSW50VmFsdWUBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFAmFuBQFvCQCsAgIJAKwCAgkArAICAg1Vc2VyIGFkZHJlc3MgBQJhdAItIGlzIG5vdCBmb3VuZCBpbiBib29zdGluZyBjb250cmFjdCBkYXRhLCBrZXk9BQFvAQJhWAECYXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFGAQUCYXQAAAECYVkACQC5CQIJAMwIAgICJXMJAMwIAgIUcmV3YXJkUGVyR3d4SW50ZWdyYWwFA25pbAUBYQECYVoABAJiYQkBC3ZhbHVlT3JFbHNlAgQCYVAJAJ0IAgUEdGhpcwkBAmFZAAMJAAECBQJhUAIGU3RyaW5nBAJhUQUCYVAJAKgDAQUCYVEDCQABAgUCYVACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgUBZQQCYmIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQECYXEACQEBawEJAKwCAgIIaW52YWxpZCAJAQJhcQAEAmJjCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYWEJAQJhdQAJAQFrAQkArAICAghpbnZhbGlkIAkBAmF1AAQCYmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYWEJAQJhdgAAAAQCYmUKAAJiZgkA/AcECQECYW8AAhNnZXRHd3hUb3RhbFJFQURPTkxZBQNuaWwFA25pbAMJAAECBQJiZgIDSW50BQJiZgkAAgEJAKwCAgkAAwEFAmJmAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmJnCQC2AgEJAGUCBQZoZWlnaHQFAmJiBAJiaAkAtgIBBQJiZQQCYmkJALcCAgUCYmEDCQAAAgUCYmgFAWUFAWUJALwCAwUCYmcJALkCAgkAuQICCQC2AgEFAmJjCQC2AgEFAmJkBQFpCQC5AgIFAmJoBQFkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcQAFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQECYVkACQCmAwEFAmJpBQNuaWwFAmJpAQJiagECYXQJALkJAgkAzAgCAgQlcyVzCQDMCAICHHJld2FyZFBlckd3eEludGVncmFsVXNlckxhc3QJAMwIAgkApQgBBQJhdAUDbmlsBQFhAQJiawICYXQCYmwEAmJtCQECYVoABAJibggFAmJtAl8xBAJiaQgFAmJtAl8yBAJibwQCYVAJAJ0IAgUEdGhpcwkBAmJqAQUCYXQDCQABAgUCYVACBlN0cmluZwQCYVEFAmFQCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQUCYVEJAQFrAQIaaW52YWxpZCB1c2VyIGxhc3QgaW50ZWdyYWwDCQABAgUCYVACBFVuaXQFAmJpCQACAQILTWF0Y2ggZXJyb3IEAmJwCQCdCAIJAQJhbwAJAQJhcwEFAmF0BAJicQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYXkBBQJibAAABAJicgoAAmJmCQD8BwQJAQJhbwACEGdldFVzZXJHd3hBbW91bnQJAMwIAgkApQgBBQJhdAUDbmlsBQNuaWwDCQABAgUCYmYCA0ludAUCYmYJAAIBCQCsAgIJAAMBBQJiZgIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJicwkAZAIJAKADAQkAvAIDCQC2AgEFAmJyCQC4AgIFAmJpBQJibwUBaQUCYnEJAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJiagEFAmF0CQCmAwEFAmJpBQNuaWwFAmJuBQJicwECYnQBAmJ1BAJhdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAmJ1CQEBawECFGludmFsaWQgdXNlciBhZGRyZXNzBAJhcAkBAmFrAAQCYmwJAQJhVwIJAJEDAgUCYXAFAmFkBQJidQQCYnYJAQJiawIFAmF0BQJibAQCYncIBQJidgJfMQQCYngIBQJidgJfMgkAlAoCBQJieAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXkBBQJibAAABQNuaWwFAmJ3CgJhRQERcmVmcmVzaFVzZXJSZXdhcmQCAmJ5AmJsBAJiegMJAAACCAUCYUUGY2FsbGVyCQECYW8ABgkBAW0BAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQJiegUCYnoEAmJBCQECYmsCCQEHQWRkcmVzcwEFAmJ5BQJibAQCYncIBQJiQQJfMQQCYngIBQJiQQJfMgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJheQEFAmJsBQJieAUDbmlsBQJidwUCYngJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUUBE3RyYWRlUmV3YXJkSW50ZXJuYWwEAmJCAmJDAmJEAmJFAwkAAAIFAmJFCQCQAwEFAmJDBQNuaWwEAmJGCQDMCAIDCQAAAggFAmFFBmNhbGxlcgUEdGhpcwYJAQFtAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgMJAGcCBQJiQgkAkQMCBQJiRAUCYkUGCQEBbQECHGluc3VmZmljaWVudCBwYXltZW50IGFzc2V0SWQFA25pbAMJAAACBQJiRgUCYkYEAmJHCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgkAZQIFAmJCCQCRAwIFAmJEBQJiRQkAzAgCBQJiQwkAzAgCBQJiRAkAzAgCCQBkAgUCYkUAAQUDbmlsBQNuaWwDCQAAAgUCYkcFAmJHBAJiSAkBAmFDAgkAkQMCBQJiQwUCYkUFAmFFBAJhdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJiQwUCYkUJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYkgJAJEDAgUCYkQFAmJFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYUYBCQCRAwIFAmJDBQJiRQkAkQMCBQJiRAUCYkUFA25pbAUCYkcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUUBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkCAmF0AmJJBAJiSgkAnQgCBQJhQgkBAVUBBQJhdAQCYksDCQAAAgUCYkoFBHVuaXQFBHVuaXQJAPwHBAUCYUICFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUBSwkAzAgCBQJhdAkAzAgCCQBnAgUCYkkFAU4FA25pbAUDbmlsAwkAAAIFAmJLBQJiSwkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYUUBHXByb2Nlc3NQZW5kaW5nUGVyaW9kc0FuZFVzZXJzAAkAlAoCBQNuaWwJAQFtAQIKZGVwcmVjYXRlZAJhRQELY2xhaW1SZXdhcmQABAJhcAkBAmFrAAQCYXQIBQJhRQZjYWxsZXIEAmJ1CQClCAEFAmF0BAJiTAkBAmJ0AQUCYnUEAmFKCAUCYkwCXzEEAmJ3CAUCYkwCXzIEAmJNAwkAZgIFAmFKAAAGCQACAQIQbm90aGluZyB0byBjbGFpbQMJAAACBQJiTQUCYk0EAmJyCgACYmYJAPwHBAkBAmFvAAIQZ2V0VXNlckd3eEFtb3VudAkAzAgCBQJidQUDbmlsBQNuaWwDCQABAgUCYmYCA0ludAUCYmYJAAIBCQCsAgIJAAMBBQJiZgIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJiSgkAnQgCBQJhQgkBAVUBBQJidQQCYksDCQAAAgUCYkoFBHVuaXQFBHVuaXQJAPwHBAUCYUICFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUBSwkAzAgCBQJhdAkAzAgCCQBnAgUCYnIFAU4FA25pbAUDbmlsAwkAAAIFAmJLBQJiSwQCYk4DAwkAAAIFAmJKBQR1bml0BgkAZgIFAU4FAmJyBQR1bml0BAJiTwkAawMFAmFKBQFRBQFiBAJiUAkAawMFAmFKBQFUBQFiCQD8BwQFAmFCAgxpbmNVbmNsYWltZWQJAMwIAgUBSwkAzAgCBQJhdAkAzAgCBQJiTwkAzAgCBQJiUAUDbmlsBQNuaWwDCQAAAgUCYk4FAmJOBAJiUQoAAmJmCQD8BwQFAmFCAgVjbGFpbQkAzAgCBQFLBQNuaWwFA25pbAMJAAECBQJiZgIDSW50BQJiZgkAAgEJAKwCAgkAAwEFAmJmAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUCYlEFAmJRBAJiUgkAZAIFAmFKBQJiUQkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmFFBmNhbGxlcgUCYUoJANkEAQkAkQMCBQJhcAUCYWIJAMwIAgkBAmFIBAIFY2xhaW0FAmJ1BQJiUgUCYUUFA25pbAUCYncFAmJSCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFFARNjbGFpbVJld2FyZFJFQURPTkxZAQJiUwQCYlQJAQJidAEFAmJTBAJhSggFAmJUAl8xBAJidwgFAmJUAl8yBAJiVQkBC3ZhbHVlT3JFbHNlAgkAmggCBQJhQgkBAVcCBQFLBQJiUwAABAJiUgkAZAIFAmFKBQJiVQkAlAoCBQNuaWwFAmJSAmFFARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAmFFBmNhbGxlcgUBQwkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFxAAUGaGVpZ2h0BQNuaWwCYUUBC3RyYWRlUmV3YXJkAgJiQwJiRAQCYlYJAAACCQCQAwEFAmJDCQCQAwEFAmJEBAJiVwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYUcAAAAEAmJYCQCRAwIIBQJhRQhwYXltZW50cwAABAJiWQgFAmJYB2Fzc2V0SWQEAmJaCAUCYlgGYW1vdW50BAJiRgkAzAgCAwkAZwIFAmJXCQCQAwEFAmJDBgkBAW0BAhNUb28gbWFueSByZWNpcGllbnRzCQDMCAIDBQJiVgYJAQFtAQIXQXJndW1lbnRzIHNpemUgbWlzbWF0Y2gJAMwIAgMJAAACBQJiWQUCYWoGCQEBbQECE1dyb25nIGFzc2V0IHBheW1lbnQFA25pbAMJAAACBQJiRgUCYkYEAmJHCQD8BwQFBHRoaXMCE3RyYWRlUmV3YXJkSW50ZXJuYWwJAMwIAgUCYloJAMwIAgUCYkMJAMwIAgUCYkQJAMwIAgAABQNuaWwFA25pbAMJAAACBQJiRwUCYkcJAJQKAgUDbmlsBQJiRwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhRQESY2xhaW1UcmFkaW5nUmV3YXJkAAQCYXQIBQJhRQZjYWxsZXIEAmNhCQClCAEFAmF0BAJieAkBAmFYAQUCY2EDCQBmAgUCYngAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmF0BQJieAUCYWoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhRgEFAmNhAAAFA25pbAUCYngJAQFtAQIQbm90aGluZyB0byBjbGFpbQJhRQEaY2xhaW1UcmFkaW5nUmV3YXJkUkVBRE9OTFkBAmF0CQCUCgIFA25pbAkBAmFYAQUCYXQBAmNiAQJjYwAEAmNkBAJhUAkBAmFSAAMJAAECBQJhUAIKQnl0ZVZlY3RvcgQCYVYFAmFQBQJhVgMJAAECBQJhUAIEVW5pdAgFAmNiD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJjYglib2R5Qnl0ZXMJAJEDAggFAmNiBnByb29mcwAABQJjZJqq6i8=", "height": 2713052, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GcXcsR7siWTtCajvNbGXAVcsTjmJabABAvguHapdjmGN Next: CdLiBq2KP3iPWYfY5Wr5y3GnRxBsGXrSHvWE7GX45Jc Diff:
OldNewDifferences
77
88 let MULT8 = 100000000
99
10+let MULT8BI = toBigInt(MULT8)
11+
1012 let zeroBigInt = toBigInt(0)
1113
1214 let processingStageTotal = 0
1315
1416 let processingStageShares = 1
1517
18+let MULT18 = 1000000000000000000
19+
20+let MULT18BI = toBigInt(MULT18)
21+
1622 let wavesString = "WAVES"
23+
24+func wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
25+
26+
27+func throwErr (msg) = throw(wrapErr(msg))
28+
1729
1830 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1931
2032
21-func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
33+func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), wrapErr((("mandatory this." + key) + " is not defined")))
2234
2335
2436 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2537
2638
27-func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
39+func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), wrapErr((("mandatory this." + key) + " is not defined")))
2840
2941
3042 func parseAssetId (input) = if ((input == wavesString))
3143 then unit
3244 else fromBase58String(input)
33-
34-
35-func wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
36-
37-
38-func throwErr (msg) = throw(wrapErr(msg))
3945
4046
4147 func abs (val) = if ((0 > val))
144150 func keyUsersCount () = "%s__nextUserNum"
145151
146152
153+func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", toString(userAddress)], SEP)
154+
155+
147156 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
148157
149158
156165 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
157166
158167
159-func keyNextProcessedUser () = "%s__nextProcessedUser"
160-
161-
162-func keyLatestPeriod () = "%s__latestPeriod"
163-
164-
165-func keyNextPeriod () = "%s__nextPeriod"
166-
167-
168-func keyProcessingStage () = "%s__processingStage"
169-
170-
171-func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
172-
173-
174168 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
175-
176-
177-func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
178-
179-
180-func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
181-
182-
183-func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
184-
185-
186-func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
187-
188-
189-func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
190-
191-
192-func keyLastPayoutInfo () = "%s__lastPayoutInfo"
193-
194-
195-func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
196-
197-
198-func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
199-
200-
201-func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
202-
203-
204-func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
205-
206-
207-func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
208-
209-
210-func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
211169
212170
213171 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
275233 }
276234
277235
278-func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
279- let kLast = keyLastProcessedPeriodOfUser(userIndex)
280- let kKey = keyUserKValueForPeriod(period, userIndex)
281- let kRaw = getInteger(boostingContractAddress, kKey)
282- let kUserWeight = keyUserWeightForPeriod(period, userIndex)
283- if (isDefined(kRaw))
284- then {
285- let k = value(kRaw)
286- let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
287- let w = ((k * heightForPeriod) + b)
288- if ((w > 0))
289- then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
290- else $Tuple2(0, nil)
291- }
292- else {
293- let p = getInteger(this, kLast)
294- if (if (isDefined(p))
295- then (period >= value(p))
296- else false)
297- then {
298- let pv = value(p)
299- let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
300- let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
301- let w = ((k * heightForPeriod) + b)
302- if ((w > 0))
303- then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
304- else $Tuple2(0, nil)
305- }
306- else $Tuple2(0, nil)
307- }
308- }
309-
310-
311-func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
312- let kUserWeight = keyUserWeightForPeriod(period, userIndex)
313- let userWeightOrUnit = getInteger(kUserWeight)
314- match userWeightOrUnit {
315- case _: Unit =>
316- 0
317- case w: Int =>
318- (w / SCALE)
319- case _ =>
320- throw("Match error")
321- }
322- }
323-
324-
325236 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
326237 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
327238 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
328239 }
329240
330241
331-func nextPeriod () = getNumberByKey(keyNextPeriod())
242+func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
332243
333244
334-func commonClaimReward (userAddress) = {
335- let cfgArray = readConfigArrayOrFail()
336- let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
337- let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
338- match userUnclaimedOption {
245+func keyRewardPerGwxIntegral () = makeString(["%s", "rewardPerGwxIntegral"], SEP)
246+
247+
248+func _refreshRewardPerGwxIntegral () = {
249+ let rewardPerGwxIntegralPrevious = valueOrElse( match getString(this, keyRewardPerGwxIntegral()) {
250+ case s: String =>
251+ parseBigInt(s)
339252 case _: Unit =>
340- $Tuple2(0, nil)
341- case u: Int =>
342- $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
253+ unit
254+ case _ =>
255+ throw("Match error")
256+ }, zeroBigInt)
257+ let rewardPerGwxIntegralLastHeight = valueOrErrorMessage(getInteger(this, keyGwxRewardEmissionStartHeight()), wrapErr(("invalid " + keyGwxRewardEmissionStartHeight())))
258+ let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), wrapErr(("invalid " + keyRatePerBlockCurrent())))
259+ 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+ }
266+ let dh = toBigInt((height - rewardPerGwxIntegralLastHeight))
267+ let gwxAmountTotalBI = toBigInt(gwxAmountTotal)
268+ let rewardPerGwxIntegral = (rewardPerGwxIntegralPrevious + (if ((gwxAmountTotalBI == zeroBigInt))
269+ then zeroBigInt
270+ else fraction(dh, ((toBigInt(emissionRate) * toBigInt(gwxHoldersRewardCurrent)) * MULT18BI), (gwxAmountTotalBI * MULT8BI))))
271+ $Tuple2([IntegerEntry(keyGwxRewardEmissionStartHeight(), height), StringEntry(keyRewardPerGwxIntegral(), toString(rewardPerGwxIntegral))], rewardPerGwxIntegral)
272+ }
273+
274+
275+func keyRewardPerGwxIntegralUserLast (userAddress) = makeString(["%s%s", "rewardPerGwxIntegralUserLast", toString(userAddress)], SEP)
276+
277+
278+func _refreshUserReward (userAddress,userNum) = {
279+ let $t097629850 = _refreshRewardPerGwxIntegral()
280+ let rewardPerGwxIntegralActions = $t097629850._1
281+ let rewardPerGwxIntegral = $t097629850._2
282+ let rewardPerGwxIntegralUserLast = match getString(this, keyRewardPerGwxIntegralUserLast(userAddress)) {
283+ case s: String =>
284+ valueOrErrorMessage(parseBigInt(s), wrapErr("invalid user last integral"))
285+ case _: Unit =>
286+ rewardPerGwxIntegral
343287 case _ =>
344288 throw("Match error")
345289 }
290+ let userIdxOption = getString(boostingContractOrFail(), keyUser2NumMapping(userAddress))
291+ 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+ }
298+ let userReward = (toInt(fraction(toBigInt(userGwxAmount), (rewardPerGwxIntegral - rewardPerGwxIntegralUserLast), MULT18BI)) + userUnclaimed)
299+ $Tuple2(([StringEntry(keyRewardPerGwxIntegralUserLast(userAddress), toString(rewardPerGwxIntegral))] ++ rewardPerGwxIntegralActions), userReward)
346300 }
347301
348302
349-func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
303+func commonClaimReward (userAddressStr) = {
304+ let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
305+ let cfgArray = readConfigArrayOrFail()
306+ let userNum = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddressStr)
307+ let $t01118011244 = _refreshUserReward(userAddress, userNum)
308+ let actions = $t01118011244._1
309+ let reward = $t01118011244._2
310+ $Tuple2(reward, ([IntegerEntry(keyUserUnclaimed(userNum), 0)] ++ actions))
311+ }
312+
313+
314+@Callable(i)
315+func refreshUserReward (userAddressBytes,userNum) = {
316+ let checkCaller = if ((i.caller == boostingContractOrFail()))
317+ then true
318+ else throwErr("permission denied")
319+ if ((checkCaller == checkCaller))
320+ then {
321+ let $t01152411602 = _refreshUserReward(Address(userAddressBytes), userNum)
322+ let actions = $t01152411602._1
323+ let reward = $t01152411602._2
324+ $Tuple2(([IntegerEntry(keyUserUnclaimed(userNum), reward)] ++ actions), reward)
325+ }
326+ else throw("Strict value is not equal to itself.")
327+ }
328+
350329
351330
352331 @Callable(i)
388367
389368
390369 @Callable(i)
391-func finalizeHelper () = {
392- let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
393- let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
394- let currentUser = getNumberByKey(keyNextProcessedUser())
395- let latestPeriod = getNumberByKey(keyLatestPeriod())
396- let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
397- let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
398- let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
399- let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
400- if ((currentPeriod > latestPeriod))
401- then $Tuple2(nil, false)
402- else if ((processingStage == processingStageTotal))
403- then {
404- let $t01451014626 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
405- let userWeight = $t01451014626._1
406- let userActions = $t01451014626._2
407- let totalWeightNew = (totalWeight + userWeight)
408- let processingActions = if (((usersCount - 1) > currentUser))
409- then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
410- else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
411- $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
412- }
413- else if ((processingStage == processingStageShares))
414- then {
415- let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
416- let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
417- let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
418- let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
419- let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
420- let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
421- let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
422- let activeReferralInv = if ((referrer == unit))
423- then unit
424- else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
425- if ((activeReferralInv == activeReferralInv))
426- then {
427- let referralInv = if (if ((referrer == unit))
428- then true
429- else (referralMinGWxAmount > userWeight))
430- then unit
431- else {
432- let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
433- let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
434- invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
435- }
436- if ((referralInv == referralInv))
437- then {
438- let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
439- let processingActions = if (((usersCount - 1) > currentUser))
440- then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
441- else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
442- $Tuple2((unclaimedActions ++ processingActions), true)
443- }
444- else throw("Strict value is not equal to itself.")
445- }
446- else throw("Strict value is not equal to itself.")
447- }
448- else throw("invalid processing stage")
449- }
370+func processPendingPeriodsAndUsers () = $Tuple2(nil, throwErr("deprecated"))
450371
451372
452373
453374 @Callable(i)
454-func finalizeWrapper (counter) = {
455- let result = {
456- let @ = invoke(this, "finalizeHelper", nil, nil)
457- if ($isInstanceOf(@, "Boolean"))
458- then @
459- else throw(($getType(@) + " couldn't be cast to Boolean"))
460- }
461- if ((result == result))
462- then if (!(result))
463- then if ((counter == maxDepth))
464- then throw("Nothing to process")
465- else $Tuple2(nil, unit)
466- else if ((counter > 0))
467- then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
468- else $Tuple2(nil, unit)
469- else throw("Strict value is not equal to itself.")
470- }
471-
472-
473-
474-@Callable(i)
475-func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
476-
477-
478-
479-@Callable(i)
480-func deposit () = {
481- let checkCaller = if ((i.caller == votingEmissionContract))
375+func claimReward () = {
376+ let cfgArray = readConfigArrayOrFail()
377+ let userAddress = i.caller
378+ let userAddressStr = toString(userAddress)
379+ let $t01333413391 = commonClaimReward(userAddressStr)
380+ let amount = $t01333413391._1
381+ let actions = $t01333413391._2
382+ let checkAmount = if ((amount > 0))
482383 then true
483- else mustManager(i)
484- if ((checkCaller == checkCaller))
384+ else throw("nothing to claim")
385+ if ((checkAmount == checkAmount))
485386 then {
486- let period = nextPeriod()
487- let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
488- let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
489- let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
490- if ((gwxHoldersRewardCurrent == gwxHoldersRewardCurrent))
387+ let userGwxAmount = {
388+ let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [userAddressStr], nil)
389+ if ($isInstanceOf(@, "Int"))
390+ then @
391+ else throw(($getType(@) + " couldn't be cast to Int"))
392+ }
393+ let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddressStr))
394+ let activeReferralInv = if ((referrer == unit))
395+ then unit
396+ else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userGwxAmount >= referralMinGWxAmount)], nil)
397+ if ((activeReferralInv == activeReferralInv))
491398 then {
492- let auxAmount = fraction((deltaH * gwxHoldersRewardCurrent), emissionRate, MULT8)
493- let em = if ((auxAmount > 0))
494- then invoke(emissionContract, "emit", [auxAmount], nil)
495- else unit
496- if ((em == em))
399+ let referralInv = if (if ((referrer == unit))
400+ then true
401+ else (referralMinGWxAmount > userGwxAmount))
402+ then unit
403+ else {
404+ let referrerReward = fraction(amount, referrerRewardPermille, SCALE)
405+ let referralReward = fraction(amount, referralRewardPermille, SCALE)
406+ invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
407+ }
408+ if ((referralInv == referralInv))
497409 then {
498- let matcherPart = 0
499- let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
500- let gwxHoldersRewardUpdated = {
501- let @ = invoke(emissionContract, "gwxHoldersRewardUpdate", nil, nil)
502- if ($isInstanceOf(@, "Boolean"))
410+ let claimedReferral = {
411+ let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
412+ if ($isInstanceOf(@, "Int"))
503413 then @
504- else throw(($getType(@) + " couldn't be cast to Boolean"))
414+ else throw(($getType(@) + " couldn't be cast to Int"))
505415 }
506- if ((gwxHoldersRewardUpdated == gwxHoldersRewardUpdated))
416+ if ((claimedReferral == claimedReferral))
507417 then {
508- let totalReward = (matcherPart + auxAmount)
509- let actions = if (if ((totalReward == 0))
510- then !(gwxHoldersRewardUpdated)
511- else false)
512- then nil
513- 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)]
514- $Tuple2(actions, unit)
418+ let totalAmount = (amount + claimedReferral)
419+ $Tuple2(([ScriptTransfer(i.caller, amount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", userAddressStr, totalAmount, i)] ++ actions), totalAmount)
515420 }
516421 else throw("Strict value is not equal to itself.")
517422 }
525430
526431
527432 @Callable(i)
528-func claimReward () = {
529- let cfgArray = readConfigArrayOrFail()
530- let address = toString(i.caller)
531- let $t01981519865 = commonClaimReward(address)
532- let amount = $t01981519865._1
533- let actions = $t01981519865._2
534- let checkAmount = if ((amount > 0))
535- then true
536- else throw("Nothing to claim")
537- if ((checkAmount == checkAmount))
538- then {
539- let amountFromEmission = 0
540- let claimedReferral = {
541- let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
542- if ($isInstanceOf(@, "Int"))
543- then @
544- else throw(($getType(@) + " couldn't be cast to Int"))
545- }
546- let totalAmount = (amount + claimedReferral)
547- $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
548- }
549- else throw("Strict value is not equal to itself.")
550- }
551-
552-
553-
554-@Callable(i)
555433 func claimRewardREADONLY (address) = {
556- let $t02043820488 = commonClaimReward(address)
557- let amount = $t02043820488._1
558- let actions = $t02043820488._2
434+ let $t01471814768 = commonClaimReward(address)
435+ let amount = $t01471814768._1
436+ let actions = $t01471814768._2
559437 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
560438 let totalAmount = (amount + referralUnclaimed)
561439 $Tuple2(nil, totalAmount)
564442
565443
566444 @Callable(i)
567-func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
568-
569-
570-
571-@Callable(i)
572-func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
573-
574-
575-
576-@Callable(i)
577-func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
578- let lockEndHeight = (lockStartHeight + lockDurationBlocks)
579- let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
580- let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
581- $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
582- }
583-
584-
585-
586-@Callable(i)
587-func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
588- let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
589- let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
590- $Tuple2(nil, [gWxAmountStart])
591- }
592-
593-
594-
595-@Callable(i)
596445 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
597446 then throw("permissions denied")
598447 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
599-
600-
601-
602-@Callable(i)
603-func latestPeriodEmissionRewardsREADONLY (address) = {
604- let period = nextPeriod()
605- $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
606- }
607-
608-
609-
610-@Callable(i)
611-func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
612- let nCoins = toBigInt(2)
613- let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
614- let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
615- let x1 = parseBigIntValue(x1BigIntStr)
616- let x2 = parseBigIntValue(x2BigIntStr)
617- let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
618- let s = (x1 + x2)
619- if ((s == zeroBigInt))
620- then $Tuple2(nil, toString(zeroBigInt))
621- else {
622- let ann = (amp * nCoins)
623- let arr = [0, 1, 2, 3, 4, 5, 6]
624- func calc (acc,cur) = {
625- let $t02312123148 = acc
626- let d = $t02312123148._1
627- let dPrev = $t02312123148._2
628- let found = $t02312123148._3
629- if ((found != unit))
630- then acc
631- else {
632- let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
633- let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
634- let dDiff = absBigInt((dNext - value(d)))
635- if ((targetPrecision >= dDiff))
636- then $Tuple3(dNext, d, cur)
637- else $Tuple3(dNext, d, unit)
638- }
639- }
640-
641- let $t02374623809 = {
642- let $l = arr
643- let $s = size($l)
644- let $acc0 = $Tuple3(s, unit, unit)
645- func $f0_1 ($a,$i) = if (($i >= $s))
646- then $a
647- else calc($a, $l[$i])
648-
649- func $f0_2 ($a,$i) = if (($i >= $s))
650- then $a
651- else throw("List size exceeds 7")
652-
653- $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)
654- }
655- let dNext = $t02374623809._1
656- let dPrev = $t02374623809._2
657- let found = $t02374623809._3
658- if ((found != unit))
659- then $Tuple2(nil, toString(dNext))
660- else {
661- let dDiff = absBigInt((dNext - value(dPrev)))
662- throw(("D calculation error, dDiff = " + toString(dDiff)))
663- }
664- }
665- }
666448
667449
668450
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
10+let MULT8BI = toBigInt(MULT8)
11+
1012 let zeroBigInt = toBigInt(0)
1113
1214 let processingStageTotal = 0
1315
1416 let processingStageShares = 1
1517
18+let MULT18 = 1000000000000000000
19+
20+let MULT18BI = toBigInt(MULT18)
21+
1622 let wavesString = "WAVES"
23+
24+func wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
25+
26+
27+func throwErr (msg) = throw(wrapErr(msg))
28+
1729
1830 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1931
2032
21-func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
33+func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), wrapErr((("mandatory this." + key) + " is not defined")))
2234
2335
2436 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2537
2638
27-func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
39+func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), wrapErr((("mandatory this." + key) + " is not defined")))
2840
2941
3042 func parseAssetId (input) = if ((input == wavesString))
3143 then unit
3244 else fromBase58String(input)
33-
34-
35-func wrapErr (msg) = makeString(["gwx_reward.ride:", msg], " ")
36-
37-
38-func throwErr (msg) = throw(wrapErr(msg))
3945
4046
4147 func abs (val) = if ((0 > val))
4248 then -(val)
4349 else val
4450
4551
4652 func absBigInt (val) = if ((zeroBigInt > val))
4753 then -(val)
4854 else val
4955
5056
5157 let keyMaxDepth = "%s__maxDepth"
5258
5359 let maxDepthDefault = 30
5460
5561 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
5662
5763 func keyFactoryAddress () = "%s%s__config__factoryAddress"
5864
5965
6066 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
6167
6268 let factoryContract = addressFromStringValue(factoryAddressStr)
6369
6470 func keyEmissionAddress () = "%s%s__config__emissionAddress"
6571
6672
6773 func keyVotingEmissionContract () = makeString(["%s", "votingEmissionContract"], SEP)
6874
6975
7076 let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract()))
7177
7278 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
7379
7480
7581 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
7682
7783 let referralProgramNameDefault = "wxlock"
7884
7985 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
8086
8187 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
8288
8389 let referralMinGWxAmountDefault = (500 * MULT8)
8490
8591 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
8692
8793 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
8894
8995 let referrerRewardPermilleDefault = 50
9096
9197 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
9298
9399 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
94100
95101 let referralRewardPermilleDefault = 50
96102
97103 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
98104
99105 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
100106
101107
102108 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
103109
104110
105111 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
106112
107113 let emissionContract = addressFromStringValue(emissionAddressStr)
108114
109115 let IdxCfgAssetId = 1
110116
111117 let IdxCfgPacemakerAddress = 2
112118
113119 let IdxCfgBoostingContract = 3
114120
115121 let IdxCfgMaxDepth = 4
116122
117123 func keyConfig () = "%s__config"
118124
119125
120126 func getEmissionAddress () = addressFromStringValue(valueOrErrorMessage(getString(this, keyEmissionAddress()), (("mandatory this." + keyEmissionAddress()) + " is not defined")))
121127
122128
123129 let emissionAddress = getEmissionAddress()
124130
125131 let wxAssetIdStr = split(value(getString(emissionAddress, keyConfig())), SEP)[1]
126132
127133 let wxAssetId = fromBase58String(wxAssetIdStr)
128134
129135 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
130136
131137
132138 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
133139
134140
135141 func boostingContractOrFail () = {
136142 let cfgArray = readConfigArrayOrFail()
137143 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
138144 }
139145
140146
141147 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
142148
143149
144150 func keyUsersCount () = "%s__nextUserNum"
145151
146152
153+func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", toString(userAddress)], SEP)
154+
155+
147156 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
148157
149158
150159 func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
151160
152161
153162 func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
154163
155164
156165 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
157166
158167
159-func keyNextProcessedUser () = "%s__nextProcessedUser"
160-
161-
162-func keyLatestPeriod () = "%s__latestPeriod"
163-
164-
165-func keyNextPeriod () = "%s__nextPeriod"
166-
167-
168-func keyProcessingStage () = "%s__processingStage"
169-
170-
171-func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
172-
173-
174168 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
175-
176-
177-func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
178-
179-
180-func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
181-
182-
183-func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
184-
185-
186-func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
187-
188-
189-func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
190-
191-
192-func keyLastPayoutInfo () = "%s__lastPayoutInfo"
193-
194-
195-func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
196-
197-
198-func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
199-
200-
201-func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
202-
203-
204-func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
205-
206-
207-func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
208-
209-
210-func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
211169
212170
213171 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
214172
215173
216174 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
217175
218176 func keyTradingRewardHistory (user,i) = makeString(["%s%s%s%s", "tradingReward", "history", user, toBase58String(i.transactionId)], SEP)
219177
220178
221179 func keyTradingReward (userAddress) = makeString(["%s%s", "tradingReward", userAddress], SEP)
222180
223181
224182 func keyMaxRecipients () = makeString(["%s", "maxRecipients"], SEP)
225183
226184
227185 func HistoryEntry (type,user,amount,i) = {
228186 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
229187 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
230188 StringEntry(historyKEY, historyDATA)
231189 }
232190
233191
234192 func keyManagerPublicKey () = "%s__managerPublicKey"
235193
236194
237195 func keyManagerVaultAddress () = "%s__managerVaultAddress"
238196
239197
240198 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
241199 case s: String =>
242200 addressFromStringValue(s)
243201 case _ =>
244202 this
245203 }
246204
247205
248206 func managerPublicKeyOrUnit () = {
249207 let managerVaultAddress = getManagerVaultAddressOrThis()
250208 match getString(managerVaultAddress, keyManagerPublicKey()) {
251209 case s: String =>
252210 fromBase58String(s)
253211 case _: Unit =>
254212 unit
255213 case _ =>
256214 throw("Match error")
257215 }
258216 }
259217
260218
261219 func mustManager (i) = {
262220 let pd = throw("Permission denied")
263221 match managerPublicKeyOrUnit() {
264222 case pk: ByteVector =>
265223 if ((i.callerPublicKey == pk))
266224 then true
267225 else pd
268226 case _: Unit =>
269227 if ((i.caller == this))
270228 then true
271229 else pd
272230 case _ =>
273231 throw("Match error")
274232 }
275233 }
276234
277235
278-func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
279- let kLast = keyLastProcessedPeriodOfUser(userIndex)
280- let kKey = keyUserKValueForPeriod(period, userIndex)
281- let kRaw = getInteger(boostingContractAddress, kKey)
282- let kUserWeight = keyUserWeightForPeriod(period, userIndex)
283- if (isDefined(kRaw))
284- then {
285- let k = value(kRaw)
286- let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
287- let w = ((k * heightForPeriod) + b)
288- if ((w > 0))
289- then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
290- else $Tuple2(0, nil)
291- }
292- else {
293- let p = getInteger(this, kLast)
294- if (if (isDefined(p))
295- then (period >= value(p))
296- else false)
297- then {
298- let pv = value(p)
299- let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
300- let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
301- let w = ((k * heightForPeriod) + b)
302- if ((w > 0))
303- then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
304- else $Tuple2(0, nil)
305- }
306- else $Tuple2(0, nil)
307- }
308- }
309-
310-
311-func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
312- let kUserWeight = keyUserWeightForPeriod(period, userIndex)
313- let userWeightOrUnit = getInteger(kUserWeight)
314- match userWeightOrUnit {
315- case _: Unit =>
316- 0
317- case w: Int =>
318- (w / SCALE)
319- case _ =>
320- throw("Match error")
321- }
322- }
323-
324-
325236 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
326237 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
327238 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
328239 }
329240
330241
331-func nextPeriod () = getNumberByKey(keyNextPeriod())
242+func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
332243
333244
334-func commonClaimReward (userAddress) = {
335- let cfgArray = readConfigArrayOrFail()
336- let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
337- let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
338- match userUnclaimedOption {
245+func keyRewardPerGwxIntegral () = makeString(["%s", "rewardPerGwxIntegral"], SEP)
246+
247+
248+func _refreshRewardPerGwxIntegral () = {
249+ let rewardPerGwxIntegralPrevious = valueOrElse( match getString(this, keyRewardPerGwxIntegral()) {
250+ case s: String =>
251+ parseBigInt(s)
339252 case _: Unit =>
340- $Tuple2(0, nil)
341- case u: Int =>
342- $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
253+ unit
254+ case _ =>
255+ throw("Match error")
256+ }, zeroBigInt)
257+ let rewardPerGwxIntegralLastHeight = valueOrErrorMessage(getInteger(this, keyGwxRewardEmissionStartHeight()), wrapErr(("invalid " + keyGwxRewardEmissionStartHeight())))
258+ let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), wrapErr(("invalid " + keyRatePerBlockCurrent())))
259+ 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+ }
266+ let dh = toBigInt((height - rewardPerGwxIntegralLastHeight))
267+ let gwxAmountTotalBI = toBigInt(gwxAmountTotal)
268+ let rewardPerGwxIntegral = (rewardPerGwxIntegralPrevious + (if ((gwxAmountTotalBI == zeroBigInt))
269+ then zeroBigInt
270+ else fraction(dh, ((toBigInt(emissionRate) * toBigInt(gwxHoldersRewardCurrent)) * MULT18BI), (gwxAmountTotalBI * MULT8BI))))
271+ $Tuple2([IntegerEntry(keyGwxRewardEmissionStartHeight(), height), StringEntry(keyRewardPerGwxIntegral(), toString(rewardPerGwxIntegral))], rewardPerGwxIntegral)
272+ }
273+
274+
275+func keyRewardPerGwxIntegralUserLast (userAddress) = makeString(["%s%s", "rewardPerGwxIntegralUserLast", toString(userAddress)], SEP)
276+
277+
278+func _refreshUserReward (userAddress,userNum) = {
279+ let $t097629850 = _refreshRewardPerGwxIntegral()
280+ let rewardPerGwxIntegralActions = $t097629850._1
281+ let rewardPerGwxIntegral = $t097629850._2
282+ let rewardPerGwxIntegralUserLast = match getString(this, keyRewardPerGwxIntegralUserLast(userAddress)) {
283+ case s: String =>
284+ valueOrErrorMessage(parseBigInt(s), wrapErr("invalid user last integral"))
285+ case _: Unit =>
286+ rewardPerGwxIntegral
343287 case _ =>
344288 throw("Match error")
345289 }
290+ let userIdxOption = getString(boostingContractOrFail(), keyUser2NumMapping(userAddress))
291+ 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+ }
298+ let userReward = (toInt(fraction(toBigInt(userGwxAmount), (rewardPerGwxIntegral - rewardPerGwxIntegralUserLast), MULT18BI)) + userUnclaimed)
299+ $Tuple2(([StringEntry(keyRewardPerGwxIntegralUserLast(userAddress), toString(rewardPerGwxIntegral))] ++ rewardPerGwxIntegralActions), userReward)
346300 }
347301
348302
349-func getTradingReward (userAddress) = valueOrElse(getInteger(this, keyTradingReward(userAddress)), 0)
303+func commonClaimReward (userAddressStr) = {
304+ let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
305+ let cfgArray = readConfigArrayOrFail()
306+ let userNum = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddressStr)
307+ let $t01118011244 = _refreshUserReward(userAddress, userNum)
308+ let actions = $t01118011244._1
309+ let reward = $t01118011244._2
310+ $Tuple2(reward, ([IntegerEntry(keyUserUnclaimed(userNum), 0)] ++ actions))
311+ }
312+
313+
314+@Callable(i)
315+func refreshUserReward (userAddressBytes,userNum) = {
316+ let checkCaller = if ((i.caller == boostingContractOrFail()))
317+ then true
318+ else throwErr("permission denied")
319+ if ((checkCaller == checkCaller))
320+ then {
321+ let $t01152411602 = _refreshUserReward(Address(userAddressBytes), userNum)
322+ let actions = $t01152411602._1
323+ let reward = $t01152411602._2
324+ $Tuple2(([IntegerEntry(keyUserUnclaimed(userNum), reward)] ++ actions), reward)
325+ }
326+ else throw("Strict value is not equal to itself.")
327+ }
328+
350329
351330
352331 @Callable(i)
353332 func tradeRewardInternal (paymentAmountLeftOver,userAddresses,rewards,currentIter) = if ((currentIter == size(userAddresses)))
354333 then nil
355334 else {
356335 let checks = [if ((i.caller == this))
357336 then true
358337 else throwErr("Permission denied"), if ((paymentAmountLeftOver >= rewards[currentIter]))
359338 then true
360339 else throwErr("insufficient payment assetId")]
361340 if ((checks == checks))
362341 then {
363342 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [(paymentAmountLeftOver - rewards[currentIter]), userAddresses, rewards, (currentIter + 1)], nil)
364343 if ((tradeRewardInternal == tradeRewardInternal))
365344 then {
366345 let tradingRewardHistoryKey = keyTradingRewardHistory(userAddresses[currentIter], i)
367346 let userAddress = addressFromStringValue(userAddresses[currentIter])
368347 $Tuple2([IntegerEntry(tradingRewardHistoryKey, rewards[currentIter]), IntegerEntry(keyTradingReward(userAddresses[currentIter]), rewards[currentIter])], tradeRewardInternal)
369348 }
370349 else throw("Strict value is not equal to itself.")
371350 }
372351 else throw("Strict value is not equal to itself.")
373352 }
374353
375354
376355
377356 @Callable(i)
378357 func updateReferralActivity (userAddress,gWxAmountStart) = {
379358 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
380359 let activeReferralInv = if ((referrer == unit))
381360 then unit
382361 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
383362 if ((activeReferralInv == activeReferralInv))
384363 then $Tuple2(nil, unit)
385364 else throw("Strict value is not equal to itself.")
386365 }
387366
388367
389368
390369 @Callable(i)
391-func finalizeHelper () = {
392- let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
393- let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
394- let currentUser = getNumberByKey(keyNextProcessedUser())
395- let latestPeriod = getNumberByKey(keyLatestPeriod())
396- let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
397- let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
398- let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
399- let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
400- if ((currentPeriod > latestPeriod))
401- then $Tuple2(nil, false)
402- else if ((processingStage == processingStageTotal))
403- then {
404- let $t01451014626 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
405- let userWeight = $t01451014626._1
406- let userActions = $t01451014626._2
407- let totalWeightNew = (totalWeight + userWeight)
408- let processingActions = if (((usersCount - 1) > currentUser))
409- then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
410- else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
411- $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
412- }
413- else if ((processingStage == processingStageShares))
414- then {
415- let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
416- let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
417- let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
418- let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
419- let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
420- let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
421- let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
422- let activeReferralInv = if ((referrer == unit))
423- then unit
424- else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
425- if ((activeReferralInv == activeReferralInv))
426- then {
427- let referralInv = if (if ((referrer == unit))
428- then true
429- else (referralMinGWxAmount > userWeight))
430- then unit
431- else {
432- let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
433- let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
434- invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
435- }
436- if ((referralInv == referralInv))
437- then {
438- let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
439- let processingActions = if (((usersCount - 1) > currentUser))
440- then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
441- else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
442- $Tuple2((unclaimedActions ++ processingActions), true)
443- }
444- else throw("Strict value is not equal to itself.")
445- }
446- else throw("Strict value is not equal to itself.")
447- }
448- else throw("invalid processing stage")
449- }
370+func processPendingPeriodsAndUsers () = $Tuple2(nil, throwErr("deprecated"))
450371
451372
452373
453374 @Callable(i)
454-func finalizeWrapper (counter) = {
455- let result = {
456- let @ = invoke(this, "finalizeHelper", nil, nil)
457- if ($isInstanceOf(@, "Boolean"))
458- then @
459- else throw(($getType(@) + " couldn't be cast to Boolean"))
460- }
461- if ((result == result))
462- then if (!(result))
463- then if ((counter == maxDepth))
464- then throw("Nothing to process")
465- else $Tuple2(nil, unit)
466- else if ((counter > 0))
467- then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
468- else $Tuple2(nil, unit)
469- else throw("Strict value is not equal to itself.")
470- }
471-
472-
473-
474-@Callable(i)
475-func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
476-
477-
478-
479-@Callable(i)
480-func deposit () = {
481- let checkCaller = if ((i.caller == votingEmissionContract))
375+func claimReward () = {
376+ let cfgArray = readConfigArrayOrFail()
377+ let userAddress = i.caller
378+ let userAddressStr = toString(userAddress)
379+ let $t01333413391 = commonClaimReward(userAddressStr)
380+ let amount = $t01333413391._1
381+ let actions = $t01333413391._2
382+ let checkAmount = if ((amount > 0))
482383 then true
483- else mustManager(i)
484- if ((checkCaller == checkCaller))
384+ else throw("nothing to claim")
385+ if ((checkAmount == checkAmount))
485386 then {
486- let period = nextPeriod()
487- let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
488- let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
489- let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
490- if ((gwxHoldersRewardCurrent == gwxHoldersRewardCurrent))
387+ let userGwxAmount = {
388+ let @ = invoke(boostingContractOrFail(), "getUserGwxAmount", [userAddressStr], nil)
389+ if ($isInstanceOf(@, "Int"))
390+ then @
391+ else throw(($getType(@) + " couldn't be cast to Int"))
392+ }
393+ let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddressStr))
394+ let activeReferralInv = if ((referrer == unit))
395+ then unit
396+ else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userGwxAmount >= referralMinGWxAmount)], nil)
397+ if ((activeReferralInv == activeReferralInv))
491398 then {
492- let auxAmount = fraction((deltaH * gwxHoldersRewardCurrent), emissionRate, MULT8)
493- let em = if ((auxAmount > 0))
494- then invoke(emissionContract, "emit", [auxAmount], nil)
495- else unit
496- if ((em == em))
399+ let referralInv = if (if ((referrer == unit))
400+ then true
401+ else (referralMinGWxAmount > userGwxAmount))
402+ then unit
403+ else {
404+ let referrerReward = fraction(amount, referrerRewardPermille, SCALE)
405+ let referralReward = fraction(amount, referralRewardPermille, SCALE)
406+ invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
407+ }
408+ if ((referralInv == referralInv))
497409 then {
498- let matcherPart = 0
499- let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
500- let gwxHoldersRewardUpdated = {
501- let @ = invoke(emissionContract, "gwxHoldersRewardUpdate", nil, nil)
502- if ($isInstanceOf(@, "Boolean"))
410+ let claimedReferral = {
411+ let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
412+ if ($isInstanceOf(@, "Int"))
503413 then @
504- else throw(($getType(@) + " couldn't be cast to Boolean"))
414+ else throw(($getType(@) + " couldn't be cast to Int"))
505415 }
506- if ((gwxHoldersRewardUpdated == gwxHoldersRewardUpdated))
416+ if ((claimedReferral == claimedReferral))
507417 then {
508- let totalReward = (matcherPart + auxAmount)
509- let actions = if (if ((totalReward == 0))
510- then !(gwxHoldersRewardUpdated)
511- else false)
512- then nil
513- 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)]
514- $Tuple2(actions, unit)
418+ let totalAmount = (amount + claimedReferral)
419+ $Tuple2(([ScriptTransfer(i.caller, amount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", userAddressStr, totalAmount, i)] ++ actions), totalAmount)
515420 }
516421 else throw("Strict value is not equal to itself.")
517422 }
518423 else throw("Strict value is not equal to itself.")
519424 }
520425 else throw("Strict value is not equal to itself.")
521426 }
522427 else throw("Strict value is not equal to itself.")
523428 }
524429
525430
526431
527432 @Callable(i)
528-func claimReward () = {
529- let cfgArray = readConfigArrayOrFail()
530- let address = toString(i.caller)
531- let $t01981519865 = commonClaimReward(address)
532- let amount = $t01981519865._1
533- let actions = $t01981519865._2
534- let checkAmount = if ((amount > 0))
535- then true
536- else throw("Nothing to claim")
537- if ((checkAmount == checkAmount))
538- then {
539- let amountFromEmission = 0
540- let claimedReferral = {
541- let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
542- if ($isInstanceOf(@, "Int"))
543- then @
544- else throw(($getType(@) + " couldn't be cast to Int"))
545- }
546- let totalAmount = (amount + claimedReferral)
547- $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
548- }
549- else throw("Strict value is not equal to itself.")
550- }
551-
552-
553-
554-@Callable(i)
555433 func claimRewardREADONLY (address) = {
556- let $t02043820488 = commonClaimReward(address)
557- let amount = $t02043820488._1
558- let actions = $t02043820488._2
434+ let $t01471814768 = commonClaimReward(address)
435+ let amount = $t01471814768._1
436+ let actions = $t01471814768._2
559437 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
560438 let totalAmount = (amount + referralUnclaimed)
561439 $Tuple2(nil, totalAmount)
562440 }
563441
564442
565443
566444 @Callable(i)
567-func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
568-
569-
570-
571-@Callable(i)
572-func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
573-
574-
575-
576-@Callable(i)
577-func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
578- let lockEndHeight = (lockStartHeight + lockDurationBlocks)
579- let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
580- let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
581- $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
582- }
583-
584-
585-
586-@Callable(i)
587-func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
588- let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
589- let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
590- $Tuple2(nil, [gWxAmountStart])
591- }
592-
593-
594-
595-@Callable(i)
596445 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
597446 then throw("permissions denied")
598447 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
599-
600-
601-
602-@Callable(i)
603-func latestPeriodEmissionRewardsREADONLY (address) = {
604- let period = nextPeriod()
605- $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
606- }
607-
608-
609-
610-@Callable(i)
611-func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
612- let nCoins = toBigInt(2)
613- let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
614- let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
615- let x1 = parseBigIntValue(x1BigIntStr)
616- let x2 = parseBigIntValue(x2BigIntStr)
617- let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
618- let s = (x1 + x2)
619- if ((s == zeroBigInt))
620- then $Tuple2(nil, toString(zeroBigInt))
621- else {
622- let ann = (amp * nCoins)
623- let arr = [0, 1, 2, 3, 4, 5, 6]
624- func calc (acc,cur) = {
625- let $t02312123148 = acc
626- let d = $t02312123148._1
627- let dPrev = $t02312123148._2
628- let found = $t02312123148._3
629- if ((found != unit))
630- then acc
631- else {
632- let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
633- let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
634- let dDiff = absBigInt((dNext - value(d)))
635- if ((targetPrecision >= dDiff))
636- then $Tuple3(dNext, d, cur)
637- else $Tuple3(dNext, d, unit)
638- }
639- }
640-
641- let $t02374623809 = {
642- let $l = arr
643- let $s = size($l)
644- let $acc0 = $Tuple3(s, unit, unit)
645- func $f0_1 ($a,$i) = if (($i >= $s))
646- then $a
647- else calc($a, $l[$i])
648-
649- func $f0_2 ($a,$i) = if (($i >= $s))
650- then $a
651- else throw("List size exceeds 7")
652-
653- $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)
654- }
655- let dNext = $t02374623809._1
656- let dPrev = $t02374623809._2
657- let found = $t02374623809._3
658- if ((found != unit))
659- then $Tuple2(nil, toString(dNext))
660- else {
661- let dDiff = absBigInt((dNext - value(dPrev)))
662- throw(("D calculation error, dDiff = " + toString(dDiff)))
663- }
664- }
665- }
666448
667449
668450
669451 @Callable(i)
670452 func tradeReward (userAddresses,rewards) = {
671453 let argsComparison = (size(userAddresses) == size(rewards))
672454 let maxRecipients = valueOrElse(getInteger(keyMaxRecipients()), 0)
673455 let payment = i.payments[0]
674456 let paymentAssetId = payment.assetId
675457 let paymentAmount = payment.amount
676458 let checks = [if ((maxRecipients >= size(userAddresses)))
677459 then true
678460 else throwErr("Too many recipients"), if (argsComparison)
679461 then true
680462 else throwErr("Arguments size mismatch"), if ((paymentAssetId == wxAssetId))
681463 then true
682464 else throwErr("Wrong asset payment")]
683465 if ((checks == checks))
684466 then {
685467 let tradeRewardInternal = invoke(this, "tradeRewardInternal", [paymentAmount, userAddresses, rewards, 0], nil)
686468 if ((tradeRewardInternal == tradeRewardInternal))
687469 then $Tuple2(nil, tradeRewardInternal)
688470 else throw("Strict value is not equal to itself.")
689471 }
690472 else throw("Strict value is not equal to itself.")
691473 }
692474
693475
694476
695477 @Callable(i)
696478 func claimTradingReward () = {
697479 let userAddress = i.caller
698480 let userAddressString = toString(userAddress)
699481 let reward = getTradingReward(userAddressString)
700482 if ((reward > 0))
701483 then $Tuple2([ScriptTransfer(userAddress, reward, wxAssetId), IntegerEntry(keyTradingReward(userAddressString), 0)], reward)
702484 else throwErr("nothing to claim")
703485 }
704486
705487
706488
707489 @Callable(i)
708490 func claimTradingRewardREADONLY (userAddress) = $Tuple2(nil, getTradingReward(userAddress))
709491
710492
711493 @Verifier(tx)
712494 func verify () = {
713495 let targetPublicKey = match managerPublicKeyOrUnit() {
714496 case pk: ByteVector =>
715497 pk
716498 case _: Unit =>
717499 tx.senderPublicKey
718500 case _ =>
719501 throw("Match error")
720502 }
721503 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
722504 }
723505

github/deemru/w8io/169f3d6 
75.23 ms