Fix large balance issues.

This commit is contained in:
Cody Henthorne
2024-01-04 16:33:55 -05:00
committed by Alex Hart
parent 3554f82ea3
commit 5e8d324860
4 changed files with 28 additions and 27 deletions
@@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.payments.proto.MobileCoinLedger; import org.thoughtcrime.securesms.payments.proto.MobileCoinLedger;
import org.whispersystems.signalservice.api.payments.Money; import org.whispersystems.signalservice.api.payments.Money;
import java.math.BigInteger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -18,8 +19,8 @@ public final class MobileCoinLedgerWrapper {
private final Balance balance; private final Balance balance;
public MobileCoinLedgerWrapper(@NonNull MobileCoinLedger ledger) { public MobileCoinLedgerWrapper(@NonNull MobileCoinLedger ledger) {
Money.MobileCoin fullAmount = Money.picoMobileCoin(ledger.balance); Money.MobileCoin fullAmount = ledger.balance.size() > 0 ? Money.picoMobileCoin(new BigInteger(ledger.balance.toByteArray())) : Money.picoMobileCoin(ledger.deprecatedBalance);
Money.MobileCoin transferableAmount = Money.picoMobileCoin(ledger.transferableBalance); Money.MobileCoin transferableAmount = ledger.transferableBalance.size() > 0 ? Money.picoMobileCoin(new BigInteger(ledger.transferableBalance.toByteArray())) : Money.picoMobileCoin(ledger.deprecatedTransferableBalance);
this.ledger = ledger; this.ledger = ledger;
this.balance = new Balance(fullAmount, transferableAmount, ledger.asOfTimeStamp); this.balance = new Balance(fullAmount, transferableAmount, ledger.asOfTimeStamp);
@@ -54,7 +55,7 @@ public final class MobileCoinLedgerWrapper {
} }
public @NonNull Money.MobileCoin getValue() { public @NonNull Money.MobileCoin getValue() {
return Money.picoMobileCoin(ownedTXO.amount); return ownedTXO.amount.size() > 0 ? Money.picoMobileCoin(new BigInteger(ownedTXO.amount.toByteArray())) : Money.picoMobileCoin(ownedTXO.deprecatedAmount);
} }
public @NonNull ByteString getKeyImage() { public @NonNull ByteString getKeyImage() {
@@ -165,7 +165,7 @@ public final class Wallet {
for (OwnedTxOut txOut : accountSnapshot.getAccountActivity().getAllTokenTxOuts(TokenId.MOB)) { for (OwnedTxOut txOut : accountSnapshot.getAccountActivity().getAllTokenTxOuts(TokenId.MOB)) {
final Amount txOutAmount = txOut.getAmount(); final Amount txOutAmount = txOut.getAmount();
MobileCoinLedger.OwnedTXO.Builder txoBuilder = new MobileCoinLedger.OwnedTXO.Builder() MobileCoinLedger.OwnedTXO.Builder txoBuilder = new MobileCoinLedger.OwnedTXO.Builder()
.amount(Uint64Util.bigIntegerToUInt64(txOutAmount.getValue())) .amount(ByteString.of(txOutAmount.getValue().toByteArray()))
.receivedInBlock(getBlock(txOut.getReceivedBlockIndex(), txOut.getReceivedBlockTimestamp())) .receivedInBlock(getBlock(txOut.getReceivedBlockIndex(), txOut.getReceivedBlockTimestamp()))
.keyImage(ByteString.of(txOut.getKeyImage().getData())) .keyImage(ByteString.of(txOut.getKeyImage().getData()))
.publicKey(ByteString.of(txOut.getPublicKey().getKeyBytes())); .publicKey(ByteString.of(txOut.getPublicKey().getKeyBytes()));
@@ -198,8 +198,8 @@ public final class Wallet {
builder.spentTxos(spentTxos) builder.spentTxos(spentTxos)
.unspentTxos(unspentTxos) .unspentTxos(unspentTxos)
.balance(Uint64Util.bigIntegerToUInt64(totalUnspent)) .balance(ByteString.of(totalUnspent.toByteArray()))
.transferableBalance(Uint64Util.bigIntegerToUInt64(accountSnapshot.getTransferableAmount(minimumTxFee).getValue())) .transferableBalance(ByteString.of(accountSnapshot.getTransferableAmount(minimumTxFee).getValue().toByteArray()))
.asOfTimeStamp(asOfTimestamp) .asOfTimeStamp(asOfTimestamp)
.highestBlock(new MobileCoinLedger.Block.Builder() .highestBlock(new MobileCoinLedger.Block.Builder()
.blockNumber(highestBlockIndex.longValue()) .blockNumber(highestBlockIndex.longValue())
+16 -11
View File
@@ -8,11 +8,13 @@ option java_multiple_files = true;
message MobileCoinLedger { message MobileCoinLedger {
message OwnedTXO { message OwnedTXO {
uint64 amount = 1; uint64 deprecatedAmount = 1;
bytes keyImage = 2; bytes amount = 6;
bytes publicKey = 3; bytes keyImage = 2;
Block receivedInBlock = 4; bytes publicKey = 3;
Block spentInBlock = 5; Block receivedInBlock = 4;
Block spentInBlock = 5;
// Next is 7
} }
message Block { message Block {
@@ -20,12 +22,15 @@ message MobileCoinLedger {
uint64 timestamp = 2; uint64 timestamp = 2;
} }
uint64 balance = 1; uint64 deprecatedBalance = 1;
uint64 transferableBalance = 2; bytes balance = 7;
Block highestBlock = 3; uint64 deprecatedTransferableBalance = 2;
uint64 asOfTimeStamp = 4; bytes transferableBalance = 8;
repeated OwnedTXO spentTxos = 5; Block highestBlock = 3;
repeated OwnedTXO unspentTxos = 6; uint64 asOfTimeStamp = 4;
repeated OwnedTXO spentTxos = 5;
repeated OwnedTXO unspentTxos = 6;
// Next is 9
} }
message PaymentMetaData { message PaymentMetaData {
@@ -257,16 +257,11 @@ public final class LedgerReconcileTest {
if (mob.isNegative()) { if (mob.isNegative()) {
throw new AssertionError(); throw new AssertionError();
} }
MobileCoinLedger.OwnedTXO.Builder builder = new MobileCoinLedger.OwnedTXO.Builder() return new MobileCoinLedger.OwnedTXO.Builder()
.receivedInBlock(receivedBlock) .amount(ByteString.of(mob.toPicoMobBigInteger().toByteArray()))
.keyImage(keyImage) .receivedInBlock(receivedBlock)
.publicKey(publicKey); .keyImage(keyImage)
try { .publicKey(publicKey);
builder.amount(Uint64Util.bigIntegerToUInt64(mob.toPicoMobBigInteger()));
} catch (Uint64RangeException e) {
throw new AssertionError(e);
}
return builder;
} }
private static Payment payment(String note, Money.MobileCoin valueAndDirection, Set<ByteString> keyImages, Set<ByteString> publicKeys) { private static Payment payment(String note, Money.MobileCoin valueAndDirection, Set<ByteString> keyImages, Set<ByteString> publicKeys) {