diff --git a/eclair-core/pom.xml b/eclair-core/pom.xml index bb1dd7b8..ebd89b9a 100644 --- a/eclair-core/pom.xml +++ b/eclair-core/pom.xml @@ -83,9 +83,9 @@ Mac - - mac - + + mac + https://bitcoin.org/bin/bitcoin-core-0.14.0/bitcoin-0.14.0-osx64.tar.gz diff --git a/eclair-core/src/main/resources/electrum/servers_regtest.json b/eclair-core/src/main/resources/electrum/servers_regtest.json index 14e4f385..265bf5ab 100644 --- a/eclair-core/src/main/resources/electrum/servers_regtest.json +++ b/eclair-core/src/main/resources/electrum/servers_regtest.json @@ -1,4 +1,10 @@ { - "127.0.0.1": {"t":"51001", "s":"51002"}, - "10.0.2.2": {"t":"51001", "s":"51002"} + "127.0.0.1": { + "t": "51001", + "s": "51002" + }, + "10.0.2.2": { + "t": "51001", + "s": "51002" + } } diff --git a/eclair-core/src/main/resources/electrum/servers_testnet.json b/eclair-core/src/main/resources/electrum/servers_testnet.json index f6d60f56..37b28aa8 100644 --- a/eclair-core/src/main/resources/electrum/servers_testnet.json +++ b/eclair-core/src/main/resources/electrum/servers_testnet.json @@ -1,5 +1,14 @@ { - "testnetnode.arihanc.com": {"t":"51001", "s":"51002"}, - "testnet.hsmiths.com": {"t":"53011", "s":"53012"}, - "electrum.akinbo.org": {"t":"51001", "s":"51002"} + "testnetnode.arihanc.com": { + "t": "51001", + "s": "51002" + }, + "testnet.hsmiths.com": { + "t": "53011", + "s": "53012" + }, + "electrum.akinbo.org": { + "t": "51001", + "s": "51002" + } } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/FSMDiagnosticActorLogging.scala b/eclair-core/src/main/scala/fr/acinq/eclair/FSMDiagnosticActorLogging.scala index f897312d..251001c4 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/FSMDiagnosticActorLogging.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/FSMDiagnosticActorLogging.scala @@ -8,8 +8,11 @@ import akka.event.{DiagnosticLoggingAdapter, LoggingAdapter} * See https://groups.google.com/forum/#!topic/akka-user/0CxR8CImr4Q */ trait FSMDiagnosticActorLogging[S, D] extends FSM[S, D] { + import akka.event.Logging._ + val diagLog: DiagnosticLoggingAdapter = akka.event.Logging(this) + def mdc(currentMessage: Any): MDC = emptyMDC override def log: LoggingAdapter = diagLog diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/Features.scala b/eclair-core/src/main/scala/fr/acinq/eclair/Features.scala index 3f3b15da..cbd995da 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/Features.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/Features.scala @@ -2,7 +2,6 @@ package fr.acinq.eclair import java.util.BitSet -import java.util.function.IntPredicate import fr.acinq.bitcoin.BinaryData @@ -20,14 +19,14 @@ object Features { * @param features feature bits * @return true if an initial dump of the routing table is requested */ - def initialRoutingSync(features: BitSet) : Boolean = features.get(INITIAL_ROUTING_SYNC_BIT_OPTIONAL) + def initialRoutingSync(features: BitSet): Boolean = features.get(INITIAL_ROUTING_SYNC_BIT_OPTIONAL) /** * * @param features feature bits * @return true if an initial dump of the routing table is requested */ - def initialRoutingSync(features: BinaryData) : Boolean = initialRoutingSync(BitSet.valueOf(features.reverse.toArray)) + def initialRoutingSync(features: BinaryData): Boolean = initialRoutingSync(BitSet.valueOf(features.reverse.toArray)) /** * Check that the features that we understand are correctly specified, and that there are no mandatory features that @@ -35,7 +34,7 @@ object Features { */ def areSupported(bitset: BitSet): Boolean = { // for now there is no mandatory feature bit, so we don't support features with any even bit set - for(i <- 0 until bitset.length() by 2) { + for (i <- 0 until bitset.length() by 2) { if (bitset.get(i)) return false } return true diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala b/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala index 0d0bc154..f9216564 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala @@ -57,8 +57,11 @@ case class NodeParams(extendedPrivateKey: ExtendedPrivateKey, object NodeParams { sealed trait WatcherType + object BITCOIND extends WatcherType + object BITCOINJ extends WatcherType + object ELECTRUM extends WatcherType /** diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala b/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala index ecfffe9e..07b28d0e 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala @@ -93,7 +93,7 @@ class Setup(datadir: File, overrideDefaults: Config = ConfigFactory.empty(), act } val stream = classOf[Setup].getResourceAsStream(addressesFile) val addresses = ElectrumClient.readServerAddresses(stream) - val electrumClient = system.actorOf(SimpleSupervisor.props(Props(new ElectrumClient(addresses)), "electrum-client", SupervisorStrategy.Resume)) + val electrumClient = system.actorOf(SimpleSupervisor.props(Props(new ElectrumClient(addresses)), "electrum-client", SupervisorStrategy.Resume)) Electrum(electrumClient) } @@ -190,10 +190,13 @@ class Setup(datadir: File, overrideDefaults: Config = ConfigFactory.empty(), act } + +// @formatter:off sealed trait Bitcoin case class Bitcoind(extendedBitcoinClient: ExtendedBitcoinClient) extends Bitcoin case class Bitcoinj(bitcoinjKit: BitcoinjKit) extends Bitcoin case class Electrum(electrumClient: ActorRef) extends Bitcoin +// @formatter:on case class Kit(nodeParams: NodeParams, system: ActorSystem, diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/UInt64.scala b/eclair-core/src/main/scala/fr/acinq/eclair/UInt64.scala index 7e057d63..0b93a92a 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/UInt64.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/UInt64.scala @@ -31,4 +31,5 @@ object UInt64 { implicit def longToUint64(l: Long) = UInt64(l) } + } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/api/JsonSerializers.scala b/eclair-core/src/main/scala/fr/acinq/eclair/api/JsonSerializers.scala index 3c4e13cb..7a770b35 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/api/JsonSerializers.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/api/JsonSerializers.scala @@ -1,7 +1,7 @@ package fr.acinq.eclair.api -import fr.acinq.bitcoin.{BinaryData, Script, ScriptElt, Transaction} import fr.acinq.bitcoin.Crypto.{Point, PrivateKey, PublicKey, Scalar} +import fr.acinq.bitcoin.{BinaryData, Transaction} import fr.acinq.eclair.channel.State import fr.acinq.eclair.crypto.ShaChain import fr.acinq.eclair.transactions.Transactions.TransactionWithInputInfo diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/api/Service.scala b/eclair-core/src/main/scala/fr/acinq/eclair/api/Service.scala index f2085664..0ee7a37f 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/api/Service.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/api/Service.scala @@ -95,7 +95,7 @@ trait Service extends Logging { (router ? 'nodes).mapTo[Iterable[NodeAnnouncement]].map(_.map(_.nodeId)) case JsonRPCBody(_, _, "allchannels", _) => (router ? 'channels).mapTo[Iterable[ChannelAnnouncement]].map(_.map(c => ChannelInfo(c.shortChannelId.toHexString, c.nodeId1, c.nodeId2))) - case JsonRPCBody(_,_, "receive", JInt(amountMsat) :: JString(description) :: Nil) => + case JsonRPCBody(_, _, "receive", JInt(amountMsat) :: JString(description) :: Nil) => (paymentHandler ? ReceivePayment(MilliSatoshi(amountMsat.toLong), description)).mapTo[PaymentRequest].map(PaymentRequest.write) case JsonRPCBody(_, _, "send", JInt(amountMsat) :: JString(paymentHash) :: JString(nodeId) :: Nil) => (paymentInitiator ? SendPayment(amountMsat.toLong, paymentHash, PublicKey(nodeId))).mapTo[PaymentResult] diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/EclairWallet.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/EclairWallet.scala index 9ac30095..20afb978 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/EclairWallet.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/EclairWallet.scala @@ -30,6 +30,7 @@ trait EclairWallet { /** * Cancels this transaction: this probably translates to "release locks on utxos". + * * @param tx * @return */ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoinCoreWallet.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoinCoreWallet.scala index 11fb6396..8c7a4b4e 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoinCoreWallet.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoinCoreWallet.scala @@ -15,7 +15,7 @@ import scala.concurrent.{ExecutionContext, Future, Promise} /** * Due to bitcoin-core wallet not fully supporting segwit txes yet, our current scheme is: - * utxos <- parent-tx <- funding-tx + * utxos <- parent-tx <- funding-tx * * With: * - utxos may be non-segwit @@ -200,6 +200,7 @@ class BitcoinCoreWallet(rpcClient: BitcoinJsonRPCClient, watcher: ActorRef)(impl /** * We currently only put a lock on the parent tx inputs, and we publish the parent tx immediately so there is nothing * to do here. + * * @param tx * @return */ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjKit.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjKit.scala index 36fe1c7d..3c110f66 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjKit.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjKit.scala @@ -7,8 +7,8 @@ import akka.actor.ActorSystem import com.google.common.util.concurrent.{FutureCallback, Futures} import fr.acinq.bitcoin.Transaction import fr.acinq.eclair.Globals -import fr.acinq.eclair.blockchain.bitcoinj.BitcoinjKit._ import fr.acinq.eclair.blockchain.CurrentBlockCount +import fr.acinq.eclair.blockchain.bitcoinj.BitcoinjKit._ import grizzled.slf4j.Logging import org.bitcoinj.core.TransactionConfidence.ConfidenceType import org.bitcoinj.core.listeners._ @@ -41,8 +41,8 @@ class BitcoinjKit(chain: String, datadir: File, staticPeers: List[InetSocketAddr val atCurrentHeight = atCurrentHeightPromise.future // tells us when we are at current block height -// private val syncedPromise = Promise[Boolean]() -// val synced = syncedPromise.future + // private val syncedPromise = Promise[Boolean]() + // val synced = syncedPromise.future private def updateBlockCount(blockCount: Int) = { // when synchronizing we don't want to advertise previous blocks @@ -61,13 +61,13 @@ class BitcoinjKit(chain: String, datadir: File, staticPeers: List[InetSocketAddr peerGroup().setMinRequiredProtocolVersion(70015) // bitcoin core 0.13 wallet().watchMode = true -// setDownloadListener(new DownloadProgressTracker { -// override def doneDownload(): Unit = { -// super.doneDownload() -// // may be called multiple times -// syncedPromise.trySuccess(true) -// } -// }) + // setDownloadListener(new DownloadProgressTracker { + // override def doneDownload(): Unit = { + // super.doneDownload() + // // may be called multiple times + // syncedPromise.trySuccess(true) + // } + // }) // we set the blockcount to the previous stored block height updateBlockCount(chain().getBestChainHeight) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjWatcher.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjWatcher.scala index 2873ef9b..e80e0f4e 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjWatcher.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/bitcoinj/BitcoinjWatcher.scala @@ -16,7 +16,6 @@ import org.bitcoinj.script.Script import scala.collection.SortedMap import scala.concurrent.ExecutionContext -import scala.concurrent.duration._ import scala.util.{Failure, Success, Try} final case class NewConfidenceLevel(tx: Transaction, blockHeight: Int, confirmations: Int) extends BlockchainEvent @@ -130,6 +129,7 @@ class BitcoinjWatcher(val kit: WalletAppKit)(implicit ec: ExecutionContext = Exe /** * Bitcoinj needs hints to be able to detect transactions + * * @param pubkeyScript * @return */ @@ -177,6 +177,7 @@ class Broadcaster(kit: WalletAppKit) extends Actor with ActorLogging { } case class BroadcastResult(tx: Transaction, result: Try[Boolean]) + def broadcast(tx: Transaction) = { Context.propagate(kit.wallet().getContext) val bitcoinjTx = new org.bitcoinj.core.Transaction(kit.wallet().getParams, Transaction.write(tx)) @@ -189,5 +190,4 @@ class Broadcaster(kit: WalletAppKit) extends Actor with ActorLogging { } - } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumEclairWallet.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumEclairWallet.scala index d285e6f6..e7c2b76b 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumEclairWallet.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumEclairWallet.scala @@ -10,7 +10,7 @@ import grizzled.slf4j.Logging import scala.concurrent.{ExecutionContext, Future} -class ElectrumEclairWallet(val wallet: ActorRef)(implicit system: ActorSystem, ec: ExecutionContext, timeout: akka.util.Timeout) extends EclairWallet with Logging { +class ElectrumEclairWallet(val wallet: ActorRef)(implicit system: ActorSystem, ec: ExecutionContext, timeout: akka.util.Timeout) extends EclairWallet with Logging { override def getBalance = (wallet ? GetBalance).mapTo[GetBalanceResponse].map(balance => balance.confirmed + balance.unconfirmed) @@ -45,7 +45,7 @@ class ElectrumEclairWallet(val wallet: ActorRef)(implicit system: ActorSystem, e case CancelTransactionResponse(_) => false } - def sendPayment(amount: Satoshi, address: String, feeRatePerKw: Long) : Future[String] = { + def sendPayment(amount: Satoshi, address: String, feeRatePerKw: Long): Future[String] = { val publicKeyScript = Base58Check.decode(address) match { case (Base58.Prefix.PubkeyAddressTestnet, pubKeyHash) => Script.pay2pkh(pubKeyHash) case (Base58.Prefix.ScriptAddressTestnet, scriptHash) => OP_HASH160 :: OP_PUSHDATA(scriptHash) :: OP_EQUAL :: Nil diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWallet.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWallet.scala index 31aa3251..e61e4031 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWallet.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWallet.scala @@ -342,6 +342,7 @@ object ElectrumWallet { /** * use BIP49 (and not BIP44) since we use p2sh-of-p2wpkh + * * @param master master key * @return the BIP49 account key for this master key: m/49'/1'/0'/0 */ @@ -349,6 +350,7 @@ object ElectrumWallet { /** * use BIP49 (and not BIP44) since we use p2sh-of-p2wpkh + * * @param master master key * @return the BIP49 change key for this master key: m/49'/1'/0'/1 */ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/ConstantFeeProvider.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/ConstantFeeProvider.scala index 4cbd78c7..ec275182 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/ConstantFeeProvider.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/ConstantFeeProvider.scala @@ -1,4 +1,5 @@ package fr.acinq.eclair.blockchain.fee + import scala.concurrent.Future /** diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/FeeProvider.scala b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/FeeProvider.scala index 76851364..deaec42c 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/FeeProvider.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/blockchain/fee/FeeProvider.scala @@ -28,6 +28,7 @@ object FeeratesPerKw { /** * Used in tests + * * @param feeratePerKw * @return */ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala index ff9681f6..7f73dba9 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala @@ -7,7 +7,6 @@ import fr.acinq.bitcoin.Crypto.{PublicKey, ripemd160, sha256} import fr.acinq.bitcoin._ import fr.acinq.eclair.NodeParams.BITCOINJ import fr.acinq.eclair._ -import fr.acinq.eclair.blockchain.WatchConfirmed.extractPublicKeyScript import fr.acinq.eclair.blockchain._ import fr.acinq.eclair.channel.Helpers.{Closing, Funding} import fr.acinq.eclair.crypto.{Generators, ShaChain, Sphinx} diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala index ffbdb29a..8ddc400b 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala @@ -8,7 +8,7 @@ import fr.acinq.eclair.UInt64 */ class ChannelException(channelId: BinaryData, message: String) extends RuntimeException(message) - +// @formatter:off case class DebugTriggeredException (channelId: BinaryData) extends ChannelException(channelId, "debug-mode triggered failure") case class ChannelReserveTooHigh (channelId: BinaryData, channelReserveSatoshis: Long, reserveToFundingRatio: Double, maxReserveToFundingRatio: Double) extends ChannelException(channelId, s"channelReserveSatoshis too high: reserve=$channelReserveSatoshis fundingRatio=$reserveToFundingRatio maxFundingRatio=$maxReserveToFundingRatio") case class ClosingInProgress (channelId: BinaryData) extends ChannelException(channelId, "cannot send new htlcs, closing in progress") @@ -39,4 +39,5 @@ case class UnexpectedRevocation (channelId: BinaryData) extends C case class InvalidRevocation (channelId: BinaryData) extends ChannelException(channelId, "invalid revocation") case class CommitmentSyncError (channelId: BinaryData) extends ChannelException(channelId, "commitment sync error") case class RevocationSyncError (channelId: BinaryData) extends ChannelException(channelId, "revocation sync error") -case class InvalidFailureCode (channelId: BinaryData) extends ChannelException(channelId, "UpdateFailMalformedHtlc message doesn't have BADONION bit set") \ No newline at end of file +case class InvalidFailureCode (channelId: BinaryData) extends ChannelException(channelId, "UpdateFailMalformedHtlc message doesn't have BADONION bit set") +// @formatter:on \ No newline at end of file diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala index 0dc46d4c..1847dfe9 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala @@ -1,7 +1,7 @@ package fr.acinq.eclair.channel import fr.acinq.bitcoin.Crypto.{Point, PrivateKey, sha256} -import fr.acinq.bitcoin.{BinaryData, Crypto, Satoshi, Script, Transaction} +import fr.acinq.bitcoin.{BinaryData, Crypto, Satoshi, Transaction} import fr.acinq.eclair.crypto.{Generators, ShaChain, Sphinx} import fr.acinq.eclair.payment.Origin import fr.acinq.eclair.transactions.Transactions._ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala index 3fb760c3..712204c4 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala @@ -2,7 +2,7 @@ package fr.acinq.eclair.channel import akka.actor.{Actor, ActorLogging, ActorRef} import fr.acinq.eclair.NodeParams -import fr.acinq.eclair.wire.{Error, LightningMessage} +import fr.acinq.eclair.wire.LightningMessage /** * Created by fabrice on 27/02/17. diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala index d6836caf..33d33e3c 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala @@ -490,6 +490,7 @@ object Helpers { * A local commit is considered done when: * - all commitment tx outputs that we can spend have been spent and confirmed (even if the spending tx was not ours) * - all 3rd stage txes (txes spending htlc txes) have been confirmed + * * @param localCommitPublished * @return */ @@ -509,6 +510,7 @@ object Helpers { /** * A remote commit is considered done when all commitment tx outputs that we can spend have been spent and confirmed * (even if the spending tx was not ours). + * * @param remoteCommitPublished * @return */ @@ -524,6 +526,7 @@ object Helpers { /** * A remote commit is considered done when all commitment tx outputs that we can spend have been spent and confirmed * (even if the spending tx was not ours). + * * @param revokedCommitPublished * @return */ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Register.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Register.scala index 72429dfa..a47467fc 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Register.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Register.scala @@ -57,6 +57,7 @@ class Register extends Actor with ActorLogging { } object Register { + // @formatter:off case class Forward[T](channelId: BinaryData, message: T) case class ForwardShortId[T](shortChannelId: Long, message: T) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/BitStream.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/BitStream.scala index e289ceaa..9db86954 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/BitStream.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/BitStream.scala @@ -1,15 +1,15 @@ package fr.acinq.eclair.crypto -import fr.acinq.bitcoin.BinaryData import org.spongycastle.util.encoders.Hex import scala.annotation.tailrec /** * Bit stream that can be written to and read at both ends (i.e. you can read from the end or the beginning of the stream) - * @param bytes bits packed as bytes, the last byte is padded with 0s + * + * @param bytes bits packed as bytes, the last byte is padded with 0s * @param offstart offset at which the first bit is in the first byte - * @param offend offset at which the last bit is in the last byte + * @param offend offset at which the last bit is in the last byte */ case class BitStream(bytes: Vector[Byte], offstart: Int, offend: Int) { @@ -20,6 +20,7 @@ case class BitStream(bytes: Vector[Byte], offstart: Int, offend: Int) { def bitCount = 8 * bytes.length - offstart - offend def isEmpty = bitCount == 0 + /** * append a byte to a bitstream * @@ -97,16 +98,17 @@ case class BitStream(bytes: Vector[Byte], offstart: Int, offend: Int) { BitStream(bytes.dropRight(2) :+ a1.toByte, offstart, offend) -> byte.toByte } - def popBytes(n: Int) : (BitStream, Seq[Byte]) = { + def popBytes(n: Int): (BitStream, Seq[Byte]) = { @tailrec - def loop(stream: BitStream, acc: Seq[Byte]) : (BitStream, Seq[Byte]) = + def loop(stream: BitStream, acc: Seq[Byte]): (BitStream, Seq[Byte]) = if (acc.length == n) (stream, acc) else { - val (stream1, value) = stream.popByte - loop(stream1, acc :+ value) - } + val (stream1, value) = stream.popByte + loop(stream1, acc :+ value) + } loop(this, Nil) } + /** * read the first bit from a bitstream * @@ -117,7 +119,7 @@ case class BitStream(bytes: Vector[Byte], offstart: Int, offend: Int) { case _ => BitStream(bytes, offstart + 1, offend) -> firstBit } - def readBits(count: Int) : (BitStream, Seq[Bit]) = { + def readBits(count: Int): (BitStream, Seq[Bit]) = { @tailrec def loop(stream: BitStream, acc: Seq[Bit]): (BitStream, Seq[Bit]) = if (acc.length == count) (stream, acc) else { val (stream1, bit) = stream.readBit @@ -126,14 +128,15 @@ case class BitStream(bytes: Vector[Byte], offstart: Int, offend: Int) { loop(this, Nil) } + /** * read the first byte from a bitstream * * @return */ def readByte: (BitStream, Byte) = { - val byte = ((bytes(0) << offstart) | (bytes(1) >>> (7 - offstart))) & 0xff - BitStream(bytes.tail, offstart, offend) -> byte.toByte + val byte = ((bytes(0) << offstart) | (bytes(1) >>> (7 - offstart))) & 0xff + BitStream(bytes.tail, offstart, offend) -> byte.toByte } def isSet(pos: Int): Boolean = { diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Noise.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Noise.scala index 5235b1b9..6b93aada 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Noise.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Noise.scala @@ -3,8 +3,8 @@ package fr.acinq.eclair.crypto import java.math.BigInteger import java.nio.ByteOrder -import fr.acinq.eclair.randomBytes import fr.acinq.bitcoin.{BinaryData, Crypto, Protocol} +import fr.acinq.eclair.randomBytes import grizzled.slf4j.Logging import org.spongycastle.crypto.digests.SHA256Digest import org.spongycastle.crypto.macs.HMac diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/ShaChain.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/ShaChain.scala index 86bad4aa..472596f8 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/ShaChain.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/ShaChain.scala @@ -97,7 +97,7 @@ object ShaChain { } - val shaChainCodec: Codec[ShaChain] = { + val shaChainCodec: Codec[ShaChain] = { import scodec.Codec import scodec.bits.BitVector import scodec.codecs._ @@ -106,7 +106,7 @@ object ShaChain { val entryCodec = vectorOfN(uint16, bool) ~ LightningMessageCodecs.varsizebinarydata // codec for a Map[Vector[Boolean], BinaryData]: write all k ->v pairs using the codec defined above - val mapCodec: Codec[Map[Vector[Boolean], BinaryData]] = Codec[Map[Vector[Boolean], BinaryData]] ( + val mapCodec: Codec[Map[Vector[Boolean], BinaryData]] = Codec[Map[Vector[Boolean], BinaryData]]( (m: Map[Vector[Boolean], BinaryData]) => vectorOfN(uint16, entryCodec).encode(m.toVector), (b: BitVector) => vectorOfN(uint16, entryCodec).decode(b).map(_.map(_.toMap)) ) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala index b314d2bb..f527b37d 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala @@ -5,7 +5,7 @@ import java.nio.ByteOrder import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey} import fr.acinq.bitcoin.{BinaryData, Crypto, Protocol} -import fr.acinq.eclair.wire.{ChannelUpdate, FailureMessage, FailureMessageCodecs, LightningMessageCodecs} +import fr.acinq.eclair.wire.{FailureMessage, FailureMessageCodecs} import grizzled.slf4j.Logging import org.spongycastle.crypto.digests.SHA256Digest import org.spongycastle.crypto.macs.HMac @@ -32,7 +32,7 @@ object Sphinx extends Logging { // onion packet length val PacketLength = 1 + 33 + MacLength + MaxHops * (PayloadLength + MacLength) - + // last packet (all zeroes except for the version byte) val LAST_PACKET = Packet(Version, zeroes(33), zeroes(MacLength), zeroes(MaxHops * (PayloadLength + MacLength))) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/TransportHandler.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/TransportHandler.scala index 75c400db..89247341 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/TransportHandler.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/TransportHandler.scala @@ -35,6 +35,7 @@ class TransportHandler[T: ClassTag](keyPair: KeyPair, rs: Option[BinaryData], co connection ! akka.io.Tcp.Register(self) val out = context.actorOf(Props(new WriteAckSender(connection))) + def buf(message: BinaryData): ByteString = ByteString.fromArray(message) // it means we initiate the dialog diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/db/NetworkDb.scala b/eclair-core/src/main/scala/fr/acinq/eclair/db/NetworkDb.scala index dd70ff16..6cca9a83 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/db/NetworkDb.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/db/NetworkDb.scala @@ -17,6 +17,7 @@ trait NetworkDb { /** * This method removes 1 channel announcement and 2 channel updates (at both ends of the same channel) + * * @param shortChannelId * @return */ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/db/PreimagesDb.scala b/eclair-core/src/main/scala/fr/acinq/eclair/db/PreimagesDb.scala index 5d1a6d05..d984e10b 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/db/PreimagesDb.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/db/PreimagesDb.scala @@ -1,7 +1,6 @@ package fr.acinq.eclair.db import fr.acinq.bitcoin.BinaryData -import fr.acinq.eclair.channel.HasCommitments /** * This database stores the preimages that we have received from downstream diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/db/sqlite/SqliteNetworkDb.scala b/eclair-core/src/main/scala/fr/acinq/eclair/db/sqlite/SqliteNetworkDb.scala index 98339abb..9de8a306 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/db/sqlite/SqliteNetworkDb.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/db/sqlite/SqliteNetworkDb.scala @@ -1,14 +1,12 @@ package fr.acinq.eclair.db.sqlite -import java.sql.{Connection, ResultSet} +import java.sql.Connection import fr.acinq.bitcoin.Crypto import fr.acinq.eclair.db.NetworkDb import fr.acinq.eclair.router.Announcements import fr.acinq.eclair.wire.LightningMessageCodecs.{channelAnnouncementCodec, channelUpdateCodec, nodeAnnouncementCodec} import fr.acinq.eclair.wire.{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement} -import scodec.Codec -import scodec.bits.BitVector class SqliteNetworkDb(sqlite: Connection) extends NetworkDb { diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/io/Server.scala b/eclair-core/src/main/scala/fr/acinq/eclair/io/Server.scala index e3126eda..8f33d61c 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/io/Server.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/io/Server.scala @@ -2,7 +2,7 @@ package fr.acinq.eclair.io import java.net.InetSocketAddress -import akka.actor.{Actor, ActorLogging, ActorRef, OneForOneStrategy, Props, Status, SupervisorStrategy, Terminated} +import akka.actor.{Actor, ActorLogging, ActorRef, OneForOneStrategy, Props, SupervisorStrategy} import akka.io.Tcp.SO.KeepAlive import akka.io.{IO, Tcp} import fr.acinq.eclair.NodeParams diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/LocalPaymentHandler.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/LocalPaymentHandler.scala index 0fb19f44..08d4d4ef 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/LocalPaymentHandler.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/LocalPaymentHandler.scala @@ -2,9 +2,9 @@ package fr.acinq.eclair.payment import akka.actor.{Actor, ActorLogging, Props, Status} import fr.acinq.bitcoin.{BinaryData, Crypto, MilliSatoshi} -import fr.acinq.eclair.{Globals, NodeParams, randomBytes} -import fr.acinq.eclair.channel.{CMD_FAIL_HTLC, CMD_FULFILL_HTLC, ExpiryTooSmall} +import fr.acinq.eclair.channel.{CMD_FAIL_HTLC, CMD_FULFILL_HTLC} import fr.acinq.eclair.wire._ +import fr.acinq.eclair.{NodeParams, randomBytes} import scala.util.{Failure, Success, Try} @@ -32,25 +32,25 @@ class LocalPaymentHandler(nodeParams: NodeParams) extends Actor with ActorLoggin } case htlc: UpdateAddHtlc => - if (h2r.contains(htlc.paymentHash)) { + if (h2r.contains(htlc.paymentHash)) { val r = h2r(htlc.paymentHash)._1 val pr = h2r(htlc.paymentHash)._2 // The htlc amount must be equal or greater than the requested amount. A slight overpaying is permitted, however // it must not be greater than two times the requested amount. // see https://github.com/lightningnetwork/lightning-rfc/blob/master/04-onion-routing.md#failure-messages - pr.amount match { - case Some(amount) if MilliSatoshi(htlc.amountMsat) < amount => sender ! CMD_FAIL_HTLC(htlc.id, Right(IncorrectPaymentAmount), commit = true) - case Some(amount) if MilliSatoshi(htlc.amountMsat) > amount * 2 => sender ! CMD_FAIL_HTLC(htlc.id, Right(IncorrectPaymentAmount), commit = true) - case _ => - log.info(s"received payment for paymentHash=${htlc.paymentHash} amountMsat=${htlc.amountMsat}") - // amount is correct or was not specified in the payment request - sender ! CMD_FULFILL_HTLC(htlc.id, r, commit = true) - context.system.eventStream.publish(PaymentReceived(MilliSatoshi(htlc.amountMsat), htlc.paymentHash)) - context.become(run(h2r - htlc.paymentHash)) - } - } else { + pr.amount match { + case Some(amount) if MilliSatoshi(htlc.amountMsat) < amount => sender ! CMD_FAIL_HTLC(htlc.id, Right(IncorrectPaymentAmount), commit = true) + case Some(amount) if MilliSatoshi(htlc.amountMsat) > amount * 2 => sender ! CMD_FAIL_HTLC(htlc.id, Right(IncorrectPaymentAmount), commit = true) + case _ => + log.info(s"received payment for paymentHash=${htlc.paymentHash} amountMsat=${htlc.amountMsat}") + // amount is correct or was not specified in the payment request + sender ! CMD_FULFILL_HTLC(htlc.id, r, commit = true) + context.system.eventStream.publish(PaymentReceived(MilliSatoshi(htlc.amountMsat), htlc.paymentHash)) + context.become(run(h2r - htlc.paymentHash)) + } + } else { sender ! CMD_FAIL_HTLC(htlc.id, Right(UnknownPaymentHash), commit = true) - } + } } } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentHop.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentHop.scala index e5b20de0..cd038f68 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentHop.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentHop.scala @@ -18,7 +18,7 @@ object PaymentHop { /** * * @param reversePath sequence of Hops from recipient to a start of assisted path - * @param msat an amount to send to a payment recipient + * @param msat an amount to send to a payment recipient * @return a sequence of extra hops with a pre-calculated fee for a given msat amount */ def buildExtra(reversePath: Seq[Hop], msat: Long): Seq[ExtraHop] = (List.empty[ExtraHop] /: reversePath) { @@ -29,13 +29,18 @@ object PaymentHop { trait PaymentHop { def nextFee(msat: Long): Long + def shortChannelId: Long + def cltvExpiryDelta: Int + def nodeId: PublicKey } case class Hop(nodeId: PublicKey, nextNodeId: PublicKey, lastUpdate: ChannelUpdate) extends PaymentHop { def nextFee(msat: Long): Long = PaymentHop.nodeFee(lastUpdate.feeBaseMsat, lastUpdate.feeProportionalMillionths, msat) + def cltvExpiryDelta: Int = lastUpdate.cltvExpiryDelta + def shortChannelId: Long = lastUpdate.shortChannelId } \ No newline at end of file diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentInitiator.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentInitiator.scala index b387baf1..535a09cb 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentInitiator.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentInitiator.scala @@ -1,7 +1,6 @@ package fr.acinq.eclair.payment import akka.actor.{Actor, ActorLogging, ActorRef, Props} -import fr.acinq.bitcoin.BinaryData import fr.acinq.bitcoin.Crypto.PublicKey /** diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentRequest.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentRequest.scala index 34c7308c..157a2566 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentRequest.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/PaymentRequest.scala @@ -263,13 +263,13 @@ object PaymentRequest { case class ExpiryTag(seconds: Long) extends Tag { override def toInt5s = { val ints = writeUnsignedLong(seconds) - Bech32.map('x') +: (writeSize(ints.size) ++ ints) } + Bech32.map('x') +: (writeSize(ints.size) ++ ints) + } } /** * Min final CLTV expiry * - * * @param blocks min final cltv expiry, in blocks */ case class MinFinalCltvExpiryTag(blocks: Long) extends Tag { @@ -418,8 +418,9 @@ object PaymentRequest { /** * prepend an unsigned long value to a sequence of Int5s + * * @param value input value - * @param acc sequence of Int5 values + * @param acc sequence of Int5 values * @return an update sequence of Int5s */ @tailrec @@ -432,10 +433,11 @@ object PaymentRequest { /** * convert a tag data size to a sequence of Int5s. It * must * fit on a sequence * of 2 Int5 values + * * @param size data size * @return size as a sequence of exactly 2 Int5 values */ - def writeSize(size: Long) : Seq[Int5] = { + def writeSize(size: Long): Seq[Int5] = { val output = writeUnsignedLong(size) // make sure that size is encoded on 2 int5 values output.length match { @@ -448,8 +450,9 @@ object PaymentRequest { /** * reads an unsigned long value from a sequence of Int5s + * * @param length length of the sequence - * @param ints sequence of Int5s + * @param ints sequence of Int5s * @return an unsigned long value */ def readUnsignedLong(length: Int, ints: Seq[Int5]): Long = ints.take(length).foldLeft(0L) { case (acc, i) => acc * 32 + i } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/router/Announcements.scala b/eclair-core/src/main/scala/fr/acinq/eclair/router/Announcements.scala index a9a6598e..47f9e86c 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/router/Announcements.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/router/Announcements.scala @@ -79,6 +79,7 @@ object Announcements { * The creating node MUST set node-id-1 and node-id-2 to the public keys of the * two nodes who are operating the channel, such that node-id-1 is the numerically-lesser * of the two DER encoded keys sorted in ascending numerical order, + * * @return true if localNodeId is node1 */ def isNode1(localNodeId: BinaryData, remoteNodeId: BinaryData) = LexicographicalOrdering.isLessThan(localNodeId, remoteNodeId) @@ -87,6 +88,7 @@ object Announcements { * BOLT 7: * The creating node [...] MUST set the direction bit of flags to 0 if * the creating node is node-id-1 in that message, otherwise 1. + * * @return true if the node who sent these flags is node1 */ def isNode1(flags: BinaryData) = !BitVector(flags.data).reverse.get(0) @@ -94,6 +96,7 @@ object Announcements { /** * A node MAY create and send a channel_update with the disable bit set to * signal the temporary unavailability of a channel + * * @return */ def isEnabled(flags: BinaryData) = !BitVector(flags.data).reverse.get(1) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/router/Router.scala b/eclair-core/src/main/scala/fr/acinq/eclair/router/Router.scala index 47ea300b..1e369c39 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/router/Router.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/router/Router.scala @@ -11,18 +11,18 @@ import fr.acinq.eclair._ import fr.acinq.eclair.blockchain._ import fr.acinq.eclair.channel._ import fr.acinq.eclair.io.Peer +import fr.acinq.eclair.payment.Hop import fr.acinq.eclair.transactions.Scripts import fr.acinq.eclair.wire._ -import fr.acinq.eclair.payment.Hop import org.jgrapht.alg.shortestpath.DijkstraShortestPath import org.jgrapht.ext._ import org.jgrapht.graph.{DefaultDirectedGraph, DefaultEdge, SimpleGraph} import scala.collection.JavaConversions._ import scala.compat.Platform +import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} import scala.util.{Random, Success, Try} -import scala.concurrent.duration._ // @formatter:off diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/router/RouterExceptions.scala b/eclair-core/src/main/scala/fr/acinq/eclair/router/RouterExceptions.scala index f2f948bc..3d338c93 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/router/RouterExceptions.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/router/RouterExceptions.scala @@ -7,4 +7,5 @@ package fr.acinq.eclair.router class RouterException(message: String) extends RuntimeException(message) object RouteNotFound extends RouterException("Route not found") + object CannotRouteToSelf extends RouterException("Cannot route to self") diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/router/ThrottleForwarder.scala b/eclair-core/src/main/scala/fr/acinq/eclair/router/ThrottleForwarder.scala index 4286266d..5f503fc6 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/router/ThrottleForwarder.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/router/ThrottleForwarder.scala @@ -13,8 +13,10 @@ import scala.concurrent.duration.{FiniteDuration, _} */ class ThrottleForwarder(target: ActorRef, messages: Iterable[Any], chunkSize: Int, delay: FiniteDuration) extends Actor with ActorLogging { - import scala.concurrent.ExecutionContext.Implicits.global import ThrottleForwarder.Tick + + import scala.concurrent.ExecutionContext.Implicits.global + val clock = context.system.scheduler.schedule(0 second, delay, self, Tick) log.debug(s"sending messages=${messages.size} with chunkSize=$chunkSize and delay=$delay") diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/transactions/CommitmentSpec.scala b/eclair-core/src/main/scala/fr/acinq/eclair/transactions/CommitmentSpec.scala index 506dd6f4..8fb4cf20 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/transactions/CommitmentSpec.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/transactions/CommitmentSpec.scala @@ -1,6 +1,5 @@ package fr.acinq.eclair.transactions -import fr.acinq.bitcoin.BinaryData import fr.acinq.eclair.wire._ /** diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/transactions/Scripts.scala b/eclair-core/src/main/scala/fr/acinq/eclair/transactions/Scripts.scala index ec1115a2..becf64be 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/transactions/Scripts.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/transactions/Scripts.scala @@ -1,8 +1,8 @@ package fr.acinq.eclair.transactions -import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey, ripemd160} +import fr.acinq.bitcoin.Crypto.{PublicKey, ripemd160} import fr.acinq.bitcoin.Script._ -import fr.acinq.bitcoin.{BinaryData, Crypto, LexicographicalOrdering, LockTimeThreshold, OP_0, OP_1, OP_1NEGATE, OP_2, OP_2DROP, OP_ADD, OP_CHECKLOCKTIMEVERIFY, OP_CHECKMULTISIG, OP_CHECKSEQUENCEVERIFY, OP_CHECKSIG, OP_DROP, OP_DUP, OP_ELSE, OP_ENDIF, OP_EQUAL, OP_EQUALVERIFY, OP_HASH160, OP_IF, OP_NOTIF, OP_PUSHDATA, OP_SIZE, OP_SWAP, OutPoint, SIGHASH_ALL, Satoshi, Script, ScriptElt, ScriptWitness, Transaction, TxIn, TxOut} +import fr.acinq.bitcoin.{BinaryData, LexicographicalOrdering, LockTimeThreshold, OP_0, OP_1, OP_1NEGATE, OP_2, OP_2DROP, OP_ADD, OP_CHECKLOCKTIMEVERIFY, OP_CHECKMULTISIG, OP_CHECKSEQUENCEVERIFY, OP_CHECKSIG, OP_DROP, OP_DUP, OP_ELSE, OP_ENDIF, OP_EQUAL, OP_EQUALVERIFY, OP_HASH160, OP_IF, OP_NOTIF, OP_PUSHDATA, OP_SIZE, OP_SWAP, Satoshi, Script, ScriptElt, ScriptWitness, Transaction, TxIn} /** * Created by PM on 02/12/2016. diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/FailureMessage.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/FailureMessage.scala index 715e315e..bf2e2dad 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/FailureMessage.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/FailureMessage.scala @@ -1,7 +1,7 @@ package fr.acinq.eclair.wire import fr.acinq.bitcoin.BinaryData -import fr.acinq.eclair.wire.LightningMessageCodecs.{binarydata, uint64, channelUpdateCodec} +import fr.acinq.eclair.wire.LightningMessageCodecs.{binarydata, channelUpdateCodec, uint64} import scodec.Codec import scodec.codecs._ diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/FixedSizeStrictCodec.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/FixedSizeStrictCodec.scala index 91efc13b..0c2d95b7 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/FixedSizeStrictCodec.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/FixedSizeStrictCodec.scala @@ -47,9 +47,13 @@ object FixedSizeStrictCodec { */ def bytesStrict(size: Int): Codec[ByteVector] = new Codec[ByteVector] { private val codec = new FixedSizeStrictCodec(size * 8L, codecs.bits).xmap[ByteVector](_.toByteVector, _.toBitVector) + def sizeBound = codec.sizeBound + def encode(b: ByteVector) = codec.encode(b) + def decode(b: BitVector) = codec.decode(b) + override def toString = s"bytesStrict($size)" } } \ No newline at end of file diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala index 3e83684c..85cf5203 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala @@ -6,8 +6,8 @@ import java.net.{Inet4Address, Inet6Address, InetAddress, InetSocketAddress} import fr.acinq.bitcoin.Crypto.{Point, PrivateKey, PublicKey, Scalar} import fr.acinq.bitcoin.{BinaryData, Crypto} import fr.acinq.eclair.crypto.{Generators, Sphinx} -import fr.acinq.eclair.{UInt64, wire} import fr.acinq.eclair.wire.FixedSizeStrictCodec.bytesStrict +import fr.acinq.eclair.{UInt64, wire} import scodec.bits.{BitVector, ByteVector} import scodec.codecs._ import scodec.{Attempt, Codec, Err} diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala index 734c6ca7..08d2fcde 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala @@ -32,9 +32,9 @@ case class Ping(pongLength: Int, data: BinaryData) extends SetupMessage case class Pong(data: BinaryData) extends SetupMessage case class ChannelReestablish( - channelId: BinaryData, - nextLocalCommitmentNumber: Long, - nextRemoteRevocationNumber: Long) extends ChannelMessage with HasChannelId + channelId: BinaryData, + nextLocalCommitmentNumber: Long, + nextRemoteRevocationNumber: Long) extends ChannelMessage with HasChannelId case class OpenChannel(chainHash: BinaryData, temporaryChannelId: BinaryData, diff --git a/eclair-core/src/test/java/fr/acinq/eclair/crypto/Curve25519.java b/eclair-core/src/test/java/fr/acinq/eclair/crypto/Curve25519.java index dfd0b9d2..b19232c0 100644 --- a/eclair-core/src/test/java/fr/acinq/eclair/crypto/Curve25519.java +++ b/eclair-core/src/test/java/fr/acinq/eclair/crypto/Curve25519.java @@ -27,13 +27,13 @@ import java.util.Arrays; /** * Implementation of the Curve25519 elliptic curve algorithm. - * + *

