Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Align on latest eclair-core #215

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ dependencies {
exclude group: 'ch.qos.logback'
}
// eclair core
implementation 'fr.acinq.eclair:eclair-core_2.11:0.3.3-android'
implementation 'fr.acinq.eclair:eclair-core_2.11:0.3.4-android-SNAPSHOT'
// database orm
implementation 'org.greenrobot:greendao:3.2.2'
// required for greendao encryption, disabled for now
Expand Down
49 changes: 28 additions & 21 deletions app/src/main/java/fr/acinq/eclair/wallet/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
import fr.acinq.eclair.blockchain.electrum.ElectrumWallet;
import fr.acinq.eclair.channel.*;
import fr.acinq.eclair.io.Peer;
import fr.acinq.eclair.package$;
import fr.acinq.eclair.payment.PaymentInitiator;
import fr.acinq.eclair.payment.PaymentLifecycle;
import fr.acinq.eclair.payment.PaymentRequest;
import fr.acinq.eclair.router.RouteParams;
Expand All @@ -61,6 +61,7 @@
import fr.acinq.eclair.wallet.events.*;
import fr.acinq.eclair.wallet.services.CheckElectrumWorker;
import fr.acinq.eclair.wallet.utils.Constants;
import fr.acinq.eclair.wallet.utils.TechnicalHelper;
import fr.acinq.eclair.wallet.utils.WalletUtils;
import okhttp3.*;
import org.greenrobot.eventbus.EventBus;
Expand All @@ -71,12 +72,13 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spongycastle.crypto.digests.SHA256Digest;

import scala.Option;
import scala.Symbol;
import scala.Tuple2;
import scala.collection.Iterable;
import scala.collection.Iterator;
import scala.collection.Seq;
import scala.collection.Seq$;
import scala.concurrent.Await;
import scala.concurrent.Future;
import scala.concurrent.duration.Duration;
Expand All @@ -91,7 +93,6 @@
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

