tx · FWL2HwD6oRFLzo6F455UKyxYYhaPwpX4iTJF1DskdgTa

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.01800000 Waves

2023.04.17 15:15 [2538555] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "FWL2HwD6oRFLzo6F455UKyxYYhaPwpX4iTJF1DskdgTa", "fee": 1800000, "feeAssetId": null, "timestamp": 1681733768066, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "FkJYDpztZ2K6TrAmR11929pQCqxUNes5CRjxR2uUgEpx4AAPo4X2b3eXKMVPMQzrxFFTmeazbkG1tV27RSUzQ5i" ], "script": "base64:BgKXGggCEgQKAggBEgASAwoBARIAEgASABIDCgEIEgMKAQgSAwoBCBIFCgMBAQESBQoDAQEBEgASAwoBCBIHCgUICAgICBIDCgEIEgAiA1NFUCIFU0NBTEUiBU1VTFQ4Igp6ZXJvQmlnSW50IhRwcm9jZXNzaW5nU3RhZ2VUb3RhbCIVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzIg5nZXROdW1iZXJCeUtleSIDa2V5Ig9nZXROdW1iZXJPckZhaWwiDmdldFN0cmluZ0J5S2V5Ig9nZXRTdHJpbmdPckZhaWwiA2FicyIDdmFsIglhYnNCaWdJbnQiC2tleU1heERlcHRoIg9tYXhEZXB0aERlZmF1bHQiCG1heERlcHRoIhFrZXlGYWN0b3J5QWRkcmVzcyIRZmFjdG9yeUFkZHJlc3NTdHIiD2ZhY3RvcnlDb250cmFjdCISa2V5RW1pc3Npb25BZGRyZXNzIhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IhNrZXlOdW1Ub1VzZXJNYXBwaW5nIgNudW0iFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUiGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0IhNyZWZlcnJhbFByb2dyYW1OYW1lIhdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudCIbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0IhRyZWZlcnJhbE1pbkdXeEFtb3VudCIZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZSIdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQiFnJlZmVycmVyUmV3YXJkUGVybWlsbGUiGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUiHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0IhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlIgtrZXlSZWZlcnJlciIPcmVmZXJyYWxBZGRyZXNzIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILcHJvZ3JhbU5hbWUiDmNsYWltZXJBZGRyZXNzIhJlbWlzc2lvbkFkZHJlc3NTdHIiEGVtaXNzaW9uQ29udHJhY3QiDUlkeENmZ0Fzc2V0SWQiFklkeENmZ1BhY2VtYWtlckFkZHJlc3MiFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QiDklkeENmZ01heERlcHRoIglrZXlDb25maWciFXJlYWRDb25maWdBcnJheU9yRmFpbCIMZm9ybWF0Q29uZmlnIgx3eEFzc2V0SWRTdHIiGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyIhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0ciIWYm9vc3RpbmdDb250cmFjdE9yRmFpbCIIY2ZnQXJyYXkiH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQiDWtleVVzZXJzQ291bnQiFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQiGmtleUd3eEhvbGRlcnNSZXdhcmRDdXJyZW50IhdrZXlHd3hIb2xkZXJzUmV3YXJkTmV4dCIUa2V5UG9vbFdlaWdodFZpcnR1YWwiFGtleU5leHRQcm9jZXNzZWRVc2VyIg9rZXlMYXRlc3RQZXJpb2QiDWtleU5leHRQZXJpb2QiEmtleVByb2Nlc3NpbmdTdGFnZSIWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZCIQa2V5VXNlclVuY2xhaW1lZCIJdXNlckluZGV4IhtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIiHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIiEmtleUhlaWdodEZvclBlcmlvZCIGcGVyaW9kIh1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZCIXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QiEWtleUxhc3RQYXlvdXRJbmZvIhBQZXJpb2RQYXlvdXRJbmZvIg1tYXRjaGVyUmV3YXJkIg5lbWlzc2lvblJld2FyZCIUa2V5UGF5b3V0SGlzdG9yeUluZm8iF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kIhZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kIhZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kIhtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MiHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbCIMSGlzdG9yeUVudHJ5IgR0eXBlIgR1c2VyIgZhbW91bnQiAWkiCmhpc3RvcnlLRVkiC2hpc3RvcnlEQVRBIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCIHJG1hdGNoMCIBcyIdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQiC211c3RNYW5hZ2VyIgJwZCICcGsiDmNhbGNVc2VyV2VpZ2h0Ihdib29zdGluZ0NvbnRyYWN0QWRkcmVzcyIPaGVpZ2h0Rm9yUGVyaW9kIgVrTGFzdCIEa0tleSIEa1JhdyILa1VzZXJXZWlnaHQiAWsiAWIiAXciAXAiAnB2IhZjYWxjVXNlcldlaWdodEZvckNsYWltIhB1c2VyV2VpZ2h0T3JVbml0IhVnZXRVc2VySW5kZXhCeUFkZHJlc3MiC3VzZXJBZGRyZXNzIgpuZXh0UGVyaW9kIhFjb21tb25DbGFpbVJld2FyZCIHdXNlcklkeCITdXNlclVuY2xhaW1lZE9wdGlvbiIBdSIOZ1d4QW1vdW50U3RhcnQiCHJlZmVycmVyIhFhY3RpdmVSZWZlcnJhbEludiIPcHJvY2Vzc2luZ1N0YWdlIg1jdXJyZW50UGVyaW9kIgtjdXJyZW50VXNlciIMbGF0ZXN0UGVyaW9kIgp1c2Vyc0NvdW50Ig50b3RhbFdlaWdodEtleSILdG90YWxXZWlnaHQiDSR0MDEyNDE1MTI1MzEiCnVzZXJXZWlnaHQiC3VzZXJBY3Rpb25zIg50b3RhbFdlaWdodE5ldyIRcHJvY2Vzc2luZ0FjdGlvbnMiGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kIht1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QiD3VzZXJUb3RhbEFtb3VudCILcmVmZXJyYWxJbnYiDnJlZmVycmVyUmV3YXJkIg5yZWZlcnJhbFJld2FyZCIQdW5jbGFpbWVkQWN0aW9ucyIHY291bnRlciIGcmVzdWx0IgFAIgtjaGVja0NhbGxlciIGZGVsdGFIIgxlbWlzc2lvblJhdGUiF2d3eEhvbGRlcnNSZXdhcmRDdXJyZW50IglhdXhBbW91bnQiAmVtIgttYXRjaGVyUGFydCIKcGF5b3V0SW5mbyIWZ3d4SG9sZGVyc1Jld2FyZFVwZGF0ZSIHYWRkcmVzcyINJHQwMTc1MjUxNzU3NSIHYWN0aW9ucyILY2hlY2tBbW91bnQiEmFtb3VudEZyb21FbWlzc2lvbiIPY2xhaW1lZFJlZmVycmFsIgt0b3RhbEFtb3VudCINJHQwMTgxNDgxODE5OCIRcmVmZXJyYWxVbmNsYWltZWQiDmd3eEFtb3VudFN0YXJ0Ig9sb2NrU3RhcnRIZWlnaHQiEmxvY2tEdXJhdGlvbkJsb2NrcyINbG9ja0VuZEhlaWdodCIMc2NhbGU4UGFyYW1LIgxzY2FsZThQYXJhbUIiDHd4TG9ja0Ftb3VudCIMbG9ja0R1cmF0aW9uIg9tYXhMb2NrRHVyYXRpb24iB2NvZWZmWDgiC3gxQmlnSW50U3RyIgt4MkJpZ0ludFN0ciIMYW1wQmlnSW50U3RyIhNhUHJlY2lzaW9uQmlnSW50U3RyIhh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIiBm5Db2lucyIKYVByZWNpc2lvbiIPdGFyZ2V0UHJlY2lzaW9uIgJ4MSICeDIiA2FtcCIDYW5uIgNhcnIiBGNhbGMiA2FjYyIDY3VyIg0kdDAyMDgzMTIwODU4IgFkIgVkUHJldiIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiDSR0MDIxNDU2MjE1MTkiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleVMAAWECAl9fAAFiAOgHAAFjAIDC1y8AAWQJALYCAQAAAAFlAAAAAWYAAQEBZwEBaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFoAAABAWkBAWgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFoCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFoAg8gaXMgbm90IGRlZmluZWQBAWoBAWgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUBaAIAAQFrAQFoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUBaAkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBaAIPIGlzIG5vdCBkZWZpbmVkAQFsAQFtAwkAZgIAAAUBbQkBAS0BBQFtBQFtAQFuAQFtAwkAvwICBQFkBQFtCQC+AgEFAW0FAW0AAW8CDCVzX19tYXhEZXB0aAABcAAeAAFxCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAW8FAXABAXIAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAFzCQEBawEJAQFyAAABdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBcwEBdQACHSVzJXNfX2NvbmZpZ19fZW1pc3Npb25BZGRyZXNzAQF2AAkAuQkCCQDMCAICAiVzCQDMCAICFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QFA25pbAUBYQABdwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUBdAkBAXYAAQF4AQF5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQF5BQNuaWwFAWEAAXoJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICC3Byb2dyYW1OYW1lBQNuaWwFAWEAAUECBnd4bG9jawABQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQF6BQFBAAFDCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUBYQABRAkAaAIA9AMFAWMAAUUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBQwUBRAABRgkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQFhAAFHADIAAUgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBRgUBRwABSQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUDbmlsBQFhAAFKADIAAUsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBSQUBSgEBTAEBTQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBQFCCQDMCAIFAU0FA25pbAUBYQEBTgIBTwFQCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFAU8JAMwIAgUBUAUDbmlsBQFhAAFRCQEBawEJAQF1AAABUgkBEUBleHRyTmF0aXZlKDEwNjIpAQUBUQABUwABAAFUAAIAAVUAAwABVgAEAQFXAAIKJXNfX2NvbmZpZwEBWAAJALUJAgkBAWsBCQEBVwAFAWEBAVkEAVoCYWECYWIBcQkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAIFAVoJAMwIAgUCYWEJAMwIAgUCYWIJAMwIAgkApAMBBQFxBQNuaWwFAWEBAmFjAAQCYWQJAQFYAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYWQFAVUCKGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgbm90IGRlZmluZWQBAmFlAAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAECYWYAAg8lc19fbmV4dFVzZXJOdW0BAmFnAAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQJhaAACHyVzJXNfX2d3eEhvbGRlcnNSZXdhcmRfX2N1cnJlbnQBAmFpAAIcJXMlc19fZ3d4SG9sZGVyc1Jld2FyZF9fbmV4dAECYWoAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAECYWsAAhUlc19fbmV4dFByb2Nlc3NlZFVzZXIBAmFsAAIQJXNfX2xhdGVzdFBlcmlvZAECYW0AAg4lc19fbmV4dFBlcmlvZAECYW4AAhMlc19fcHJvY2Vzc2luZ1N0YWdlAQJhbwACFyVzX19uZXh0UHJvY2Vzc2VkUGVyaW9kAQJhcAECYXEJALkJAgkAzAgCAgQlcyVkCQDMCAICDXVzZXJVbmNsYWltZWQJAMwIAgkApAMBBQJhcQUDbmlsBQFhAQJhcgECYXEJALkJAgkAzAgCAhclcyVkX19uZXh0Q2xhaW1lZFBlcmlvZAkAzAgCCQCkAwEFAmFxBQNuaWwFAWEBAmFzAQJhcQkAuQkCCQDMCAICGSVzJWRfX2xhc3RQcm9jZXNzZWRQZXJpb2QJAMwIAgkApAMBBQJhcQUDbmlsBQFhAQJhdAECYXUJALkJAgkAzAgCAholcyVkX19zdGFydEhlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFAmF1BQNuaWwFAWEBAmF2AQJhdQkAuQkCCQDMCAICFyVzJWRfX2F1eEVtaXNzaW9uUmV3YXJkCQDMCAIJAKQDAQUCYXUFA25pbAUBYQECYXcBAmF1CQC5CQIJAMwIAgIaJXMlZF9fdG90YWxBbW91bnRGb3JQZXJpb2QJAMwIAgkApAMBBQJhdQUDbmlsBQFhAQJheAACEiVzX19sYXN0UGF5b3V0SW5mbwECYXkDAmF1AmF6AmFBCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQUCYXUJAMwIAgkApAMBBQJhegkAzAgCCQCkAwEFAmFBBQNuaWwFAWEBAmFCAQJhdQkAuQkCCQDMCAICGCVzJXMlZF9fcGF5b3V0c19faGlzdG9yeQkAzAgCCQCkAwEFAmF1BQNuaWwFAWEBAmFDAQJhdQkAuQkCCQDMCAICGiVzJWRfX3RvdGFsV2VpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUCYXUFA25pbAUBYQECYUQCAmF1AmFxCQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQJhcQkAzAgCAgFrCQDMCAIJAKQDAQUCYXUFA25pbAUBYQECYUUCAmF1AmFxCQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQJhcQkAzAgCAgFiCQDMCAIJAKQDAQUCYXUFA25pbAUBYQECYUYCAmF1AmFxCQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQJhcQkAzAgCAgZ3ZWlnaHQJAMwIAgkApAMBBQJhdQUDbmlsBQFhAQJhRwAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUBYQACYUgJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFrAQkBAmFHAAECYUkEAmFKAmFLAmFMAmFNBAJhTgkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFAmFKCQDMCAIFAmFLCQDMCAIJANgEAQgFAmFNDXRyYW5zYWN0aW9uSWQFA25pbAUBYQQCYU8JALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYUwFA25pbAUBYQkBC1N0cmluZ0VudHJ5AgUCYU4FAmFPAQJhUAACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJhUQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQECYVIABAJhUwkAoggBCQECYVAAAwkAAQIFAmFTAgZTdHJpbmcEAmFUBQJhUwkA2QQBBQJhVAMJAAECBQJhUwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJhVQAEAmFTCQCiCAEJAQJhUQADCQABAgUCYVMCBlN0cmluZwQCYVQFAmFTCQDZBAEFAmFUAwkAAQIFAmFTAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFWAQJhTQQCYVcJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQCYVMJAQJhUgADCQABAgUCYVMCCkJ5dGVWZWN0b3IEAmFYBQJhUwMJAAACCAUCYU0PY2FsbGVyUHVibGljS2V5BQJhWAYFAmFXAwkAAQIFAmFTAgRVbml0AwkAAAIIBQJhTQZjYWxsZXIFBHRoaXMGBQJhVwkAAgECC01hdGNoIGVycm9yAQJhWQQCYVoCYmECYXUCYXEEAmJiCQECYXMBBQJhcQQCYmMJAQJhRAIFAmF1BQJhcQQCYmQJAJoIAgUCYVoFAmJjBAJiZQkBAmFGAgUCYXUFAmFxAwkBCWlzRGVmaW5lZAEFAmJkBAJiZgkBBXZhbHVlAQUCYmQEAmJnCQEFdmFsdWUBCQCaCAIFAmFaCQECYUUCBQJhdQUCYXEEAmJoCQBkAgkAaAIFAmJmBQJiYQUCYmcDCQBmAgUCYmgAAAkAlAoCCQBpAgUCYmgFAWIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJiBQJhdQkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYmUFAmJoBQNuaWwJAJQKAgAABQNuaWwEAmJpCQCaCAIFBHRoaXMFAmJiAwMJAQlpc0RlZmluZWQBBQJiaQkAZwIFAmF1CQEFdmFsdWUBBQJiaQcEAmJqCQEFdmFsdWUBBQJiaQQCYmYJAQV2YWx1ZQEJAJoIAgUCYVoJAQJhRAIFAmJqBQJhcQQCYmcJAQV2YWx1ZQEJAJoIAgUCYVoJAQJhRQIFAmJqBQJhcQQCYmgJAGQCCQBoAgUCYmYFAmJhBQJiZwMJAGYCBQJiaAAACQCUCgIJAGkCBQJiaAUBYgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYmUFAmJoBQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBAmJrBAJhWgJiYQJhdQJhcQQCYmUJAQJhRgIFAmF1BQJhcQQCYmwJAJ8IAQUCYmUEAmFTBQJibAMJAAECBQJhUwIEVW5pdAAAAwkAAQIFAmFTAgNJbnQEAmJoBQJhUwkAaQIFAmJoBQFiCQACAQILTWF0Y2ggZXJyb3IBAmJtAgJhYgJibgQBaAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCHVzZXIybnVtCQDMCAIFAmJuBQNuaWwFAWEJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBQJhYgUBaAkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAUCYm4CLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUBaAECYm8ACQEBZwEJAQJhbQABAmJwAQJibgQCYWQJAQFYAAQCYnEJAQJibQIJAJEDAgUCYWQFAVUFAmJuBAJicgkAnwgBCQECYXABBQJicQQCYVMFAmJyAwkAAQIFAmFTAgRVbml0CQCUCgIAAAUDbmlsAwkAAQIFAmFTAgNJbnQEAmJzBQJhUwkAlAoCBQJicwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFwAQUCYnEAAAUDbmlsCQACAQILTWF0Y2ggZXJyb3IQAmFNARZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5AgJibgJidAQCYnUJAJ0IAgUCYUgJAQFMAQUCYm4EAmJ2AwkAAAIFAmJ1BQR1bml0BQR1bml0CQD8BwQFAmFIAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFAUIJAMwIAgUCYm4JAMwIAgkAZwIFAmJ0BQFFBQNuaWwFA25pbAMJAAACBQJidgUCYnYJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQ5maW5hbGl6ZUhlbHBlcgAEAmJ3CQELdmFsdWVPckVsc2UCCQCfCAEJAQJhbgAFAWUEAmJ4CQEBZwEJAQJhbwAEAmJ5CQEBZwEJAQJhawAEAmJ6CQEBZwEJAQJhbAAEAmJBCQELdmFsdWVPckVsc2UCCQCaCAIJAQJhYwAJAQJhZgAAAAQCYkIJAQJhQwEFAmJ4BAJiQwkBAWcBCQECYUMBBQJieAQCYmEJAQFnAQkBAmF0AQUCYngDCQBmAgUCYngFAmJ6CQCUCgIFA25pbAcDCQAAAgUCYncFAWUEAmJECQECYVkECQECYWMABQJiYQUCYngFAmJ5BAJiRQgFAmJEAl8xBAJiRggFAmJEAl8yBAJiRwkAZAIFAmJDBQJiRQQCYkgDCQBmAgkAZQIFAmJBAAEFAmJ5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWsACQBkAgUCYnkAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYW4ABQFmCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWsAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYkIFAmJHBQNuaWwFAmJIBQJiRgYDCQAAAgUCYncFAWYEAmJFCQECYmsECQECYWMABQJiYQUCYngFAmJ5BAJiSQkAawMJAQFnAQkBAmF3AQUCYngFAmJFBQJiQwQCYkoJAGsDCQEBZwEJAQJhdgEFAmJ4BQJiRQUCYkMEAmJLCQBkAgUCYkoFAmJJBAJicgkAnwgBCQECYXABBQJieQQCYm4JARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQJhYwAJAQF4AQUCYnkEAmJ1CQCdCAIFAmFICQEBTAEFAmJuBAJidgMJAAACBQJidQUEdW5pdAUEdW5pdAkA/AcEBQJhSAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBQFCCQDMCAIFAmJuCQDMCAIJAGcCBQJiRQUBRQUDbmlsBQNuaWwDCQAAAgUCYnYFAmJ2BAJiTAMDCQAAAgUCYnUFBHVuaXQGCQBmAgUBRQUCYkUFBHVuaXQEAmJNCQBrAwUCYksFAUgFAWIEAmJOCQBrAwUCYksFAUsFAWIJAPwHBAUCYUgCDGluY1VuY2xhaW1lZAkAzAgCBQFCCQDMCAIFAmJuCQDMCAIFAmJNCQDMCAIFAmJOBQNuaWwFA25pbAMJAAACBQJiTAUCYkwEAmJPCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXABBQJieQkAZAIJAQt2YWx1ZU9yRWxzZQIFAmJyAAAFAmJLBQNuaWwEAmJIAwkAZgIJAGUCBQJiQQABBQJieQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFrAAkAZAIFAmJ5AAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFvAAkAZAIFAmJ4AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhawAAAAkAzAgCCQELRGVsZXRlRW50cnkBCQECYW4ABQNuaWwJAJQKAgkAzggCBQJiTwUCYkgGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYaW52YWxpZCBwcm9jZXNzaW5nIHN0YWdlAmFNAQ9maW5hbGl6ZVdyYXBwZXIBAmJQBAJiUQoAAmJSCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAMJAAECBQJiUgIHQm9vbGVhbgUCYlIJAAIBCQCsAgIJAAMBBQJiUgIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQJiUQUCYlEDCQEBIQEFAmJRAwkAAAIFAmJQBQFxCQACAQISTm90aGluZyB0byBwcm9jZXNzCQCUCgIFA25pbAUEdW5pdAMJAGYCBQJiUAAACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgkAZQIFAmJQAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhTQEdcHJvY2Vzc1BlbmRpbmdQZXJpb2RzQW5kVXNlcnMACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgUBcQUDbmlsBQNuaWwCYU0BB2RlcG9zaXQABAJiUwMJAAACCAUCYU0GY2FsbGVyBQF3BgkBAmFWAQUCYU0DCQAAAgUCYlMFAmJTBAJhdQkBAmJvAAQCYlQJAGUCBQZoZWlnaHQJAQFpAQkBAmFlAAQCYlUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQFSCQECYWcACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBAmFnAAIPIGlzIG5vdCBkZWZpbmVkBAJiVgkBC3ZhbHVlT3JFbHNlAgkAmggCBQFSCQECYWgAAAAEAmJXCQBrAwkAaAIFAmJUBQJiVgUCYlUFAWMEAmJYCQD8BwQFAVICBGVtaXQJAMwIAgUCYlcFA25pbAUDbmlsAwkAAAIFAmJYBQJiWAQCYlkAAAQCYloJAQJheQMFAmF1BQJiWQUCYlcEAmNhCQD8BwQFAVICFmd3eEhvbGRlcnNSZXdhcmRVcGRhdGUFA25pbAUDbmlsAwkAAAIFAmNhBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFsAAUCYXUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAEFAmF1BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdgEFAmF1BQJiVwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFlAAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXcBBQJhdQUCYlkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhbQAJAGQCBQJhdQABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJheAAFAmJaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhQgEFAmF1BQJiWgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNAQtjbGFpbVJld2FyZAAEAmFkCQEBWAAEAmNiCQClCAEIBQJhTQZjYWxsZXIEAmNjCQECYnABBQJjYgQCYUwIBQJjYwJfMQQCY2QIBQJjYwJfMgQCY2UDCQBmAgUCYUwAAAYJAAIBAhBOb3RoaW5nIHRvIGNsYWltAwkAAAIFAmNlBQJjZQQCY2YAAAQCY2cKAAJiUgkA/AcEBQJhSAIFY2xhaW0JAMwIAgUBQgUDbmlsBQNuaWwDCQABAgUCYlICA0ludAUCYlIJAAIBCQCsAgIJAAMBBQJiUgIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJjaAkAZAIFAmFMBQJjZwkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmFNBmNhbGxlcgUCY2gJANkEAQkAkQMCBQJhZAUBUwkAzAgCCQECYUkEAgVjbGFpbQUCY2IFAmFMBQJhTQUDbmlsBQJjZAkAzAgCBQJjaAkAzAgCBQJjZgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFNARNjbGFpbVJld2FyZFJFQURPTkxZAQJjYgQCY2kJAQJicAEFAmNiBAJhTAgFAmNpAl8xBAJjZAgFAmNpAl8yBAJjagkBC3ZhbHVlT3JFbHNlAgkAmggCBQJhSAkBAU4CBQFCBQJjYgAABAJjaAkAZAIFAmFMBQJjagkAlAoCBQNuaWwFAmNoAmFNAR1sYXRlc3RGaW5hbGl6ZWRQZXJpb2RSRUFET05MWQECY2IJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJhbAAA////////////AQJhTQEhbGF0ZXN0RmluYWxpemVkUGVyaW9kSW5mb1JFQURPTkxZAQJjYgkAlAoCBQNuaWwJAQFqAQkBAmF4AAJhTQEVY2FsY0d3eFBhcmFtc1JFQURPTkxZAwJjawJjbAJjbQQCY24JAGQCBQJjbAUCY20EAmNvCQEBLQEJAGsDBQJjawUBYgUCY20EAmNwCQBoAgkAawMFAmNrBQFiBQJjbQUCY24JAJQKAgUDbmlsCQDMCAIFAmNvCQDMCAIFAmNwCQDMCAIJAQJibwAFA25pbAJhTQEaY2FsY0d3eEFtb3VudFN0YXJ0UkVBRE9OTFkDAmNxAmNyAmNzBAJjdAkAawMFAmNyBQFjBQJjcwQCYnQJAGsDBQJjcQUCY3QFAWMJAJQKAgUDbmlsCQDMCAIFAmJ0BQNuaWwCYU0BFW9uRW1pc3Npb25Gb3JHd3hTdGFydAADCQECIT0CCAUCYU0GY2FsbGVyBQF0CQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWUABQZoZWlnaHQFA25pbAJhTQEjbGF0ZXN0UGVyaW9kRW1pc3Npb25SZXdhcmRzUkVBRE9OTFkBAmNiBAJhdQkBAmJvAAkAlAoCBQNuaWwJAMwIAgkBAWcBCQECYXYBBQJhdQUDbmlsAmFNAQVjYWxjRAUCY3UCY3YCY3cCY3gCY3kEAmN6CQC2AgEAAgQCY0EJAKcDAQUCY3gEAmNCCQCnAwEFAmN5BAJjQwkApwMBBQJjdQQCY0QJAKcDAQUCY3YEAmNFCQC5AgIJAKcDAQUCY3cFAmNBBAJhVAkAtwICBQJjQwUCY0QDCQAAAgUCYVQFAWQJAJQKAgUDbmlsCQCmAwEFAWQEAmNGCQC5AgIFAmNFBQJjegQCY0cJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGBQNuaWwKAQJjSAICY0kCY0oEAmNLBQJjSQQCY0wIBQJjSwJfMQQCY00IBQJjSwJfMgQCY04IBQJjSwJfMwMJAQIhPQIFAmNOBQR1bml0BQJjSQQCY08JALoCAgkAuQICCQC5AgIFAmNMBQJjTAUCY0wJALkCAgkAuQICCQC5AgIFAmNDBQJjRAUCY3oFAmN6BAJjUAkAugICCQC5AgIJALcCAgkAugICCQC5AgIFAmNGBQJhVAUCY0EJALkCAgUCY08FAmN6BQJjTAkAtwICCQC6AgIJALkCAgkAuAICBQJjRgUCY0EFAmNMBQJjQQkAuQICCQC3AgIFAmN6CQC2AgEAAQUCY08EAmNRCQEBbgEJALgCAgUCY1AJAQV2YWx1ZQEFAmNMAwkAwAICBQJjQgUCY1EJAJUKAwUCY1AFAmNMBQJjSgkAlQoDBQJjUAUCY0wFBHVuaXQEAmNSCgACY1MFAmNHCgACY1QJAJADAQUCY1MKAAJjVQkAlQoDBQJhVAUEdW5pdAUEdW5pdAoBAmNWAgJjVwJjWAMJAGcCBQJjWAUCY1QFAmNXCQECY0gCBQJjVwkAkQMCBQJjUwUCY1gKAQJjWQICY1cCY1gDCQBnAgUCY1gFAmNUBQJjVwkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQJjWQIJAQJjVgIJAQJjVgIJAQJjVgIJAQJjVgIJAQJjVgIJAQJjVgIJAQJjVgIFAmNVAAAAAQACAAMABAAFAAYABwQCY1AIBQJjUgJfMQQCY00IBQJjUgJfMgQCY04IBQJjUgJfMwMJAQIhPQIFAmNOBQR1bml0CQCUCgIFA25pbAkApgMBBQJjUAQCY1EJAQFuAQkAuAICBQJjUAkBBXZhbHVlAQUCY00JAAIBCQCsAgICHUQgY2FsY3VsYXRpb24gZXJyb3IsIGREaWZmID0gCQCmAwEFAmNRAmFNAQpzZXRNYW5hZ2VyAQJjWgQCYlMJAQJhVgEFAmFNAwkAAAIFAmJTBQJiUwQCZGEJANkEAQUCY1oDCQAAAgUCZGEFAmRhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhUQAFAmNaBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYU0BDmNvbmZpcm1NYW5hZ2VyAAQCZGIJAQJhVQAEAmRjAwkBCWlzRGVmaW5lZAEFAmRiBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkYwUCZGMEAmRkAwkAAAIIBQJhTQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmRiBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkZAUCZGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFQAAkA2AQBCQEFdmFsdWUBBQJkYgkAzAgCCQELRGVsZXRlRW50cnkBCQECYVEABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmRlAQJkZgAEAmRnBAJhUwkBAmFSAAMJAAECBQJhUwIKQnl0ZVZlY3RvcgQCYVgFAmFTBQJhWAMJAAECBQJhUwIEVW5pdAgFAmRlD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJkZQlib2R5Qnl0ZXMJAJEDAggFAmRlBnByb29mcwAABQJkZzab7I8=", "height": 2538555, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HysWtk6dUsvdzxkuVcGbWUjnrSxBno7eeyrT6GxNJx4E Next: HKn9V4yTsYDfTX1CSF7rMjUJ6LY25TfvoRJZ16xuPL1A Diff:
OldNewDifferences
5050
5151 func keyEmissionAddress () = "%s%s__config__emissionAddress"
5252
53+
54+func keyVotingEmissionContract () = makeString(["%s", "votingEmissionContract"], SEP)
55+
56+
57+let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract()))
5358
5459 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5560
118123
119124
120125 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
126+
127+
128+func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
129+
130+
131+func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
121132
122133
123134 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
330341 then $Tuple2(nil, false)
331342 else if ((processingStage == processingStageTotal))
332343 then {
333- let $t01208212198 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
334- let userWeight = $t01208212198._1
335- let userActions = $t01208212198._2
344+ let $t01241512531 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
345+ let userWeight = $t01241512531._1
346+ let userActions = $t01241512531._2
336347 let totalWeightNew = (totalWeight + userWeight)
337348 let processingActions = if (((usersCount - 1) > currentUser))
338349 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
407418
408419 @Callable(i)
409420 func deposit () = {
410- let cfgArray = readConfigArrayOrFail()
411- if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
412- then throw("Wrong caller address")
413- else {
414- let assetId = value(value(i.payments[0]).assetId)
415- if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
416- then throw("Wrong payment asset")
417- else {
418- let period = nextPeriod()
419- let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
420- let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
421- let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
422- let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
423- let em = invoke(emissionContract, "emit", [auxAmount], nil)
424- if ((em == em))
425- then {
426- let matcherPart = value(i.payments[0]).amount
427- let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
428-[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)]
429- }
421+ let checkCaller = if ((i.caller == votingEmissionContract))
422+ then true
423+ else mustManager(i)
424+ if ((checkCaller == checkCaller))
425+ then {
426+ let period = nextPeriod()
427+ let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
428+ let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
429+ let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
430+ let auxAmount = fraction((deltaH * gwxHoldersRewardCurrent), emissionRate, MULT8)
431+ let em = invoke(emissionContract, "emit", [auxAmount], nil)
432+ if ((em == em))
433+ then {
434+ let matcherPart = 0
435+ let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
436+ let gwxHoldersRewardUpdate = invoke(emissionContract, "gwxHoldersRewardUpdate", nil, nil)
437+ if ((gwxHoldersRewardUpdate == gwxHoldersRewardUpdate))
438+ then [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)]
430439 else throw("Strict value is not equal to itself.")
431440 }
441+ else throw("Strict value is not equal to itself.")
432442 }
443+ else throw("Strict value is not equal to itself.")
433444 }
434445
435446
438449 func claimReward () = {
439450 let cfgArray = readConfigArrayOrFail()
440451 let address = toString(i.caller)
441- let $t01754017590 = commonClaimReward(address)
442- let amount = $t01754017590._1
443- let actions = $t01754017590._2
452+ let $t01752517575 = commonClaimReward(address)
453+ let amount = $t01752517575._1
454+ let actions = $t01752517575._2
444455 let checkAmount = if ((amount > 0))
445456 then true
446457 else throw("Nothing to claim")
463474
464475 @Callable(i)
465476 func claimRewardREADONLY (address) = {
466- let $t01816318213 = commonClaimReward(address)
467- let amount = $t01816318213._1
468- let actions = $t01816318213._2
477+ let $t01814818198 = commonClaimReward(address)
478+ let amount = $t01814818198._1
479+ let actions = $t01814818198._2
469480 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
470481 let totalAmount = (amount + referralUnclaimed)
471482 $Tuple2(nil, totalAmount)
532543 let ann = (amp * nCoins)
533544 let arr = [0, 1, 2, 3, 4, 5, 6]
534545 func calc (acc,cur) = {
535- let $t02084620873 = acc
536- let d = $t02084620873._1
537- let dPrev = $t02084620873._2
538- let found = $t02084620873._3
546+ let $t02083120858 = acc
547+ let d = $t02083120858._1
548+ let dPrev = $t02083120858._2
549+ let found = $t02083120858._3
539550 if ((found != unit))
540551 then acc
541552 else {
548559 }
549560 }
550561
551- let $t02147121534 = {
562+ let $t02145621519 = {
552563 let $l = arr
553564 let $s = size($l)
554565 let $acc0 = $Tuple3(s, unit, unit)
562573
563574 $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)
564575 }
565- let dNext = $t02147121534._1
566- let dPrev = $t02147121534._2
567- let found = $t02147121534._3
576+ let dNext = $t02145621519._1
577+ let dPrev = $t02145621519._2
578+ let found = $t02145621519._3
568579 if ((found != unit))
569580 then $Tuple2(nil, toString(dNext))
570581 else {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE = 1000
77
88 let MULT8 = 100000000
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let processingStageTotal = 0
1313
1414 let processingStageShares = 1
1515
1616 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1717
1818
1919 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2020
2121
2222 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2323
2424
2525 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2626
2727
2828 func abs (val) = if ((0 > val))
2929 then -(val)
3030 else val
3131
3232
3333 func absBigInt (val) = if ((zeroBigInt > val))
3434 then -(val)
3535 else val
3636
3737
3838 let keyMaxDepth = "%s__maxDepth"
3939
4040 let maxDepthDefault = 30
4141
4242 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
4343
4444 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4545
4646
4747 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4848
4949 let factoryContract = addressFromStringValue(factoryAddressStr)
5050
5151 func keyEmissionAddress () = "%s%s__config__emissionAddress"
5252
53+
54+func keyVotingEmissionContract () = makeString(["%s", "votingEmissionContract"], SEP)
55+
56+
57+let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract()))
5358
5459 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5560
5661
5762 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5863
5964 let referralProgramNameDefault = "wxlock"
6065
6166 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
6267
6368 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
6469
6570 let referralMinGWxAmountDefault = (500 * MULT8)
6671
6772 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6873
6974 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
7075
7176 let referrerRewardPermilleDefault = 50
7277
7378 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
7479
7580 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7681
7782 let referralRewardPermilleDefault = 50
7883
7984 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
8085
8186 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
8287
8388
8489 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
8590
8691
8792 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8893
8994 let emissionContract = addressFromStringValue(emissionAddressStr)
9095
9196 let IdxCfgAssetId = 1
9297
9398 let IdxCfgPacemakerAddress = 2
9499
95100 let IdxCfgBoostingContract = 3
96101
97102 let IdxCfgMaxDepth = 4
98103
99104 func keyConfig () = "%s__config"
100105
101106
102107 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
103108
104109
105110 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
106111
107112
108113 func boostingContractOrFail () = {
109114 let cfgArray = readConfigArrayOrFail()
110115 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
111116 }
112117
113118
114119 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
115120
116121
117122 func keyUsersCount () = "%s__nextUserNum"
118123
119124
120125 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
126+
127+
128+func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
129+
130+
131+func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
121132
122133
123134 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
124135
125136
126137 func keyNextProcessedUser () = "%s__nextProcessedUser"
127138
128139
129140 func keyLatestPeriod () = "%s__latestPeriod"
130141
131142
132143 func keyNextPeriod () = "%s__nextPeriod"
133144
134145
135146 func keyProcessingStage () = "%s__processingStage"
136147
137148
138149 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
139150
140151
141152 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
142153
143154
144155 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
145156
146157
147158 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
148159
149160
150161 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
151162
152163
153164 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
154165
155166
156167 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
157168
158169
159170 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
160171
161172
162173 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
163174
164175
165176 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
166177
167178
168179 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
169180
170181
171182 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
172183
173184
174185 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
175186
176187
177188 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
178189
179190
180191 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
181192
182193
183194 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
184195
185196 func HistoryEntry (type,user,amount,i) = {
186197 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
187198 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
188199 StringEntry(historyKEY, historyDATA)
189200 }
190201
191202
192203 func keyManagerPublicKey () = "%s__managerPublicKey"
193204
194205
195206 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
196207
197208
198209 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
199210 case s: String =>
200211 fromBase58String(s)
201212 case _: Unit =>
202213 unit
203214 case _ =>
204215 throw("Match error")
205216 }
206217
207218
208219 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
209220 case s: String =>
210221 fromBase58String(s)
211222 case _: Unit =>
212223 unit
213224 case _ =>
214225 throw("Match error")
215226 }
216227
217228
218229 func mustManager (i) = {
219230 let pd = throw("Permission denied")
220231 match managerPublicKeyOrUnit() {
221232 case pk: ByteVector =>
222233 if ((i.callerPublicKey == pk))
223234 then true
224235 else pd
225236 case _: Unit =>
226237 if ((i.caller == this))
227238 then true
228239 else pd
229240 case _ =>
230241 throw("Match error")
231242 }
232243 }
233244
234245
235246 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
236247 let kLast = keyLastProcessedPeriodOfUser(userIndex)
237248 let kKey = keyUserKValueForPeriod(period, userIndex)
238249 let kRaw = getInteger(boostingContractAddress, kKey)
239250 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
240251 if (isDefined(kRaw))
241252 then {
242253 let k = value(kRaw)
243254 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
244255 let w = ((k * heightForPeriod) + b)
245256 if ((w > 0))
246257 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
247258 else $Tuple2(0, nil)
248259 }
249260 else {
250261 let p = getInteger(this, kLast)
251262 if (if (isDefined(p))
252263 then (period >= value(p))
253264 else false)
254265 then {
255266 let pv = value(p)
256267 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
257268 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
258269 let w = ((k * heightForPeriod) + b)
259270 if ((w > 0))
260271 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
261272 else $Tuple2(0, nil)
262273 }
263274 else $Tuple2(0, nil)
264275 }
265276 }
266277
267278
268279 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
269280 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
270281 let userWeightOrUnit = getInteger(kUserWeight)
271282 match userWeightOrUnit {
272283 case _: Unit =>
273284 0
274285 case w: Int =>
275286 (w / SCALE)
276287 case _ =>
277288 throw("Match error")
278289 }
279290 }
280291
281292
282293 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
283294 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
284295 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
285296 }
286297
287298
288299 func nextPeriod () = getNumberByKey(keyNextPeriod())
289300
290301
291302 func commonClaimReward (userAddress) = {
292303 let cfgArray = readConfigArrayOrFail()
293304 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
294305 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
295306 match userUnclaimedOption {
296307 case _: Unit =>
297308 $Tuple2(0, nil)
298309 case u: Int =>
299310 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
300311 case _ =>
301312 throw("Match error")
302313 }
303314 }
304315
305316
306317 @Callable(i)
307318 func updateReferralActivity (userAddress,gWxAmountStart) = {
308319 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
309320 let activeReferralInv = if ((referrer == unit))
310321 then unit
311322 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
312323 if ((activeReferralInv == activeReferralInv))
313324 then $Tuple2(nil, unit)
314325 else throw("Strict value is not equal to itself.")
315326 }
316327
317328
318329
319330 @Callable(i)
320331 func finalizeHelper () = {
321332 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
322333 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
323334 let currentUser = getNumberByKey(keyNextProcessedUser())
324335 let latestPeriod = getNumberByKey(keyLatestPeriod())
325336 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
326337 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
327338 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
328339 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
329340 if ((currentPeriod > latestPeriod))
330341 then $Tuple2(nil, false)
331342 else if ((processingStage == processingStageTotal))
332343 then {
333- let $t01208212198 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
334- let userWeight = $t01208212198._1
335- let userActions = $t01208212198._2
344+ let $t01241512531 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
345+ let userWeight = $t01241512531._1
346+ let userActions = $t01241512531._2
336347 let totalWeightNew = (totalWeight + userWeight)
337348 let processingActions = if (((usersCount - 1) > currentUser))
338349 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
339350 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
340351 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
341352 }
342353 else if ((processingStage == processingStageShares))
343354 then {
344355 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
345356 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
346357 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
347358 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
348359 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
349360 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
350361 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
351362 let activeReferralInv = if ((referrer == unit))
352363 then unit
353364 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
354365 if ((activeReferralInv == activeReferralInv))
355366 then {
356367 let referralInv = if (if ((referrer == unit))
357368 then true
358369 else (referralMinGWxAmount > userWeight))
359370 then unit
360371 else {
361372 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
362373 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
363374 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
364375 }
365376 if ((referralInv == referralInv))
366377 then {
367378 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
368379 let processingActions = if (((usersCount - 1) > currentUser))
369380 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
370381 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
371382 $Tuple2((unclaimedActions ++ processingActions), true)
372383 }
373384 else throw("Strict value is not equal to itself.")
374385 }
375386 else throw("Strict value is not equal to itself.")
376387 }
377388 else throw("invalid processing stage")
378389 }
379390
380391
381392
382393 @Callable(i)
383394 func finalizeWrapper (counter) = {
384395 let result = {
385396 let @ = invoke(this, "finalizeHelper", nil, nil)
386397 if ($isInstanceOf(@, "Boolean"))
387398 then @
388399 else throw(($getType(@) + " couldn't be cast to Boolean"))
389400 }
390401 if ((result == result))
391402 then if (!(result))
392403 then if ((counter == maxDepth))
393404 then throw("Nothing to process")
394405 else $Tuple2(nil, unit)
395406 else if ((counter > 0))
396407 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
397408 else $Tuple2(nil, unit)
398409 else throw("Strict value is not equal to itself.")
399410 }
400411
401412
402413
403414 @Callable(i)
404415 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
405416
406417
407418
408419 @Callable(i)
409420 func deposit () = {
410- let cfgArray = readConfigArrayOrFail()
411- if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
412- then throw("Wrong caller address")
413- else {
414- let assetId = value(value(i.payments[0]).assetId)
415- if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
416- then throw("Wrong payment asset")
417- else {
418- let period = nextPeriod()
419- let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
420- let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
421- let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
422- let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
423- let em = invoke(emissionContract, "emit", [auxAmount], nil)
424- if ((em == em))
425- then {
426- let matcherPart = value(i.payments[0]).amount
427- let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
428-[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)]
429- }
421+ let checkCaller = if ((i.caller == votingEmissionContract))
422+ then true
423+ else mustManager(i)
424+ if ((checkCaller == checkCaller))
425+ then {
426+ let period = nextPeriod()
427+ let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
428+ let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
429+ let gwxHoldersRewardCurrent = valueOrElse(getInteger(emissionContract, keyGwxHoldersRewardCurrent()), 0)
430+ let auxAmount = fraction((deltaH * gwxHoldersRewardCurrent), emissionRate, MULT8)
431+ let em = invoke(emissionContract, "emit", [auxAmount], nil)
432+ if ((em == em))
433+ then {
434+ let matcherPart = 0
435+ let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
436+ let gwxHoldersRewardUpdate = invoke(emissionContract, "gwxHoldersRewardUpdate", nil, nil)
437+ if ((gwxHoldersRewardUpdate == gwxHoldersRewardUpdate))
438+ then [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)]
430439 else throw("Strict value is not equal to itself.")
431440 }
441+ else throw("Strict value is not equal to itself.")
432442 }
443+ else throw("Strict value is not equal to itself.")
433444 }
434445
435446
436447
437448 @Callable(i)
438449 func claimReward () = {
439450 let cfgArray = readConfigArrayOrFail()
440451 let address = toString(i.caller)
441- let $t01754017590 = commonClaimReward(address)
442- let amount = $t01754017590._1
443- let actions = $t01754017590._2
452+ let $t01752517575 = commonClaimReward(address)
453+ let amount = $t01752517575._1
454+ let actions = $t01752517575._2
444455 let checkAmount = if ((amount > 0))
445456 then true
446457 else throw("Nothing to claim")
447458 if ((checkAmount == checkAmount))
448459 then {
449460 let amountFromEmission = 0
450461 let claimedReferral = {
451462 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
452463 if ($isInstanceOf(@, "Int"))
453464 then @
454465 else throw(($getType(@) + " couldn't be cast to Int"))
455466 }
456467 let totalAmount = (amount + claimedReferral)
457468 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
458469 }
459470 else throw("Strict value is not equal to itself.")
460471 }
461472
462473
463474
464475 @Callable(i)
465476 func claimRewardREADONLY (address) = {
466- let $t01816318213 = commonClaimReward(address)
467- let amount = $t01816318213._1
468- let actions = $t01816318213._2
477+ let $t01814818198 = commonClaimReward(address)
478+ let amount = $t01814818198._1
479+ let actions = $t01814818198._2
469480 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
470481 let totalAmount = (amount + referralUnclaimed)
471482 $Tuple2(nil, totalAmount)
472483 }
473484
474485
475486
476487 @Callable(i)
477488 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
478489
479490
480491
481492 @Callable(i)
482493 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
483494
484495
485496
486497 @Callable(i)
487498 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
488499 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
489500 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
490501 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
491502 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
492503 }
493504
494505
495506
496507 @Callable(i)
497508 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
498509 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
499510 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
500511 $Tuple2(nil, [gWxAmountStart])
501512 }
502513
503514
504515
505516 @Callable(i)
506517 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
507518 then throw("permissions denied")
508519 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
509520
510521
511522
512523 @Callable(i)
513524 func latestPeriodEmissionRewardsREADONLY (address) = {
514525 let period = nextPeriod()
515526 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
516527 }
517528
518529
519530
520531 @Callable(i)
521532 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
522533 let nCoins = toBigInt(2)
523534 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
524535 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
525536 let x1 = parseBigIntValue(x1BigIntStr)
526537 let x2 = parseBigIntValue(x2BigIntStr)
527538 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
528539 let s = (x1 + x2)
529540 if ((s == zeroBigInt))
530541 then $Tuple2(nil, toString(zeroBigInt))
531542 else {
532543 let ann = (amp * nCoins)
533544 let arr = [0, 1, 2, 3, 4, 5, 6]
534545 func calc (acc,cur) = {
535- let $t02084620873 = acc
536- let d = $t02084620873._1
537- let dPrev = $t02084620873._2
538- let found = $t02084620873._3
546+ let $t02083120858 = acc
547+ let d = $t02083120858._1
548+ let dPrev = $t02083120858._2
549+ let found = $t02083120858._3
539550 if ((found != unit))
540551 then acc
541552 else {
542553 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
543554 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
544555 let dDiff = absBigInt((dNext - value(d)))
545556 if ((targetPrecision >= dDiff))
546557 then $Tuple3(dNext, d, cur)
547558 else $Tuple3(dNext, d, unit)
548559 }
549560 }
550561
551- let $t02147121534 = {
562+ let $t02145621519 = {
552563 let $l = arr
553564 let $s = size($l)
554565 let $acc0 = $Tuple3(s, unit, unit)
555566 func $f0_1 ($a,$i) = if (($i >= $s))
556567 then $a
557568 else calc($a, $l[$i])
558569
559570 func $f0_2 ($a,$i) = if (($i >= $s))
560571 then $a
561572 else throw("List size exceeds 7")
562573
563574 $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)
564575 }
565- let dNext = $t02147121534._1
566- let dPrev = $t02147121534._2
567- let found = $t02147121534._3
576+ let dNext = $t02145621519._1
577+ let dPrev = $t02145621519._2
578+ let found = $t02145621519._3
568579 if ((found != unit))
569580 then $Tuple2(nil, toString(dNext))
570581 else {
571582 let dDiff = absBigInt((dNext - value(dPrev)))
572583 throw(("D calculation error, dDiff = " + toString(dDiff)))
573584 }
574585 }
575586 }
576587
577588
578589
579590 @Callable(i)
580591 func setManager (pendingManagerPublicKey) = {
581592 let checkCaller = mustManager(i)
582593 if ((checkCaller == checkCaller))
583594 then {
584595 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
585596 if ((checkManagerPublicKey == checkManagerPublicKey))
586597 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
587598 else throw("Strict value is not equal to itself.")
588599 }
589600 else throw("Strict value is not equal to itself.")
590601 }
591602
592603
593604
594605 @Callable(i)
595606 func confirmManager () = {
596607 let pm = pendingManagerPublicKeyOrUnit()
597608 let hasPM = if (isDefined(pm))
598609 then true
599610 else throw("No pending manager")
600611 if ((hasPM == hasPM))
601612 then {
602613 let checkPM = if ((i.callerPublicKey == value(pm)))
603614 then true
604615 else throw("You are not pending manager")
605616 if ((checkPM == checkPM))
606617 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
607618 else throw("Strict value is not equal to itself.")
608619 }
609620 else throw("Strict value is not equal to itself.")
610621 }
611622
612623
613624 @Verifier(tx)
614625 func verify () = {
615626 let targetPublicKey = match managerPublicKeyOrUnit() {
616627 case pk: ByteVector =>
617628 pk
618629 case _: Unit =>
619630 tx.senderPublicKey
620631 case _ =>
621632 throw("Match error")
622633 }
623634 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
624635 }
625636

github/deemru/w8io/03bedc9 
72.95 ms