* This implementation is based on that from arduinolibs: * https://github.com/rweather/arduinolibs - * + *

* Differences in this version are due to using 26-bit limbs for the * representation instead of the 8/16/32-bit limbs in the original. - * + *

* References: http://cr.yp.to/ecdh.html, RFC 7748 */ public final class Curve25519 { @@ -61,25 +61,24 @@ public final class Curve25519 { /** * Constructs the temporary state holder for Curve25519 evaluation. */ - private Curve25519() - { + private Curve25519() { // Allocate memory for all of the temporary variables we will need. - x_1 = new int [NUM_LIMBS_255BIT]; - x_2 = new int [NUM_LIMBS_255BIT]; - x_3 = new int [NUM_LIMBS_255BIT]; - z_2 = new int [NUM_LIMBS_255BIT]; - z_3 = new int [NUM_LIMBS_255BIT]; - A = new int [NUM_LIMBS_255BIT]; - B = new int [NUM_LIMBS_255BIT]; - C = new int [NUM_LIMBS_255BIT]; - D = new int [NUM_LIMBS_255BIT]; - E = new int [NUM_LIMBS_255BIT]; - AA = new int [NUM_LIMBS_255BIT]; - BB = new int [NUM_LIMBS_255BIT]; - DA = new int [NUM_LIMBS_255BIT]; - CB = new int [NUM_LIMBS_255BIT]; - t1 = new long [NUM_LIMBS_510BIT]; - t2 = new int [NUM_LIMBS_510BIT]; + x_1 = new int[NUM_LIMBS_255BIT]; + x_2 = new int[NUM_LIMBS_255BIT]; + x_3 = new int[NUM_LIMBS_255BIT]; + z_2 = new int[NUM_LIMBS_255BIT]; + z_3 = new int[NUM_LIMBS_255BIT]; + A = new int[NUM_LIMBS_255BIT]; + B = new int[NUM_LIMBS_255BIT]; + C = new int[NUM_LIMBS_255BIT]; + D = new int[NUM_LIMBS_255BIT]; + E = new int[NUM_LIMBS_255BIT]; + AA = new int[NUM_LIMBS_255BIT]; + BB = new int[NUM_LIMBS_255BIT]; + DA = new int[NUM_LIMBS_255BIT]; + CB = new int[NUM_LIMBS_255BIT]; + t1 = new long[NUM_LIMBS_510BIT]; + t2 = new int[NUM_LIMBS_510BIT]; } @@ -102,8 +101,8 @@ public final class Curve25519 { Arrays.fill(BB, 0); Arrays.fill(DA, 0); Arrays.fill(CB, 0); - Arrays.fill(t1, 0L); - Arrays.fill(t2, 0); + Arrays.fill(t1, 0L); + Arrays.fill(t2, 0); } /** @@ -112,8 +111,7 @@ public final class Curve25519 { * * @param x The number to reduce, and the result. */ - private void reduceQuick(int[] x) - { + private void reduceQuick(int[] x) { int index, carry; // Perform a trial subtraction of (2^255 - 19) from "x" which is @@ -142,12 +140,11 @@ public final class Curve25519 { * Reduce a number modulo 2^255 - 19. * * @param result The result. - * @param x The value to be reduced. This array will be - * modified during the reduction. - * @param size The number of limbs in the high order half of x. + * @param x The value to be reduced. This array will be + * modified during the reduction. + * @param size The number of limbs in the high order half of x. */ - private void reduce(int[] result, int[] x, int size) - { + private void reduce(int[] result, int[] x, int size) { int index, limb, carry; // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will @@ -198,11 +195,10 @@ public final class Curve25519 { * Multiplies two numbers modulo 2^255 - 19. * * @param result The result. - * @param x The first number to multiply. - * @param y The second number to multiply. + * @param x The first number to multiply. + * @param y The second number to multiply. */ - private void mul(int[] result, int[] x, int[] y) - { + private void mul(int[] result, int[] x, int[] y) { int i, j; // Multiply the two numbers to create the intermediate result. @@ -220,10 +216,10 @@ public final class Curve25519 { // Propagate carries and convert back into 26-bit words. v = t1[0]; - t2[0] = ((int)v) & 0x03FFFFFF; + t2[0] = ((int) v) & 0x03FFFFFF; for (i = 1; i < NUM_LIMBS_510BIT; ++i) { v = (v >> 26) + t1[i]; - t2[i] = ((int)v) & 0x03FFFFFF; + t2[i] = ((int) v) & 0x03FFFFFF; } // Reduce the result modulo 2^255 - 19. @@ -234,10 +230,9 @@ public final class Curve25519 { * Squares a number modulo 2^255 - 19. * * @param result The result. - * @param x The number to square. + * @param x The number to square. */ - private void square(int[] result, int[] x) - { + private void square(int[] result, int[] x) { mul(result, x, x); } @@ -245,19 +240,18 @@ public final class Curve25519 { * Multiplies a number by the a24 constant, modulo 2^255 - 19. * * @param result The result. - * @param x The number to multiply by a24. + * @param x The number to multiply by a24. */ - private void mulA24(int[] result, int[] x) - { + private void mulA24(int[] result, int[] x) { long a24 = 121665; long carry = 0; int index; for (index = 0; index < NUM_LIMBS_255BIT; ++index) { carry += a24 * x[index]; - t2[index] = ((int)carry) & 0x03FFFFFF; + t2[index] = ((int) carry) & 0x03FFFFFF; carry >>= 26; } - t2[NUM_LIMBS_255BIT] = ((int)carry) & 0x03FFFFFF; + t2[NUM_LIMBS_255BIT] = ((int) carry) & 0x03FFFFFF; reduce(result, t2, 1); } @@ -265,11 +259,10 @@ public final class Curve25519 { * Adds two numbers modulo 2^255 - 19. * * @param result The result. - * @param x The first number to add. - * @param y The second number to add. + * @param x The first number to add. + * @param y The second number to add. */ - private void add(int[] result, int[] x, int[] y) - { + private void add(int[] result, int[] x, int[] y) { int index, carry; carry = x[0] + y[0]; result[0] = carry & 0x03FFFFFF; @@ -284,11 +277,10 @@ public final class Curve25519 { * Subtracts two numbers modulo 2^255 - 19. * * @param result The result. - * @param x The first number to subtract. - * @param y The second number to subtract. + * @param x The first number to subtract. + * @param y The second number to subtract. */ - private void sub(int[] result, int[] x, int[] y) - { + private void sub(int[] result, int[] x, int[] y) { int index, borrow; // Subtract y from x to generate the intermediate result. @@ -316,11 +308,10 @@ public final class Curve25519 { * Conditional swap of two values. * * @param select Set to 1 to swap, 0 to leave as-is. - * @param x The first value. - * @param y The second value. + * @param x The first value. + * @param y The second value. */ - private static void cswap(int select, int[] x, int[] y) - { + private static void cswap(int select, int[] x, int[] y) { int dummy; select = -select; for (int index = 0; index < NUM_LIMBS_255BIT; ++index) { @@ -334,10 +325,9 @@ public final class Curve25519 { * Raise x to the power of (2^250 - 1). * * @param result The result. Must not overlap with x. - * @param x The argument. + * @param x The argument. */ - private void pow250(int[] result, int[] x) - { + private void pow250(int[] result, int[] x) { int i, j; // The big-endian hexadecimal expansion of (2^250 - 1) is: @@ -375,10 +365,9 @@ public final class Curve25519 { * Computes the reciprocal of a number modulo 2^255 - 19. * * @param result The result. Must not overlap with x. - * @param x The argument. + * @param x The argument. */ - private void recip(int[] result, int[] x) - { + private void recip(int[] result, int[] x) { // The reciprocal is the same as x ^ (p - 2) where p = 2^255 - 19. // The big-endian hexadecimal expansion of (p - 2) is: // 7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFEB @@ -401,8 +390,7 @@ public final class Curve25519 { * * @param s The 32-byte secret key. */ - private void evalCurve(byte[] s) - { + private void evalCurve(byte[] s) { int sposn = 31; int sbit = 6; int svalue = s[sposn] | 0x40; @@ -411,7 +399,7 @@ public final class Curve25519 { // Iterate over all 255 bits of "s" from the highest to the lowest. // We ignore the high bit of the 256-bit representation of "s". - for (;;) { + for (; ; ) { // Conditional swaps on entry to this bit but only if we // didn't swap on the previous bit. select = (svalue >> sbit) & 0x01; @@ -464,14 +452,13 @@ public final class Curve25519 { /** * Evaluates the Curve25519 curve. * - * @param result Buffer to place the result of the evaluation into. - * @param offset Offset into the result buffer. + * @param result Buffer to place the result of the evaluation into. + * @param offset Offset into the result buffer. * @param privateKey The private key to use in the evaluation. - * @param publicKey The public key to use in the evaluation, or null - * if the base point of the curve should be used. + * @param publicKey The public key to use in the evaluation, or null + * if the base point of the curve should be used. */ - public static void eval(byte[] result, int offset, byte[] privateKey, byte[] publicKey) - { + public static void eval(byte[] result, int offset, byte[] privateKey, byte[] publicKey) { Curve25519 state = new Curve25519(); try { // Unpack the public key value. If null, use 9 as the base point. @@ -501,11 +488,11 @@ public final class Curve25519 { } // Initialize the other temporary variables. - Arrays.fill(state.x_2, 0); // x_2 = 1 + Arrays.fill(state.x_2, 0); // x_2 = 1 state.x_2[0] = 1; - Arrays.fill(state.z_2, 0); // z_2 = 0 + Arrays.fill(state.z_2, 0); // z_2 = 0 System.arraycopy(state.x_1, 0, state.x_3, 0, state.x_1.length); // x_3 = x_1 - Arrays.fill(state.z_3, 0); // z_3 = 1 + Arrays.fill(state.z_3, 0); // z_3 = 1 state.z_3[0] = 1; // Evaluate the curve for every bit of the private key. @@ -520,9 +507,9 @@ public final class Curve25519 { int bit = (index * 8) % 26; int word = (index * 8) / 26; if (bit <= (26 - 8)) - result[offset + index] = (byte)(state.x_2[word] >> bit); + result[offset + index] = (byte) (state.x_2[word] >> bit); else - result[offset + index] = (byte)((state.x_2[word] >> bit) | (state.x_2[word + 1] << (26 - bit))); + result[offset + index] = (byte) ((state.x_2[word] >> bit) | (state.x_2[word + 1] << (26 - bit))); } } finally { // Clean up all temporary state before we exit. diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/FeaturesSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/FeaturesSpec.scala index 031d6b9e..7d99e17b 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/FeaturesSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/FeaturesSpec.scala @@ -2,7 +2,7 @@ package fr.acinq.eclair import java.nio.ByteOrder -import fr.acinq.bitcoin.{BinaryData, Protocol} +import fr.acinq.bitcoin.Protocol import fr.acinq.eclair.Features._ import org.junit.runner.RunWith import org.scalatest.FunSuite diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/Pipe.scala b/eclair-core/src/test/scala/fr/acinq/eclair/Pipe.scala index 2eb878b9..7345bf98 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/Pipe.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/Pipe.scala @@ -2,7 +2,6 @@ package fr.acinq.eclair import akka.actor.{Actor, ActorLogging, ActorRef, Stash} import fr.acinq.eclair.channel.Commitments.msg2String -import fr.acinq.eclair.channel.{INPUT_DISCONNECTED, INPUT_RECONNECTED} import fr.acinq.eclair.wire.LightningMessage /** diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala b/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala index 0288a506..09be4579 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala @@ -23,7 +23,9 @@ object TestConstants { val seed = BinaryData("01" * 32) val master = DeterministicWallet.generate(seed) val extendedPrivateKey = DeterministicWallet.derivePrivateKey(master, DeterministicWallet.hardened(46) :: DeterministicWallet.hardened(0) :: Nil) + def sqlite = DriverManager.getConnection("jdbc:sqlite::memory:") + def nodeParams = NodeParams( extendedPrivateKey = extendedPrivateKey, privateKey = extendedPrivateKey.privateKey, @@ -58,7 +60,9 @@ object TestConstants { channelFlags = 1, channelExcludeDuration = 5 seconds, watcherType = BITCOIND) + def id = nodeParams.privateKey.publicKey + def channelParams = Peer.makeChannelParams( nodeParams = nodeParams, defaultFinalScriptPubKey = Script.write(Script.pay2wpkh(PrivateKey(Array.fill[Byte](32)(4), compressed = true).publicKey)), @@ -72,7 +76,9 @@ object TestConstants { val seed = BinaryData("02" * 32) val master = DeterministicWallet.generate(seed) val extendedPrivateKey = DeterministicWallet.derivePrivateKey(master, DeterministicWallet.hardened(46) :: DeterministicWallet.hardened(0) :: Nil) + def sqlite = DriverManager.getConnection("jdbc:sqlite::memory:") + def nodeParams = NodeParams( extendedPrivateKey = extendedPrivateKey, privateKey = extendedPrivateKey.privateKey, @@ -107,7 +113,9 @@ object TestConstants { channelFlags = 1, channelExcludeDuration = 5 seconds, watcherType = BITCOIND) + def id = nodeParams.privateKey.publicKey + def channelParams = Peer.makeChannelParams( nodeParams = nodeParams, defaultFinalScriptPubKey = Script.write(Script.pay2wpkh(PrivateKey(Array.fill[Byte](32)(5), compressed = true).publicKey)), diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumClientSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumClientSpec.scala index f4771736..86ba548a 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumClientSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumClientSpec.scala @@ -5,8 +5,8 @@ import akka.testkit.{TestKit, TestProbe} import fr.acinq.bitcoin.{BinaryData, Crypto, Transaction} import grizzled.slf4j.Logging import org.junit.runner.RunWith -import org.scalatest.{BeforeAndAfterAll, FunSuiteLike} import org.scalatest.junit.JUnitRunner +import org.scalatest.{BeforeAndAfterAll, FunSuiteLike} import scala.concurrent.duration._ @@ -14,6 +14,7 @@ import scala.concurrent.duration._ class ElectrumClientSpec extends TestKit(ActorSystem("test")) with FunSuiteLike with Logging with BeforeAndAfterAll { import ElectrumClient._ + var client: ActorRef = _ val probe = TestProbe() val referenceTx = Transaction.read("0200000003947e307df3ab452d23f02b5a65f4ada1804ee733e168e6197b0bd6cc79932b6c010000006a473044022069346ec6526454a481690a3664609f9e8032c34553015cfa2e9b25ebb420a33002206998f21a2aa771ad92a0c1083f4181a3acdb0d42ca51d01be1309da2ffb9cecf012102b4568cc6ee751f6d39f4a908b1fcffdb878f5f784a26a48c0acb0acff9d88e3bfeffffff966d9d969cd5f95bfd53003a35fcc1a50f4fb51f211596e6472583fdc5d38470000000006b4830450221009c9757515009c5709b5b678d678185202b817ef9a69ffb954144615ab11762210220732216384da4bf79340e9c46d0effba6ba92982cca998adfc3f354cec7715f800121035f7c3e077108035026f4ebd5d6ca696ef088d4f34d45d94eab4c41202ec74f9bfefffffff8d5062f5b04455c6cfa7e3f250e5a4fb44308ba2b86baf77f9ad0d782f57071010000006a47304402207f9f7dd91fe537a26d5554105977e3949a5c8c4ef53a6a3bff6da2d36eff928f02202b9427bef487a1825fd0c3c6851d17d5f19e6d73dfee22bf06db591929a2044d012102b4568cc6ee751f6d39f4a908b1fcffdb878f5f784a26a48c0acb0acff9d88e3bfeffffff02809698000000000017a914c82753548fdf4be1c3c7b14872c90b5198e67eaa876e642500000000001976a914e2365ec29471b3e271388b22eadf0e7f54d307a788ac6f771200") @@ -73,6 +74,6 @@ class ElectrumClientSpec extends TestKit(ActorSystem("test")) with FunSuiteLike test("list script unspents") { probe.send(client, ScriptHashListUnspent(scriptHash)) val ScriptHashListUnspentResponse(scriptHash1, unspents) = probe.expectMsgType[ScriptHashListUnspentResponse] - assert(unspents.contains(UnspentItem("3903726806aa044fe59f40e42eed71bded068b43aaa9e2d716e38b7825412de0", 0, 10000000L,1210224L))) + assert(unspents.contains(UnspentItem("3903726806aa044fe59f40e42eed71bded068b43aaa9e2d716e38b7825412de0", 0, 10000000L, 1210224L))) } } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletBasicSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletBasicSpec.scala index 12138021..a95550c0 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletBasicSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletBasicSpec.scala @@ -1,14 +1,12 @@ package fr.acinq.eclair.blockchain.electrum -import fr.acinq.bitcoin._ -import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey} +import fr.acinq.bitcoin.Crypto.PrivateKey import fr.acinq.bitcoin.DeterministicWallet.derivePrivateKey +import fr.acinq.bitcoin._ import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner -import scala.util.Try - @RunWith(classOf[JUnitRunner]) class ElectrumWalletBasicSpec extends FunSuite { diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletSpec.scala index af88d6c5..8b516733 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/electrum/ElectrumWalletSpec.scala @@ -9,7 +9,8 @@ import org.json4s.JsonAST._ import scala.concurrent.duration._ import scala.sys.process._ -class ElectrumWalletSpec extends IntegrationSpec{ +class ElectrumWalletSpec extends IntegrationSpec { + import ElectrumWallet._ val entropy = BinaryData("01" * 32) @@ -107,7 +108,7 @@ class ElectrumWalletSpec extends IntegrationSpec{ awaitCond({ val msg = listener.receiveOne(5 seconds) - msg == TransactionConfidenceChanged(BinaryData(txid),1) + msg == TransactionConfidenceChanged(BinaryData(txid), 1) }, max = 30 seconds, interval = 1 second) } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/EarnDotComFeeProviderSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/EarnDotComFeeProviderSpec.scala index b8f5fd33..80f13b9f 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/EarnDotComFeeProviderSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/EarnDotComFeeProviderSpec.scala @@ -16,8 +16,8 @@ import scala.concurrent.Await class EarnDotComFeeProviderSpec extends FunSuite { import EarnDotComFeeProvider._ - import org.json4s.jackson.JsonMethods.parse + implicit val formats = DefaultFormats val sample_response = @@ -53,8 +53,8 @@ class EarnDotComFeeProviderSpec extends FunSuite { } test("make sure API hasn't changed") { - import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits.global + import scala.concurrent.duration._ implicit val system = ActorSystem() implicit val timeout = Timeout(30 seconds) val provider = new EarnDotComFeeProvider() diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/FallbackFeeProviderSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/FallbackFeeProviderSpec.scala index 307c0245..933b890f 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/FallbackFeeProviderSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/fee/FallbackFeeProviderSpec.scala @@ -4,8 +4,8 @@ import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner -import scala.concurrent.{Await, Future} import scala.concurrent.duration._ +import scala.concurrent.{Await, Future} import scala.util.Random @RunWith(classOf[JUnitRunner]) @@ -15,6 +15,7 @@ class FallbackFeeProviderSpec extends FunSuite { /** * This provider returns a constant value, but fails after ttl tries + * * @param ttl * @param feeratesPerByte */ @@ -25,7 +26,7 @@ class FallbackFeeProviderSpec extends FunSuite { if (i < ttl) { i = i + 1 Future.successful(feeratesPerByte) - } else Future.failed(new RuntimeException()) + } else Future.failed(new RuntimeException()) } def dummyFeerates = FeeratesPerByte(Random.nextInt(10000), Random.nextInt(10000), Random.nextInt(10000), Random.nextInt(10000), Random.nextInt(10000), Random.nextInt(10000)) @@ -39,7 +40,7 @@ class FallbackFeeProviderSpec extends FunSuite { val provider5 = new FailingFeeProvider(5, dummyFeerates) // fails after 5 tries val provider7 = new FailingFeeProvider(Int.MaxValue, dummyFeerates) // "never" fails - val fallbackFeeProvider = new FallbackFeeProvider(provider0 :: provider1 :: provider3 :: provider5 :: provider7 :: Nil) + val fallbackFeeProvider = new FallbackFeeProvider(provider0 :: provider1 :: provider3 :: provider5 :: provider7 :: Nil) assert(await(fallbackFeeProvider.getFeerates) === provider1.feeratesPerByte) @@ -58,5 +59,4 @@ class FallbackFeeProviderSpec extends FunSuite { } - } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala index c36ace9b..8a9c5ddd 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala @@ -7,8 +7,7 @@ import fr.acinq.eclair.blockchain._ import fr.acinq.eclair.blockchain.fee.FeeratesPerKw import fr.acinq.eclair.channel._ import fr.acinq.eclair.crypto.Sphinx -import fr.acinq.eclair.payment.PaymentLifecycle -import fr.acinq.eclair.payment.Hop +import fr.acinq.eclair.payment.{Hop, PaymentLifecycle} import fr.acinq.eclair.wire._ import fr.acinq.eclair.{Globals, TestConstants} diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/a/WaitForAcceptChannelStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/a/WaitForAcceptChannelStateSpec.scala index 504829fd..f545b8f1 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/a/WaitForAcceptChannelStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/a/WaitForAcceptChannelStateSpec.scala @@ -1,6 +1,5 @@ package fr.acinq.eclair.channel.states.a -import akka.actor.ActorRef import akka.testkit.{TestFSMRef, TestProbe} import fr.acinq.eclair.TestConstants.{Alice, Bob} import fr.acinq.eclair.channel.states.StateTestsHelperMethods diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala index 46be747c..9d2878bd 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala @@ -210,7 +210,7 @@ class NormalStateSpec extends TestkitBaseClass with StateTestsHelperMethods { test("recv CMD_ADD_HTLC (while waiting for a revocation)") { case (alice, _, alice2bob, _, _, _, relayer) => within(30 seconds) { val sender = TestProbe() - val add1 = CMD_ADD_HTLC(TestConstants.fundingSatoshis * 2/3 * 1000, "11" * 32, 400144) + val add1 = CMD_ADD_HTLC(TestConstants.fundingSatoshis * 2 / 3 * 1000, "11" * 32, 400144) sender.send(alice, add1) sender.expectMsg("ok") alice2bob.expectMsgType[UpdateAddHtlc] @@ -218,7 +218,7 @@ class NormalStateSpec extends TestkitBaseClass with StateTestsHelperMethods { sender.expectMsg("ok") alice2bob.expectMsgType[CommitSig] // this is over channel-capacity - val add2 = CMD_ADD_HTLC(TestConstants.fundingSatoshis * 2/3 * 1000, "22" * 32, 400144) + val add2 = CMD_ADD_HTLC(TestConstants.fundingSatoshis * 2 / 3 * 1000, "22" * 32, 400144) sender.send(alice, add2) //sender.expectMsgType[Failure] relayer.expectMsgType[ForwardLocalFail] diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala index ceda1da1..031b8224 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala @@ -8,8 +8,7 @@ import fr.acinq.eclair.blockchain._ import fr.acinq.eclair.blockchain.fee.FeeratesPerKw import fr.acinq.eclair.channel.states.StateTestsHelperMethods import fr.acinq.eclair.channel.{Data, State, _} -import fr.acinq.eclair.payment._ -import fr.acinq.eclair.payment.{ForwardAdd, ForwardLocalFail, Local, PaymentLifecycle} +import fr.acinq.eclair.payment.{ForwardAdd, ForwardLocalFail, Local, PaymentLifecycle, _} import fr.acinq.eclair.wire.{CommitSig, Error, FailureMessageCodecs, PermanentChannelFailure, RevokeAndAck, Shutdown, UpdateAddHtlc, UpdateFailHtlc, UpdateFailMalformedHtlc, UpdateFee, UpdateFulfillHtlc} import fr.acinq.eclair.{Globals, TestConstants, TestkitBaseClass} import org.junit.runner.RunWith diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala index 11dd71e5..57a4b617 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala @@ -2,12 +2,12 @@ package fr.acinq.eclair.channel.states.g import akka.actor.Status.Failure import akka.testkit.{TestFSMRef, TestProbe} -import fr.acinq.eclair.{Globals, TestkitBaseClass} import fr.acinq.eclair.blockchain._ import fr.acinq.eclair.blockchain.fee.FeeratesPerKw import fr.acinq.eclair.channel.states.StateTestsHelperMethods import fr.acinq.eclair.channel.{Data, State, _} import fr.acinq.eclair.wire.{ClosingSigned, Error, Shutdown} +import fr.acinq.eclair.{Globals, TestkitBaseClass} import org.junit.runner.RunWith import org.scalatest.Tag import org.scalatest.junit.JUnitRunner diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala index 30c8f2e8..dd170405 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala @@ -7,7 +7,6 @@ import fr.acinq.eclair.TestkitBaseClass import fr.acinq.eclair.blockchain._ import fr.acinq.eclair.channel.states.StateTestsHelperMethods import fr.acinq.eclair.channel.{Data, State, _} -import fr.acinq.eclair.payment.HtlcGenerationSpec.paymentPreimage import fr.acinq.eclair.payment.{AckFulfillCmd, ForwardAdd, ForwardFulfill} import fr.acinq.eclair.transactions.Scripts import fr.acinq.eclair.wire._ diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/BitStreamSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/BitStreamSpec.scala index 346eddfc..e2fbfa3d 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/BitStreamSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/BitStreamSpec.scala @@ -10,6 +10,7 @@ import org.spongycastle.util.encoders.Hex */ @RunWith(classOf[JUnitRunner]) class BitStreamSpec extends FunSuite { + import BitStream._ test("add bits") { diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/NoiseSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/NoiseSpec.scala index 3b8d85f5..e9869064 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/NoiseSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/NoiseSpec.scala @@ -2,10 +2,10 @@ package fr.acinq.eclair.crypto import fr.acinq.bitcoin.BinaryData import fr.acinq.eclair.crypto.Noise._ -import org.spongycastle.crypto.ec.CustomNamedCurves import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner +import org.spongycastle.crypto.ec.CustomNamedCurves @RunWith(classOf[JUnitRunner]) class NoiseSpec extends FunSuite { diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala index 1ada5f1d..dc0b7a28 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala @@ -1,7 +1,7 @@ package fr.acinq.eclair.crypto +import fr.acinq.bitcoin.BinaryData import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey} -import fr.acinq.bitcoin.{BinaryData, Crypto} import fr.acinq.eclair.wire._ import org.junit.runner.RunWith import org.scalatest.FunSuite @@ -102,23 +102,23 @@ class SphinxSpec extends FunSuite { // node #4 want to reply with an error message val error = createErrorPacket(sharedSecret4, TemporaryNodeFailure) assert(error == BinaryData("a5e6bd0c74cb347f10cce367f949098f2457d14c046fd8a22cb96efb30b0fdcda8cb9168b50f2fd45edd73c1b0c8b33002df376801ff58aaa94000bf8a86f92620f343baef38a580102395ae3abf9128d1047a0736ff9b83d456740ebbb4aeb3aa9737f18fb4afb4aa074fb26c4d702f42968888550a3bded8c05247e045b866baef0499f079fdaeef6538f31d44deafffdfd3afa2fb4ca9082b8f1c465371a9894dd8c243fb4847e004f5256b3e90e2edde4c9fb3082ddfe4d1e734cacd96ef0706bf63c9984e22dc98851bcccd1c3494351feb458c9c6af41c0044bea3c47552b1d992ae542b17a2d0bba1a096c78d169034ecb55b6e3a7263c26017f033031228833c1daefc0dedb8cf7c3e37c9c37ebfe42f3225c326e8bcfd338804c145b16e34e4")) -// assert(error == BinaryData("69b1e5a3e05a7b5478e6529cd1749fdd8c66da6f6db42078ff8497ac4e117e91a8cb9168b58f2fd45edd73c1b0c8b33002df376801ff58aaa94000bf8a86f92620f343baef38a580102395ae3abf9128d1047a0736ff9b83d456740ebbb4aeb3aa9737f18fb4afb4aa074fb26c4d702f42968888550a3bded8c05247e045b866baef0499f079fdaeef6538f31d44deafffdfd3afa2fb4ca9082b8f1c465371a9894dd8c2")) + // assert(error == BinaryData("69b1e5a3e05a7b5478e6529cd1749fdd8c66da6f6db42078ff8497ac4e117e91a8cb9168b58f2fd45edd73c1b0c8b33002df376801ff58aaa94000bf8a86f92620f343baef38a580102395ae3abf9128d1047a0736ff9b83d456740ebbb4aeb3aa9737f18fb4afb4aa074fb26c4d702f42968888550a3bded8c05247e045b866baef0499f079fdaeef6538f31d44deafffdfd3afa2fb4ca9082b8f1c465371a9894dd8c2")) // error sent back to 3, 2, 1 and 0 val error1 = forwardErrorPacket(error, sharedSecret3) assert(error1 == BinaryData("c49a1ce81680f78f5f2000cda36268de34a3f0a0662f55b4e837c83a8773c22aa081bab1616a0011585323930fa5b9fae0c85770a2279ff59ec427ad1bbff9001c0cd1497004bd2a0f68b50704cf6d6a4bf3c8b6a0833399a24b3456961ba00736785112594f65b6b2d44d9f5ea4e49b5e1ec2af978cbe31c67114440ac51a62081df0ed46d4a3df295da0b0fe25c0115019f03f15ec86fabb4c852f83449e812f141a9395b3f70b766ebbd4ec2fae2b6955bd8f32684c15abfe8fd3a6261e52650e8807a92158d9f1463261a925e4bfba44bd20b166d532f0017185c3a6ac7957adefe45559e3072c8dc35abeba835a8cb01a71a15c736911126f27d46a36168ca5ef7dccd4e2886212602b181463e0dd30185c96348f9743a02aca8ec27c0b90dca270")) -// assert(error1 == BinaryData("08cd44478211b8a4370ab1368b5ffe8c9c92fb830ff4ad6e3b0a316df9d24176a081bab161ea0011585323930fa5b9fae0c85770a2279ff59ec427ad1bbff9001c0cd1497004bd2a0f68b50704cf6d6a4bf3c8b6a0833399a24b3456961ba00736785112594f65b6b2d44d9f5ea4e49b5e1ec2af978cbe31c67114440ac51a62081df0ed46d4a3df295da0b0fe25c0115019f03f15ec86fabb4c852f83449e812f141a93")) + // assert(error1 == BinaryData("08cd44478211b8a4370ab1368b5ffe8c9c92fb830ff4ad6e3b0a316df9d24176a081bab161ea0011585323930fa5b9fae0c85770a2279ff59ec427ad1bbff9001c0cd1497004bd2a0f68b50704cf6d6a4bf3c8b6a0833399a24b3456961ba00736785112594f65b6b2d44d9f5ea4e49b5e1ec2af978cbe31c67114440ac51a62081df0ed46d4a3df295da0b0fe25c0115019f03f15ec86fabb4c852f83449e812f141a93")) val error2 = forwardErrorPacket(error1, sharedSecret2) assert(error2 == BinaryData("a5d3e8634cfe78b2307d87c6d90be6fe7855b4f2cc9b1dfb19e92e4b79103f61ff9ac25f412ddfb7466e74f81b3e545563cdd8f5524dae873de61d7bdfccd496af2584930d2b566b4f8d3881f8c043df92224f38cf094cfc09d92655989531524593ec6d6caec1863bdfaa79229b5020acc034cd6deeea1021c50586947b9b8e6faa83b81fbfa6133c0af5d6b07c017f7158fa94f0d206baf12dda6b68f785b773b360fd0497e16cc402d779c8d48d0fa6315536ef0660f3f4e1865f5b38ea49c7da4fd959de4e83ff3ab686f059a45c65ba2af4a6a79166aa0f496bf04d06987b6d2ea205bdb0d347718b9aeff5b61dfff344993a275b79717cd815b6ad4c0beb568c4ac9c36ff1c315ec1119a1993c4b61e6eaa0375e0aaf738ac691abd3263bf937e3")) -// assert(error2 == BinaryData("6984b0ccd86f37995857363df13670acd064bfd1a540e521cad4d71c07b1bc3dff9ac25f41addfb7466e74f81b3e545563cdd8f5524dae873de61d7bdfccd496af2584930d2b566b4f8d3881f8c043df92224f38cf094cfc09d92655989531524593ec6d6caec1863bdfaa79229b5020acc034cd6deeea1021c50586947b9b8e6faa83b81fbfa6133c0af5d6b07c017f7158fa94f0d206baf12dda6b68f785b773b360fd")) + // assert(error2 == BinaryData("6984b0ccd86f37995857363df13670acd064bfd1a540e521cad4d71c07b1bc3dff9ac25f41addfb7466e74f81b3e545563cdd8f5524dae873de61d7bdfccd496af2584930d2b566b4f8d3881f8c043df92224f38cf094cfc09d92655989531524593ec6d6caec1863bdfaa79229b5020acc034cd6deeea1021c50586947b9b8e6faa83b81fbfa6133c0af5d6b07c017f7158fa94f0d206baf12dda6b68f785b773b360fd")) val error3 = forwardErrorPacket(error2, sharedSecret1) assert(error3 == BinaryData("aac3200c4968f56b21f53e5e374e3a2383ad2b1b6501bbcc45abc31e59b26881b7dfadbb56ec8dae8857add94e6702fb4c3a4de22e2e669e1ed926b04447fc73034bb730f4932acd62727b75348a648a1128744657ca6a4e713b9b646c3ca66cac02cdab44dd3439890ef3aaf61708714f7375349b8da541b2548d452d84de7084bb95b3ac2345201d624d31f4d52078aa0fa05a88b4e20202bd2b86ac5b52919ea305a8949de95e935eed0319cf3cf19ebea61d76ba92532497fcdc9411d06bcd4275094d0a4a3c5d3a945e43305a5a9256e333e1f64dbca5fcd4e03a39b9012d197506e06f29339dfee3331995b21615337ae060233d39befea925cc262873e0530408e6990f1cbd233a150ef7b004ff6166c70c68d9f8c853c1abca640b8660db2921")) -// assert(error3 == BinaryData("669478a3ddf9ba4049df8fa51f73ac712b9c20380cda431696963a492713ebddb7dfadbb566c8dae8857add94e6702fb4c3a4de22e2e669e1ed926b04447fc73034bb730f4932acd62727b75348a648a1128744657ca6a4e713b9b646c3ca66cac02cdab44dd3439890ef3aaf61708714f7375349b8da541b2548d452d84de7084bb95b3ac2345201d624d31f4d52078aa0fa05a88b4e20202bd2b86ac5b52919ea305a8")) + // assert(error3 == BinaryData("669478a3ddf9ba4049df8fa51f73ac712b9c20380cda431696963a492713ebddb7dfadbb566c8dae8857add94e6702fb4c3a4de22e2e669e1ed926b04447fc73034bb730f4932acd62727b75348a648a1128744657ca6a4e713b9b646c3ca66cac02cdab44dd3439890ef3aaf61708714f7375349b8da541b2548d452d84de7084bb95b3ac2345201d624d31f4d52078aa0fa05a88b4e20202bd2b86ac5b52919ea305a8")) val error4 = forwardErrorPacket(error3, sharedSecret0) assert(error4 == BinaryData("9c5add3963fc7f6ed7f148623c84134b5647e1306419dbe2174e523fa9e2fbed3a06a19f899145610741c83ad40b7712aefaddec8c6baf7325d92ea4ca4d1df8bce517f7e54554608bf2bd8071a4f52a7a2f7ffbb1413edad81eeea5785aa9d990f2865dc23b4bc3c301a94eec4eabebca66be5cf638f693ec256aec514620cc28ee4a94bd9565bc4d4962b9d3641d4278fb319ed2b84de5b665f307a2db0f7fbb757366067d88c50f7e829138fde4f78d39b5b5802f1b92a8a820865af5cc79f9f30bc3f461c66af95d13e5e1f0381c184572a91dee1c849048a647a1158cf884064deddbf1b0b88dfe2f791428d0ba0f6fb2f04e14081f69165ae66d9297c118f0907705c9c4954a199bae0bb96fad763d690e7daa6cfda59ba7f2c8d11448b604d12d")) -// assert(error4 == BinaryData("500d8596f76d3045bfdbf99914b98519fe76ea130dc22338c473ab68d74378b13a06a19f891145610741c83ad40b7712aefaddec8c6baf7325d92ea4ca4d1df8bce517f7e54554608bf2bd8071a4f52a7a2f7ffbb1413edad81eeea5785aa9d990f2865dc23b4bc3c301a94eec4eabebca66be5cf638f693ec256aec514620cc28ee4a94bd9565bc4d4962b9d3641d4278fb319ed2b84de5b665f307a2db0f7fbb757366")) + // assert(error4 == BinaryData("500d8596f76d3045bfdbf99914b98519fe76ea130dc22338c473ab68d74378b13a06a19f891145610741c83ad40b7712aefaddec8c6baf7325d92ea4ca4d1df8bce517f7e54554608bf2bd8071a4f52a7a2f7ffbb1413edad81eeea5785aa9d990f2865dc23b4bc3c301a94eec4eabebca66be5cf638f693ec256aec514620cc28ee4a94bd9565bc4d4962b9d3641d4278fb319ed2b84de5b665f307a2db0f7fbb757366")) // origin parses error packet and can see that it comes from node #4 diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/db/ChannelStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/db/ChannelStateSpec.scala index 0be200e6..ca6c8d4e 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/db/ChannelStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/db/ChannelStateSpec.scala @@ -6,10 +6,10 @@ import fr.acinq.eclair.channel.Helpers.Funding import fr.acinq.eclair.channel._ import fr.acinq.eclair.crypto.{ShaChain, Sphinx} import fr.acinq.eclair.payment.{Local, Relayed} -import fr.acinq.eclair.{UInt64, randomKey} import fr.acinq.eclair.transactions.Transactions.CommitTx import fr.acinq.eclair.transactions._ -import fr.acinq.eclair.wire.{ChannelCodecs, CommitSig, UpdateAddHtlc} +import fr.acinq.eclair.wire.{ChannelCodecs, UpdateAddHtlc} +import fr.acinq.eclair.{UInt64, randomKey} import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/db/SqliteNetworkDbSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/db/SqliteNetworkDbSpec.scala index 9eb01477..c9266d4f 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/db/SqliteNetworkDbSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/db/SqliteNetworkDbSpec.scala @@ -7,7 +7,6 @@ import fr.acinq.bitcoin.{Block, Crypto} import fr.acinq.eclair.db.sqlite.SqliteNetworkDb import fr.acinq.eclair.randomKey import fr.acinq.eclair.router.Announcements -import fr.acinq.eclair.wire.LightningMessageCodecs.channelAnnouncementCodec import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala index d8ddc985..7d4a39b2 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala @@ -364,6 +364,7 @@ class IntegrationSpec extends TestKit(ActorSystem("test")) with FunSuiteLike wit /** * We currently use p2pkh script Helpers.getFinalScriptPubKey + * * @param scriptPubKey * @return */ diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/interop/rustytests/SynchronizationPipe.scala b/eclair-core/src/test/scala/fr/acinq/eclair/interop/rustytests/SynchronizationPipe.scala index ea9e4a41..e316aca4 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/interop/rustytests/SynchronizationPipe.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/interop/rustytests/SynchronizationPipe.scala @@ -1,11 +1,10 @@ package fr.acinq.eclair.interop.rustytests import java.io.{BufferedWriter, File, FileWriter} -import java.util.UUID import java.util.concurrent.CountDownLatch import akka.actor.{Actor, ActorLogging, ActorRef, Stash} -import fr.acinq.bitcoin.{BinaryData, Crypto} +import fr.acinq.bitcoin.BinaryData import fr.acinq.eclair.channel._ import fr.acinq.eclair.transactions.{IN, OUT} diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/HtlcGenerationSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/HtlcGenerationSpec.scala index 5ab71217..bb3d0835 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/HtlcGenerationSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/HtlcGenerationSpec.scala @@ -3,9 +3,9 @@ package fr.acinq.eclair.payment import fr.acinq.bitcoin.{BinaryData, Block, Crypto} import fr.acinq.eclair.crypto.Sphinx import fr.acinq.eclair.crypto.Sphinx.{PacketAndSecrets, ParsedPacket} +import fr.acinq.eclair.payment.PaymentHop.nodeFee import fr.acinq.eclair.payment.PaymentLifecycle._ import fr.acinq.eclair.randomKey -import fr.acinq.eclair.payment.PaymentHop.nodeFee import fr.acinq.eclair.wire.{ChannelUpdate, LightningMessageCodecs, PerHopPayload} import org.junit.runner.RunWith import org.scalatest.FunSuite diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala index 1b786dbd..859fc812 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala @@ -1,7 +1,6 @@ package fr.acinq.eclair.payment import akka.actor.FSM.{CurrentState, SubscribeTransitionCallBack, Transition} -import akka.actor.Status.Failure import akka.testkit.{TestFSMRef, TestProbe} import fr.acinq.bitcoin.MilliSatoshi import fr.acinq.eclair.Globals @@ -12,7 +11,6 @@ import fr.acinq.eclair.router._ import fr.acinq.eclair.wire._ import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner -import org.scalatest.matchers.FailureMessage /** * Created by PM on 29/08/2016. diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/router/AnnouncementsSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/router/AnnouncementsSpec.scala index cca87740..58a7ad19 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/router/AnnouncementsSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/router/AnnouncementsSpec.scala @@ -1,7 +1,7 @@ package fr.acinq.eclair.router -import fr.acinq.bitcoin.{BinaryData, Block} import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey} +import fr.acinq.bitcoin.{BinaryData, Block} import fr.acinq.eclair.TestConstants.Alice import fr.acinq.eclair._ import fr.acinq.eclair.router.Announcements._ diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/router/BaseRouterSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/router/BaseRouterSpec.scala index 42f38eb2..34792f7f 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/router/BaseRouterSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/router/BaseRouterSpec.scala @@ -92,9 +92,9 @@ abstract class BaseRouterSpec extends TestkitBaseClass { // and answers with valid scripts watcher.send(router, ParallelGetResponse( IndividualResult(chan_ab, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_a, funding_b)))) :: Nil, lockTime = 0)), true) :: - IndividualResult(chan_bc, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_b, funding_c)))) :: Nil, lockTime = 0)), true) :: - IndividualResult(chan_cd, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_c, funding_d)))) :: Nil, lockTime = 0)), true) :: - IndividualResult(chan_ef, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_e, funding_f)))) :: Nil, lockTime = 0)), true) :: Nil + IndividualResult(chan_bc, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_b, funding_c)))) :: Nil, lockTime = 0)), true) :: + IndividualResult(chan_cd, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_c, funding_d)))) :: Nil, lockTime = 0)), true) :: + IndividualResult(chan_ef, Some(Transaction(version = 0, txIn = Nil, txOut = TxOut(Satoshi(1000000), write(pay2wsh(Scripts.multiSig2of2(funding_e, funding_f)))) :: Nil, lockTime = 0)), true) :: Nil )) // watcher receives watch-spent request watcher.expectMsgType[WatchSpentBasic] diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/router/RouteCalculationSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/router/RouteCalculationSpec.scala index 77d3992c..53072134 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/router/RouteCalculationSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/router/RouteCalculationSpec.scala @@ -3,9 +3,9 @@ package fr.acinq.eclair.router import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey} import fr.acinq.bitcoin.{BinaryData, Block, Crypto, MilliSatoshi} import fr.acinq.eclair.payment.PaymentRequest.ExtraHop -import fr.acinq.eclair.{Globals, randomKey, toShortId} -import fr.acinq.eclair.wire.{ChannelAnnouncement, ChannelUpdate, PerHopPayload} import fr.acinq.eclair.payment._ +import fr.acinq.eclair.wire.{ChannelAnnouncement, ChannelUpdate, PerHopPayload} +import fr.acinq.eclair.{Globals, randomKey, toShortId} import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner @@ -49,7 +49,7 @@ class RouteCalculationSpec extends FunSuite { ChannelDesc(5L, d, e) ) - val routes = for(i <- 0 until 10) yield Router.findRouteDijkstra(a, e, channels) + val routes = for (i <- 0 until 10) yield Router.findRouteDijkstra(a, e, channels) assert(routes.exists(_ != routes.head)) } @@ -201,7 +201,7 @@ class RouteCalculationSpec extends FunSuite { val extraRoute = PaymentHop.buildExtra(reverseRoute, amount.amount) assert(extraRoute === List(ExtraHop(PublicKey("02f0b230e53723ccc331db140edc518be1ee5ab29a508104a4be2f5be922c928e8"), 24412456671576064L, 547005, 144), - ExtraHop(PublicKey("032b4af42b5e8089a7a06005ead9ac4667527390ee39c998b7b0307f0d81d7f4ac") ,23366821113626624L, 547000, 144))) + ExtraHop(PublicKey("032b4af42b5e8089a7a06005ead9ac4667527390ee39c998b7b0307f0d81d7f4ac"), 23366821113626624L, 547000, 144))) // Sender side @@ -223,11 +223,16 @@ class RouteCalculationSpec extends FunSuite { test("stale channels pruning") { // set current block height Globals.blockCount.set(500000) + // we only care about timestamps def channelAnnouncement(shortChannelId: Long) = ChannelAnnouncement("", "", "", "", "", "", shortChannelId, randomKey.publicKey, randomKey.publicKey, randomKey.publicKey, randomKey.publicKey) + def channelUpdate(shortChannelId: Long, timestamp: Long) = ChannelUpdate("", "", shortChannelId, timestamp, "", 0, 0, 0, 0) + def desc(shortChannelId: Long) = ChannelDesc(shortChannelId, randomKey.publicKey, randomKey.publicKey) + def daysAgoInBlocks(daysAgo: Int): Int = Globals.blockCount.get().toInt - 144 * daysAgo + def daysAgoInSeconds(daysAgo: Int): Long = Platform.currentTime / 1000 - daysAgo * 24 * 3600 // a is an old channel with an old channel update => PRUNED diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/router/RouterSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/router/RouterSpec.scala index 24aa4a33..a14614ba 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/router/RouterSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/router/RouterSpec.scala @@ -13,7 +13,6 @@ import fr.acinq.eclair.{randomKey, toShortId} import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner -import scala.concurrent.Future import scala.concurrent.duration._ /** diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/transactions/TestVectorsSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/transactions/TestVectorsSpec.scala index b79e9b3e..629d3f92 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/transactions/TestVectorsSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/transactions/TestVectorsSpec.scala @@ -1,14 +1,12 @@ package fr.acinq.eclair.transactions -import fr.acinq.bitcoin._ import fr.acinq.bitcoin.Crypto.{Point, PrivateKey, PublicKey, Scalar} +import fr.acinq.bitcoin._ import fr.acinq.eclair.channel.Helpers.Funding import fr.acinq.eclair.crypto.Generators import fr.acinq.eclair.transactions.Transactions.{HtlcSuccessTx, HtlcTimeoutTx, TransactionWithInputInfo} import fr.acinq.eclair.wire.UpdateAddHtlc -import org.junit.runner.RunWith import org.scalatest.FunSuite -import org.scalatest.junit.JUnitRunner import scala.io.Source diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/wire/LightningMessageCodecsSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/wire/LightningMessageCodecsSpec.scala index ea00191d..a1d84764 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/wire/LightningMessageCodecsSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/wire/LightningMessageCodecsSpec.scala @@ -5,8 +5,8 @@ import java.net.{InetAddress, InetSocketAddress} import fr.acinq.bitcoin.Crypto.{PrivateKey, Scalar} import fr.acinq.bitcoin.{BinaryData, Block, Crypto} import fr.acinq.eclair.crypto.Sphinx +import fr.acinq.eclair.wire.LightningMessageCodecs._ import fr.acinq.eclair.{UInt64, randomBytes, randomKey} -import fr.acinq.eclair.wire.LightningMessageCodecs.{lightningMessageCodec, rgb, socketaddress, uint64ex, zeropaddedstring} import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner diff --git a/eclair-node-gui/src/main/resources/gui/main/channelPane.fxml b/eclair-node-gui/src/main/resources/gui/main/channelPane.fxml index dc22151e..2d91ce83 100644 --- a/eclair-node-gui/src/main/resources/gui/main/channelPane.fxml +++ b/eclair-node-gui/src/main/resources/gui/main/channelPane.fxml @@ -9,9 +9,9 @@ - + - + @@ -24,8 +24,9 @@ - + HBox.hgrow="ALWAYS" focusTraversable="false"/> +