Expand Down Expand Up @@ -279,24 +280,32 @@ public PaymentRequest generatePaymentRequest(final String description, final Opt
* If false, can lead the user to pay a lot of fees.
*/
public void sendLNPayment(final PaymentRequest paymentRequest, final long amountMsat, final boolean checkFees) {
final Long finalCltvExpiry = paymentRequest.minFinalCltvExpiry().isDefined() && paymentRequest.minFinalCltvExpiry().get() instanceof Long
? (Long) paymentRequest.minFinalCltvExpiry().get()
: (Long) Channel.MIN_CLTV_EXPIRY();
final long finalCltvExpiry = paymentRequest.minFinalCltvExpiryDelta().getOrElse(new TechnicalHelper.OrElse<>(Channel.MIN_CLTV_EXPIRY_DELTA().toInt()));

final Option<RouteParams> routeParams = checkFees
? Option.apply(null) // when fee protection is enabled, use the default RouteParams with reasonable values
: Option.apply(RouteParams.apply( // otherwise, let's build a "no limit" RouteParams
false, // never randomize on mobile
fr.acinq.bitcoin.package$.MODULE$.millibtc2millisatoshi(new MilliBtc(BigDecimal.exact(1))).amount(), // at most 1mBTC base fee
MilliSatoshi.toMilliSatoshi(new MilliBtc(BigDecimal.exact(1))), // at most 1mBTC base fee
1d, // at most 100%
4,
Router.DEFAULT_ROUTE_MAX_CLTV(),
Option.empty()));

log.info("(lightning) sending {} msat for invoice {}", amountMsat, paymentRequest.toString());
appKit.eclairKit.paymentInitiator().tell(new PaymentLifecycle.SendPayment(
amountMsat, paymentRequest.paymentHash(), paymentRequest.nodeId(), paymentRequest.routingInfo(),
finalCltvExpiry + 1, 10, routeParams), ActorRef.noSender());
PaymentInitiator.SendPaymentRequest spr = new PaymentInitiator.SendPaymentRequest(
new MilliSatoshi(amountMsat),
paymentRequest.paymentHash(),
paymentRequest.nodeId(),
10,
new CltvExpiryDelta((int) finalCltvExpiry + 1),
Option.apply(paymentRequest),
Option.apply(null),
Seq$.MODULE$.empty(),
paymentRequest.routingInfo(),
routeParams
);
appKit.eclairKit.paymentInitiator().tell(spr, ActorRef.noSender());
}

/**
Expand Down Expand Up @@ -390,9 +399,9 @@ public Satoshi getAvailableFundsAfterFees(final long feesPerKw) {
long available = 0;
Iterator<TxOut> it = tx_fee._1.txOut().iterator();
while (it.hasNext()) {
available += it.next().amount().amount();
available += it.next().amount().toLong();
}
available -= tx_fee._2.amount();
available -= tx_fee._2.toLong();
return new Satoshi(Math.max(0, available));
} catch (Exception e) {
log.error("could not retrieve max available funds after fees", e);
Expand Down Expand Up @@ -513,17 +522,15 @@ public String nodePublicKey() {
return appKit.eclairKit.nodeParams().privateKey().publicKey().toString();
}

public static long estimateSlowFees() {
return Globals.feeratesPerKB() != null && Globals.feeratesPerKB().get() != null ? Math.max(Globals.feeratesPerKB().get().blocks_72() / 1000, 3) : 3;
public long estimateSlowFees() {
return Math.max(appKit.eclairKit.nodeParams().onChainFeeConf().feeEstimator().getFeeratePerKb(72) / 1000, 3);
}

public static long estimateMediumFees() {
return Globals.feeratesPerKB() != null && Globals.feeratesPerKB().get() != null ? Math.max(Globals.feeratesPerKB().get().blocks_12() / 1000, estimateSlowFees()) : 18;
}
public long estimateMediumFees() {
return Math.max(appKit.eclairKit.nodeParams().onChainFeeConf().feeEstimator().getFeeratePerKb(12) / 1000, estimateSlowFees()); }

public static long estimateFastFees() {
return Globals.feeratesPerKB() != null && Globals.feeratesPerKB().get() != null ? Math.max(Globals.feeratesPerKB().get().blocks_2() / 1000, estimateMediumFees()) : 108;
}
public long estimateFastFees() {
return Math.max(appKit.eclairKit.nodeParams().onChainFeeConf().feeEstimator().getFeeratePerKb(2) / 1000, estimateMediumFees()); }

/**
* Asynchronously asks for the Lightning Network's channels count. Dispatch a {@link NetworkChannelsCountEvent} containing the channel count.
Expand Down Expand Up @@ -615,7 +622,7 @@ public Satoshi getOnchainBalance() {
// if electrum has not send any data, fetch last known onchain balance from DB
if (this.electrumState.get() == null
|| this.electrumState.get().confirmedBalance == null || this.electrumState.get().unconfirmedBalance == null) {
return fr.acinq.bitcoin.package$.MODULE$.millisatoshi2satoshi(new MilliSatoshi(dbHelper.getOnchainBalanceMsat()));
return (new MilliSatoshi(dbHelper.getOnchainBalanceMsat())).truncateToSatoshi();
} else {
final Satoshi confirmed = electrumState.get().confirmedBalance;
final Satoshi unconfirmed = electrumState.get().unconfirmedBalance;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import android.view.View;
import android.widget.Toast;
import com.google.common.base.Strings;
import fr.acinq.bitcoin.MilliSatoshi;
import fr.acinq.eclair.MilliSatoshi;
import fr.acinq.eclair.CoinUnit;
import fr.acinq.eclair.CoinUtils;
import fr.acinq.eclair.wallet.R;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,11 @@
import android.view.View;
import android.widget.Toast;
import com.google.common.base.Strings;
import fr.acinq.bitcoin.MilliSatoshi;
import fr.acinq.eclair.MilliSatoshi;
import fr.acinq.bitcoin.Satoshi;
import fr.acinq.eclair.CoinUnit;
import fr.acinq.eclair.CoinUtils;
import fr.acinq.eclair.Features;
import fr.acinq.eclair.Globals;
import fr.acinq.eclair.channel.*;
import fr.acinq.eclair.router.NORMAL$;
import fr.acinq.eclair.wallet.R;
Expand Down Expand Up @@ -219,7 +218,7 @@ private void setupView(final LocalChannel channel, @Nullable final ActorRef chan
if (channel.getRefundAtBlock() > 0) {
mBinding.closingRefundBlock.setValue(getString(R.string.channeldetails_refund_block_value,
NumberFormat.getInstance().format(channel.getRefundAtBlock()),
NumberFormat.getInstance().format(Globals.blockCount().get())));
NumberFormat.getInstance().format(app.appKit.eclairKit.nodeParams().currentBlockHeight())));
}
mBinding.closingRefundBlock.setVisibility(View.VISIBLE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.util.Strings;
import fr.acinq.bitcoin.MilliSatoshi;
import fr.acinq.eclair.MilliSatoshi;
import fr.acinq.bitcoin.package$;
import fr.acinq.eclair.blockchain.electrum.ElectrumClient;
import fr.acinq.eclair.blockchain.electrum.ElectrumWallet;
Expand Down Expand Up @@ -573,8 +573,8 @@ public void handleThrowableEvent(ThrowableFailureEvent event) {

private void updateBalance() {
final MilliSatoshi lightningBalance = NodeSupervisor.getChannelsBalance();
final MilliSatoshi walletBalance = app == null ? new MilliSatoshi(0) : package$.MODULE$.satoshi2millisatoshi(app.getOnchainBalance());
mBinding.balanceTotal.setAmountMsat(new MilliSatoshi(lightningBalance.amount() + walletBalance.amount()));
final MilliSatoshi walletBalance = app == null ? new MilliSatoshi(0) : MilliSatoshi.toMilliSatoshi(app.getOnchainBalance());
mBinding.balanceTotal.setAmountMsat(new MilliSatoshi(lightningBalance.toLong() + walletBalance.toLong()));
mBinding.balanceOnchain.setAmountMsat(walletBalance);
mBinding.balanceLightning.setAmountMsat(lightningBalance);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import com.google.android.gms.common.util.Strings;
import fr.acinq.bitcoin.MilliSatoshi;
import fr.acinq.eclair.MilliSatoshi;
import fr.acinq.eclair.CoinUnit;
import fr.acinq.eclair.CoinUtils;
import fr.acinq.eclair.wallet.R;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import java.text.NumberFormat;
import java.util.Date;

import fr.acinq.eclair.Globals;
import fr.acinq.eclair.blockchain.fee.FeeEstimator;
import fr.acinq.eclair.wallet.R;
import fr.acinq.eclair.wallet.databinding.ActivityNetworkInfosBinding;
import fr.acinq.eclair.wallet.events.NetworkChannelsCountEvent;
Expand Down Expand Up @@ -78,11 +78,12 @@ public void onRefresh() {
}

private void refreshData() {
Long currentBlockHeight = app.appKit.eclairKit.nodeParams().currentBlockHeight();
if (app.getBlockTimestamp() == 0) {
mBinding.blockCount.setValue(NumberFormat.getInstance().format(Globals.blockCount().get()));
mBinding.blockCount.setValue(NumberFormat.getInstance().format(currentBlockHeight));
} else {
mBinding.blockCount.setHtmlValue(getString(R.string.networkinfos_block,
NumberFormat.getInstance().format(Globals.blockCount().get()), // block height
NumberFormat.getInstance().format(currentBlockHeight), // block height
DateFormat.getDateTimeInstance().format(new Date(app.getBlockTimestamp() * 1000)))); // block timestamp
}

Expand All @@ -104,8 +105,8 @@ private void refreshData() {
} else {
mBinding.electrumAddress.setActionLabel(getString(R.string.networkinfos_electrum_address_change_custom));
}

mBinding.feeRate.setValue(NumberFormat.getInstance().format(Globals.feeratesPerKw().get().block_1()) + " sat/kw");
FeeEstimator feeEstimator = app.appKit.eclairKit.nodeParams().onChainFeeConf().feeEstimator();
mBinding.feeRate.setValue(NumberFormat.getInstance().format(feeEstimator.getFeeratePerKw(1)) + " sat/kw");
app.getNetworkChannelsCount();
mBinding.swipeRefresh.setRefreshing(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import androidx.fragment.app.FragmentManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import fr.acinq.bitcoin.MilliSatoshi;
import fr.acinq.eclair.MilliSatoshi;
import fr.acinq.bitcoin.Satoshi;
import fr.acinq.eclair.io.NodeURI;
import fr.acinq.eclair.io.Peer;
Expand Down
Loading