Skip to content

Commit

Permalink
Fixed TokenAmount division algo
Browse files Browse the repository at this point in the history
  • Loading branch information
krzlabrdx committed Aug 12, 2024
1 parent e7e527a commit 93900b5
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 31 deletions.
14 changes: 1 addition & 13 deletions src/RadixDlt.NetworkGateway.Abstractions/Numerics/TokenAmount.cs
Original file line number Diff line number Diff line change
Expand Up @@ -289,20 +289,8 @@ private static TokenAmount Divide(TokenAmount dividend, TokenAmount divisor)

var doublePrecisionDividendSubUnits = dividend._subUnits * _divisor;
var divisorSubUnits = divisor._subUnits;
var doublePrecisionResult = doublePrecisionDividendSubUnits / divisorSubUnits;

var decimalIndexFromEnd = DecimalPrecision;
var digitCount = CountDigits(doublePrecisionResult);

while (decimalIndexFromEnd > 0 && (doublePrecisionResult % 10) == 0)
{
decimalIndexFromEnd--;
doublePrecisionResult /= 10;
digitCount--;
}

// TODO this is wrong! we must
return FromSubUnits(doublePrecisionResult);
return FromSubUnits(doublePrecisionDividendSubUnits / divisorSubUnits);
}

// Is there a faster approach that works with BigIntegers?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1593,9 +1593,7 @@ LIMIT 1

if (entry.UnitTotalSupply > TokenAmount.Zero)
{
// amount = (TokenAmount.OneFullUnit / entry.UnitTotalSupply) * TokenAmount.FromSubUnitsString();
// var a = BigInteger.Parse(row.Amount).DivideAndReturnDouble(BigInteger.Parse(row.UnitTotalSupply));
// amount = TokenAmount.FromSubUnits(a);
amount = TokenAmount.FromSubUnitsString(row.Amount) / entry.UnitTotalSupply;
}

entry.Items.Add(new UnitRedemptionValue((EntityAddress)row.ResourceAddress, amount));
Expand All @@ -1604,9 +1602,6 @@ LIMIT 1
return result;
}

// RB: 100000000000000000000
// TS: 141421356237309504881

// todo naive implementation only
private async Task<IDictionary<EntityAddress, GatewayModel.NativeResourceDetails>> GetNativeResourceDetails(ICollection<Entity> entities, GatewayModel.LedgerState ledgerState, CancellationToken token)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
using RadixDlt.NetworkGateway.Abstractions.Numerics;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using Xunit;

Expand Down Expand Up @@ -215,21 +216,30 @@ public void GivenTokenAmount_IsNaN_ReturnsCorrectly(TokenAmount tokenAmount, boo
tokenAmount.IsNaN().Should().Be(expectedIsNaN);
}

[Fact]
public void Abc()
[Theory]
[InlineData("1", "1", "1")]
[InlineData("100", "10", "10")]
[InlineData("32", "4", "8")]
[InlineData("5000000000", "0.2", "25000000000")]
[InlineData("5000000000", "0.00005", "100000000000000")]
public void Divide_ExactValue(string dividend, string divisor, string expected)
{
var one = TokenAmount.OneFullUnit;
var totalSupply = TokenAmount.FromSubUnitsString("141421356237309504881");
var resourceBalance = TokenAmount.FromSubUnitsString("100000000000000000000");
var result = TokenAmount.FromDecimalString(dividend) / TokenAmount.FromDecimalString(divisor);

var div = resourceBalance / totalSupply;
var mul = one * div;
result.ToString().Should().Be(expected);
}

var divString = div.GetSubUnits().ToString();
var mulString = mul.GetSubUnits().ToString();
[Theory]
[InlineData("141", "100", "1.410")]
[InlineData("100", "141", "0.709")]
[InlineData("100", "33", "3.030")]
[InlineData("50000000000", "0.123456789", "405000003685")]
public void Divide_ApproximateValue(string dividend, string divisor, string expected)
{
var result = TokenAmount.FromDecimalString(dividend) / TokenAmount.FromDecimalString(divisor);
var resultAsNumber = decimal.Parse(result.ToString(), NumberFormatInfo.InvariantInfo);
var expectedAsNumber = decimal.Parse(expected, NumberFormatInfo.InvariantInfo);

// TODO fix me
dsadasdsa
"a".Should().Be("a");
resultAsNumber.Should().BeApproximately(expectedAsNumber, 100);
}
}

0 comments on commit 93900b5

Please sign in to comment.