public override GetWelfareRewardAmountSampleOutput GetWelfareRewardAmountSample( GetWelfareRewardAmountSampleInput input) { const long sampleAmount = 10000; var welfareHash = State.WelfareHash.Value; var output = new GetWelfareRewardAmountSampleOutput(); var welfareScheme = State.ProfitContract.GetScheme.Call(welfareHash); var releasedInformation = State.ProfitContract.GetDistributedProfitsInfo.Call( new SchemePeriod { SchemeId = welfareHash, Period = welfareScheme.CurrentPeriod.Sub(1) }); var totalShares = releasedInformation.TotalShares; if (totalShares == 0) { return(new GetWelfareRewardAmountSampleOutput()); } var totalAmount = releasedInformation.ProfitsAmount; foreach (var lockTime in input.Value) { var shares = GetVotesWeight(sampleAmount, lockTime); output.Value.Add(totalAmount[Context.Variables.NativeSymbol].Mul(shares).Div(totalShares)); } return(output); }
public override GetWelfareRewardAmountSampleOutput GetWelfareRewardAmountSample( GetWelfareRewardAmountSampleInput input) { const long sampleAmount = 10000; var welfareHash = State.WelfareHash.Value; var output = new GetWelfareRewardAmountSampleOutput(); var welfareScheme = State.ProfitContract.GetScheme.Call(welfareHash); var releasedInformation = State.ProfitContract.GetDistributedProfitsInfo.Call( new SchemePeriod { SchemeId = welfareHash, Period = welfareScheme.CurrentPeriod.Sub(1) }); var totalShares = releasedInformation.TotalShares; if (totalShares == 0) { return(new GetWelfareRewardAmountSampleOutput()); } var totalAmount = releasedInformation.AmountsMap; foreach (var lockTime in input.Value) { var shares = GetVotesWeight(sampleAmount, lockTime); // In case of arithmetic overflow var decimalAmount = (decimal)totalAmount[Context.Variables.NativeSymbol]; var decimalShares = (decimal)shares; var decimalTotalShares = (decimal)totalShares; var amount = decimalAmount * decimalShares / decimalTotalShares; output.Value.Add((long)amount); } return(output); }