mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-05-08 09:18:39 +01:00
Fix large balance issues.
This commit is contained in:
committed by
Alex Hart
parent
3554f82ea3
commit
5e8d324860
@@ -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())
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
+5
-10
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user