1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-03-14 20:01:27 +01:00
Commit graph

805 commits

Author SHA1 Message Date
dpad85
34798242e6
Back to development 2019-07-10 11:01:27 +02:00
dpad85
0c3901edde
Release v0.3.2-android 2019-07-10 10:59:42 +02:00
sstone
2049522626
Merge branch 'master' into android 2019-07-09 16:53:57 +02:00
Fabrice Drouin
7d89dd01a1
Electrum: update checkpoints (#1067)
Checkpoints generated on July 9th 2019
2019-07-09 16:00:18 +02:00
Pierre-Marie Padiou
e5c5a4cfbc
Handle unknown fields in network announcements (#1047)
All the data contained in `node_announcement`, `channel_announcement`
and `channel_update` is to be included in the signature, including
unknown trailing fields. We were ignoring them, causing signature
verification to fail when there was unknown fields.

In the case of `channel_update` there is a backward compatibility issue
to handle, because when persisting channel data in state `NORMAL`, we
used to store the `channel_update` followed by other data, and without
prefixing it with size information.

To work around that we use the same trick as before, based on an
additional discriminator codec.
2019-07-08 17:14:01 +02:00
Bastien Teinturier
22548733e6
Add a few improvements to tlv. (#1065)
Hide some internals (tlvFallback, generictlv codecs).
Add a length-prefixed tlv stream codec.
2019-07-08 10:05:18 +02:00
Pierre-Marie Padiou
683294ee57
Use a RelayResult class instead of an Either (#1064)
It is functionnaly the same but it's cleaner and removes the need for
tuples in the success case.
2019-07-04 14:06:05 +02:00
Fabrice Drouin
bbe07c2c42
Set version to 0.3.2-SNAPSHOT (#1062) 2019-07-04 10:00:44 +02:00
Fabrice Drouin
6906ecb403
Set version to v0.3.1 (#1061) 2019-07-03 17:23:12 +02:00
araspitzu
20ea9d0e1d
Reject payments for expired invoices (#1057)
* Reject payments for expired invoices
2019-07-03 15:52:03 +02:00
pm47
376b968b8f
Merge branch 'master' into android 2019-07-03 14:16:13 +02:00
Pierre-Marie Padiou
32145e8d6a
Connect immediately on restart, then wait (#1040)
* connect immediately on restart, then wait

This is to allow herd effect when we restart the app and have numerous
peers.

Also removed the unnecessary transition and cleaned up delay
computation.

* always reconnect immediately when disconnected

Whether we go to this state from startup, or after getting disconnected.

It makes the transition logic simpler, and the potential herd effect at
startup is inevitable anyway since our peers will try to reconnect too.

* add randomization when reconnecting

* randomize delay for first reconnection attempt after startup

* make some parameters configurable
2019-07-03 13:15:20 +02:00
Pierre-Marie Padiou
f724efaa76
Close the channel if the funding tx never confirms (#1034)
If we are fundee and after 5 days the funding isn't even in the mempool,
then we give up waiting and consider the channel closed. Note that if
the funding tx stays unconfirmed forever we won't give up waiting.

If we are funder, we never give up until the funding tx is double spent,
and we periodically republish it.

This applies to states `WAIT_FOR_FUNDING_CONFIRMED` and `CLOSING` (and
also `OFFLINE`/`SYNCING` when underlying state is
`WAIT_FOR_FUNDING_CONFIRMED`).

Also, added a generic way of passing context to `ElectrumClient`
requests/responses.

Fixes #1029.
2019-07-03 12:00:00 +02:00
araspitzu
667444cd0e
Check 'initialblockdownload' from bitcoind during startup (#1058) 2019-07-02 17:31:53 +02:00
pm47
74ca047535
Merge branch 'master' into android 2019-07-02 13:59:33 +02:00
Bastien Teinturier
1cc14aeda3
Add TLV and TLV stream codec support (#1045)
TLV (tag-length-value) types and TLV streams have been defined in the following spec PR: https://github.com/lightningnetwork/lightning-rfc/pull/607

New Lightning Messages should use TLV extensively instead of ad-hoc per-message encoding. This also allows ignoring unknown odd TLV types, which lets implementers safely test new features on mainnet without impacting legacy nodes. It also allows type re-use which speeds up new features development.

Also cleaned-up and refactored common codecs.
2019-07-02 11:53:14 +02:00
Anton Kumaigorodski
c4f07e8742 Add more data to usablebalances API method (#1053)
Now it additionally returns remote `nodeId` and `shortChannelId` for each channel. Also negative balances are represented as `0`s.
2019-07-02 11:20:02 +02:00
Anton Kumaigorodski
a35d50d4c8 Add balances API method (#962)
Currently balances can be obtained from `channels` call but this requires a lot of work on caller side and also some specific knowledge (reserves, commit tx fee, in-flight payments), so this new `balances` endpoint only returns a correct balance info for each channel.
2019-06-26 12:05:51 +02:00
araspitzu
de50cc437e Remove old service and related docs (#1046) 2019-06-24 17:46:55 +02:00
Pierre-Marie Padiou
316ba02ff8
Ack unhandled lightning messages (#1042)
In the event when we receive an unexpected message, the `Peer` was just logging a warning and not sending an `Ack` to the `TransportHandler`. This resulted in a stuck connection, because no more data was read on the connection.

Fixes #1037.
2019-06-20 11:40:01 +02:00
Pierre-Marie Padiou
38696b56e4
Minor fixes (#1043)
* fixed javadoc

* make bitcoind only bind on localhost for tests
2019-06-19 11:36:30 +02:00
Bastien Teinturier
a53145a6da
Electrum: add data to TxIdFromPosResponse. (#1038)
To make the response usable, we need to copy the request input (block height and transaction position).
2019-06-17 12:10:10 +02:00
sstone
54d23a7675 Merge master into android, bump version to 0.3.2-android-SNAPSHOT 2019-06-15 12:59:00 +02:00
Anton Kumaigorodski
cb1196cf95 Correctly decode requests without multipliers (#1020)
Since MAX_PAYMENT_AMOUNT has been removed we may now get payment requests without multiplier which means a whole bitcoin is requested.
2019-06-14 15:01:10 +02:00
Pierre-Marie Padiou
a3563e38bb
Removed cached codec (#1036)
It turns out that performance gains of the cached codec are not that
great, and they come at a cost of significant pressure on the GC. In
other words: premature optimization.

When removed, the heap usage becomes very stable, which is much better
than hypothetical performance gains.

Fixes #1031.
2019-06-14 14:04:15 +02:00
Bastien Teinturier
b4adff2dc4 Electrum: add id_from_pos (#1035)
This allows getting a transaction id from a short channel id.
2019-06-14 13:25:37 +02:00
Fabrice Drouin
31022ceca5
Use compact encoding for signatures (64 bytes) instead of DER (#1014)
* use 64B representation instead of DER for sigs

It is more compact, and as an added bonus it frees us from the
completely unrelated Bitcoin-specific `0x01` trailing sig hash.

Note that we already used the 64B representation for storage everywhere,
except in `ChannelCodecs.htlcTxAndSigsCodec`, which required a backward
compatibility codec. Added a nonreg test for this.

* Use updated secp256k1 JNI bindings

* Replace scalar with private key and point with public key

We now use the simplified/unified design proposed in bitcoin-lib where:
- there are no more specific types for scalar/point
- private and public keys are compressed unless explicitly requested

* Generate and use 32 bytes seeds (and not 33)

We used serialized random private keys which were represented a 33 bytes (with a 01 suffix).
Using random 32 bytes values is more consistent.
We must make sure that upgraded apps that already have a 33 bytes seed will still generate the same secrets, which is why LocalKeyManager still uses the 01 suffix when needed
2019-06-14 11:52:01 +02:00
araspitzu
199d6041c5 Output txid and serialized tx in transaction json serializer (#1033) 2019-06-13 18:10:09 +02:00
Pierre-Marie Padiou
db334380b3
Clean pending htlcs db (#1027)
We store `CMD_FULFILL_HTLC`/`CMD_FAIL_HTLC`/`CMD_FAIL_MALFORMED_HTLC` in
a database (see `CommandBuffer`) because we don't want to lose
preimages, or to forget to fail incoming htlcs, which would lead to
unwanted channel closings.

But we currently only clean up this database on success, and because of
the way our watcher works, in a scenario where a downstream channel has
gone to the blockchain, it may send several times the same command. Only
the first one will be acked and cleaned up by the upstream channel,
causing the remaining commands to stay forever in the "pending relay
db".

With this change we clean up the commands when they fail too.

We also clean up the pending relay db on startup.
2019-06-13 18:08:34 +02:00
Pierre-Marie Padiou
849b6bd22b
Smarter restore logic for closing channels (#1015)
If the closing type is known:
 - there is no need to watch the funding tx because it has already
 been spent and the spending tx has already reached min_depth
 - there is no need to attempt to publish transactions for other
 type of closes.

* differentiate current/next remote close

We can still match on the trait `RemoteClose` if we don't need that
level of precision.
2019-06-12 12:29:31 +02:00
araspitzu
818199e8f4
Peer reconnection address from node announcements (#1009)
* Use node announcements as fallback to load peer addresses during startup

* Add NetworkDb.getNode to retrieve a node_announcement by nodeId

* When connecting to a peer use node_announcement as fallback for its IP address

* Support connection to peer via pubKey

* Increase finite max of exponential backoff time to 1h.

* Add peer disconnect API call
2019-06-11 17:39:52 +02:00
araspitzu
9087ceeb5f Add feeThresholdSat and maxFeePct parameters to payments API (#1023) 2019-06-11 15:34:47 +02:00
Pierre-Marie Padiou
f180e54b03
Close channel if funding tx times out (#1016)
This only happens when we are fundee. We *could* have some funds at
stake if there was a non-zero `push_msat`, but we already allows 5 days
for the funding tx to confirm so the best option is probably to forget
about the channel.
2019-06-11 14:31:23 +02:00
dpad85
69cec60493
Release v0.3.1-android 2019-06-04 11:05:08 +02:00
Pierre-Marie Padiou
b33c9ecaac
Smarter relay logic (#1011)
When relaying a payment, we look in the onion to find the next
`shortChannelId`. But we may choose a different channel (to the same
node), because the requested channel may not have enough balance, of for
some other reasons, as permitted by the spec.

Currently we limit ourselves to only two attempts: one with a
"preferred" channel, and one with the originally requested channel if is
different from the preferred one. This has drawbacks, because if we have
multiple channels to the same node, we may not be able to relay a
payment if the "preferred" channel is currently unavailable (e.g.
because of an htlc in-flight value that is too high).

We now retry as many times as there are available channels, in our order
of preference, and if all fail, then we return a failure message for the
originally requested channel.
2019-06-03 19:10:14 +02:00
sstone
07898e526a
Merge branch 'master' into android 2019-06-03 14:48:33 +02:00
Fabrice Drouin
cd78c9ecdd
Electrum: update server list (#1022)
* Electrum: update server list

* Electrum: set client name to 3.3.6
2019-06-03 13:45:51 +02:00
Dominique
3e46475f9f Initialize global feerate with default from conf (#1019)
`Globals.feeratePerKB` is an atomic reference initialized to `null` and
is asynchronously set by the fee provider only once it's ready. This
means that it is possible to retrieve a null object from feeratePerKB,
scenario that must be handled separately to prevent any issues.

This commit now initialize `Globals.feeratePerKB` with the default
values set in the configuration file. This makes sure that the
feerate is always set to a meaningful value.
2019-06-03 09:44:06 +02:00
Pierre-Marie Padiou
c4b7ade038
Removed PaymentRequest.MAX_AMOUNT (#1018)
It was obsole since
068b0bccf9.

Note that we use a signed long, but it doesn't matter since 2^64
milli-satoshis is greater than the total number of bitcoins.
2019-05-28 14:14:17 +02:00
Pierre-Marie Padiou
b82d7211cc
Set handleCommandError to WARN (#1012)
Those are not fatal errors for channels.
2019-05-27 17:33:20 +02:00
pm47
da184ee23d
Merge branch 'master' into android 2019-05-23 16:42:48 +02:00
Fabrice Drouin
648f57276a Electrum: consistently retrieve wallet transactions (#1010)
* Electrum: update mainnet and testnet servers list

* Electrum: request missing history transactions on reconnect

Upon connection/reconnection, ask for transactions that are included in our history but
which we don't have and don't have a pending request for.

* Electrum: add disconnect/reconnect tests

Simulate disconnections and check that wallet eventually gets it history and transactions.
2019-05-23 16:36:54 +02:00
pm47
60a650519d
Merge branch 'master' into android 2019-05-22 17:35:30 +02:00
Fabrice Drouin
f05ee06cf6 Merge master into Android (#1002)
* Fix eclair-cli to work with equal sign in arguments (#926)

* Fix eclair cli argument passing

* Modify eclair-cli to work with equals in arguments

* Eclair-cli: show usage when wrong params are received

* Remove deprecated call from eclair-cli help message [ci skip]

* Make Electrum tests pass on windows (#932)

There was an obscure Docker error when trying to start an Electrum
server in tests. [1]

It appears that there is a conflict between Docker and Hyper-V on some
range of ports.

A workaround is to just change the port we were using.

[1] https://github.com/docker/for-win/issues/3171

* API: fix fee rate conversion (#936)

Our `open` API calls expects an optional fee rate in satoshi/byte, which is the most widely
used unit, but failed to convert to satoshi/kiloweight which is the standard in LN.
We also check that the converted fee rate cannot go below 253 satoshi/kiloweight.

* Expose the websocket over HTTP GET to work properly with basic auth (#934)

* Expose the websocket over HTTP GET
* Add test for basic auth over websocket endpoint

* Set max payment attempts from configuration (#931)

With a default to `5`.

* Add a proper payments database (#885)

There is no unique identifier for payments in LN protocol. Critically,
we can't use `payment_hash` as a unique id because there is no way to
ensure unicity at the protocol level.

Also, the general case for a "payment" is to be associated to multiple
`update_add_htlc`s, because of automated retries. We also routinely
retry payments, which means that the same `payment_hash` will be
conceptually linked to a list of lists of `update_add_htlc`s.

In order to address this, we introduce a payment id, which uniquely
identifies a payment, as in a set of sequential `update_add_htlc`
managed by a single `PaymentLifecycle` that ends with a `PaymentSent` or
`PaymentFailed` outcome.

We can then query the api using either `payment_id` or `payment_hash`.
The former will return a single payment status, the latter will return a
set of payment statuses, each identified by their `payment_id`.

* Add a payment identifier

* Remove InvalidPaymentHash channel exception

* Remove unused 'close' from paymentsDb

* Introduce sent_payments in PaymentDB, bump db version

* Return the UUID of the ongoing payment in /send API

* Add api to query payments by ID

* Add 'fallbackAddress' in /receive API

* Expose /paymentinfo by paymentHash

* Add id column to audit.sent table, add test for db migration

* Add invoices to payment DB

* Add license header to ExtraDirective.scala

* Respond with HTTP 404 if the corresponding invoice/paymentHash was not found.

* Left-pad numeric bolt11 tagged fields to have a number of bits multiple of five (bech32 encoding).

* Add invoices API

* Remove CheckPayment message

* GUI: consume UUID reply from payment initiator

* API: reply with JSON encoded response if the queried element wasn't found

* Return a payment request object in /receive

* Remove limit of pending payment requests!

* Avoid printing "null" fields when serializing an invoice to json

* Add index on paymentDb.sent_payments.payment_hash

* Order results in descending order in listPaymentRequest

* Electrum: do not persist transaction locks (#953)

Locks held on utxos that are used in unpublished funding transactions should not be persisted.
If the app is stopped before the funding transaction has been published the channel is forgotten
and so should be locks on its funding tx utxos.

* Added a timeout for channel open request (#928)

Until now, if the peer is unresponsive (typically doesn't respond to
`open_channel` or `funding_created`), we waited indefinitely, or until the
connection closed.

It translated to an API timeout for users, and uncertainty about the
state of the channel.

This PR:
- adds an optional `--openTimeoutSeconds` timeout to the `open` endpoint, that will
actively cancel the channel opening if it takes too long before reaching
state `WAIT_FOR_FUNDING_CONFIRMED`.
- makes the `ask` timeout configurable per request with a new `--timeoutSeconds`
- makes the akka http timeout slightly greater than the `ask` timeout

Ask timeout is set to 30s by default.

* Set `MAX_BUFFERED` to 1,000,000 (#948)

Note that this doesn't mean that we will buffer 1M objects in memory:
those are just pointers to (mostly) network announcements that already
exist in our routing table.

Routing table has recently gone over 100K elements (nodes,
announcements, updates) and this causes the connection to be closed when
peer requests a full initial sync.

* Fix Dockerfile maven binary checksum (#956)

The Maven 3.6.0 SHA256 checksum was invalid and caused the docker build to fail.

* Add channel errors in audit db (#955)

We now keep track of all local/remote channel errors in the audit db.

* Added simple plugin support (#927)

Using org.clapper:classutil library and a very simple `Plugin` interface.

* Live channel database backup (#951)

* Backup running channel database when needed

Every time our channel database needs to be persisted, we create a backup which is always
safe to copy even when the system is busy.

* Upgrade sqlite-jdbc to 3.27.2.1

* BackupHandler: use a specific bounded mailbox

BackupHandler is now private, users have to call BackupHandler.props() which always
specifies our custom bounded maibox.

* BackupHandler: use a specific threadpool with a single thread

* Add backup notification script

Once a new backup has been created, call an optional user defined script.

* Update readme with bitcoin 0.17 instructions (#958)

This has somehow been missed by PR #826.

* Backup: explicitely specify move options (#960)

* Backup: explicitely specify move options

We now specify that we want to atomically overwrite the existing backup file with the new one (fixes
a potential issue on Windows).
We also publish a specific notification when the backup process has been completed.

* Print stack trace when crashing during boot sequence (#949)

* Print stack trace when crashing during boot sequence

* Use friendly message when db compatibility check fails

* ElectrumWallet should not send ready if syncing (#963)

This commit is already embedded in version `0.2-android-beta22`.

* Channel: Log additional data (#943)

* Channel: Log additional data

Log local channel parameters, and our peer's open or accept message.
This should be enough to recompute keys needed to recover funds in case of unilateral close.

* Electrum: make debug logs shorter (#964)

* Better handling of closed channels (#944)

* Remove closed channels when application starts

If the app is stopped just after a channel has transition from CLOSING to CLOSED, when the  application starts again if will be restored as CLOSING. This commit checks channel data and remove closed channels instead of restoring them.

* Channels Database: tag closed channels but don't delete them

Instead we add a new `closed` column that we check when we restore channels.

* Document how we check and remove closed channels on startup

* Do not print the stacktrace on stderr when there is an error at boot (#966)

* Do not print the stacktrace on stdout when there is an error at boot

* Fix flaky test in PaymentLifecycleSpec (#967)

* Use local random pamentHash for each test in paymentlifecyclespec, intercept the route request before the router.

* Rename `eclair.bak` to `eclair.sqlite.bak` (#968)

This removes any ambiguity about what the content of the file is about.

* Fixed concurrency issue in `IndexedObservableList` (#961)

Update map with new indexes after element is removed

Fixes #915

* Various fix and improvements in time/timestamp handling (#971)

This PR standardizes the way we compute the current time as unix timestamp 

- Scala's Platform is used and the conversion is done via scala's concurrent.duration facilities
- Java's Instant has been replaced due to broken compatibility with android
- AuditDB events use milliseconds (fixes #970)
- PaymentDB events use milliseconds
- Query filters for AuditDB and PaymentDB use seconds

* API: Support query by `channelId` or `shortChannelId` everywhere (#969)

Add support for querying a channel information by its `shortChannelId`.

* Smarter strategy for sending `channel_update`s (#950)

The goal is to prevent sending a lot of updates for flappy channels.

Instead of sending a disabled `channel_update` after each disconnection, 
we now wait for a payment to try to route through the channel and only 
then reply with a disabled `channel_update` and broadcast it on the
network.

The reason is that in case of a disconnection, if noone cares about that
channel then there is no reason to tell everyone about its current
(disconnected) state.

In addition to that, when switching from `SYNCING`->`NORMAL`, instead
of emitting a new `channel_update` with flag=enabled right away, we wait
a little bit and send it later. We also don't send a new `channel_update` if
it is identical to the previous one (except if the previous one is outdated).

This way, if a connection to a peer is unstable and we keep getting
disconnected/reconnected, we won't spam the network.

The extra delay allows us to remove the change made in #888, which was
a workaround in case we generated `channel_update` too quickly.

Also, increased refresh interval from 7 days to 10 days. There was no
need to be so conservative.

Note that on startup we still need to re-send `channel_update` for all 
channels in order to properly initialize the `Router` and the `Relayer`.
Otherwise they won't know about those channels, and e.g. the 
`Relayer` will return `UnknownNextPeer` errors.

But we don't need to create new `channel_update`s in most cases, so 
this should have little or no impact to gossip because our peers will
already know the updates and will filter them out.

On the other hand, if some global parameters (like relaying fees) are
changed, it will cause the creation a new `channel_update` for all
channels.

* Fixed overflow issue with max duration (#975)

This is a regression caused by #971, because `Duration` has a max value of `Long.MaxValue` *nanoseconds*, not *seconds*.

* Use proper closing type in `ChannelClosed` event (#977)

There was actually a change introduced by #944 where we used
`ClosingType.toString` instead of manually defining types, causing a
regression in the audit database.

* Update bash autocompletion for eclair-cli (#983)

* Update bash autocompletition file to suggest all the endpoints

* Update list of commands in eclair-cli help message

* Replace `UnknownPaymentHash` and `IncorrectPaymentAmount` with `IncorrectOrUnknownPaymentDetails` (#984)

See https://github.com/lightningnetwork/lightning-rfc/pull/516 and https://github.com/lightningnetwork/lightning-rfc/pull/544

* Wireshark dissector support (#981)

* Transport: add support for encryption key logging.
This is the format the wireshark lightning-dissector uses to be able to decrypt lightning messages.

* Enrich test for internal eclair API implementation (fr.acinq.eclair.Eclair.scala) (#938)

* Add test to EclairImpl for `/send`, `/allupdates` and `/forceclose/`

* Set default chain to "mainnet" (#989)

Eclair is now configured to run on mainnet by default.

* Set tcp client timeout to 20s (#990)

So that it fails before the ask/api time out.

* Add bot support for code coverage (codecov) (#982)

* Add scoverage-maven-plugin dependency

* Update travis build to generate a scoverage report

* Add custom codecov configuration to have nice PR comments

* Add badge for test coverage in readme

* Accept `commit_sig` without changes (#988)

LND sometimes sends a new signature without any changes, which is a
(harmless) spec violation.

Note that the test was previously not failing because it wasn't specific
enough. The test now fails and has been ignored.

* Ignore subprojects eclair-node/eclair-node-gui in the codecov report (#991)

* Use bitcoind fee estimator first (#987)

* use bitcoind fee provider first

* set default `smooth-feerate-window`=6

* Configuration: increase fee rate mismatch threshold

We wil accept fee rates that up to 8x bigger or smaller than our local fee rate

* Updated license header (#992)

* Release v0.3 (#994)

* gui: include javafx native libraries for windows, mac, linux

* Release v0.3

* Set version to 0.3.1-SNAPSHOT

* Improved test coverage of `io` package (#996)

* improved test coverage of `NodeURI`

* improved test coverage of `Peer`

* Fix TextUI

* BackupHandler: use renameTo() on Android

Most Path methods are not available at our current API level
2019-05-21 17:56:47 +02:00
Pierre-Marie Padiou
92e2d21eab
Make htlc-reaper a top-level actor (#1013)
The way we handle requests to `Switchboard` assume that all children are `Peer`s. This led the `peer` API request to timeout.
2019-05-21 17:36:29 +02:00
araspitzu
101bcd7c50
Send to route (#952)
* Add /sendtoroute API and functionality

* Do not use extractor pattern in PaymentLifecycle::SendPaymentToRoute

* /sendtoroute: support route parameter as comma separated list

* Add test for 'sendtoroute' in EclairImplSpec
2019-05-20 15:20:53 +02:00
araspitzu
cfaa5508eb
Increase Service and EclairImpl test coverage (#1004)
* /payinvoice: assert the override amount is being used in the invoice

* /updaterelayfee: assert the values passed through the API call are forwarder to EclairImpl

* 'receive' API: test for fallback address usage and parameters passing

* 'close' API: test for parameters handling

* 'networkFees': test for default parameters

* Add test dependency mockito-scala, rewrite a test using the mock framework

* Factor out query filter parsing in EclairImpl, Add test for networkFees/audit/allinvoice

* Move getDefaultTimestampFilters in companion object, group together EclairImpl-scoped classes
2019-05-20 14:22:09 +02:00
araspitzu
80340c1fbf
API: optionally use a user supplied preimage when creating invoices (#965)
* Add support for custom preimage in /createinvoice API

* Add test for using a custom preimage in payment request
2019-05-17 17:11:38 +02:00
Pierre-Marie Padiou
8718959164
Improved test coverage of io package (#996)
* improved test coverage of `NodeURI`

* improved test coverage of `Peer`
2019-05-10 19:53:50 +02:00
Fabrice Drouin
847d0999c8
Release v0.3 (#994)
* gui: include javafx native libraries for windows, mac, linux

* Release v0.3

* Set version to 0.3.1-SNAPSHOT
2019-05-10 11:02:08 +02:00