Coder Social home page Coder Social logo

acinq / lightning-kmp Goto Github PK

View Code? Open in Web Editor NEW
82.0 82.0 24.0 8.07 MB

An implementation of the Lightning Network in Kotlin.

License: Apache License 2.0

Kotlin 99.02% Shell 0.33% Dockerfile 0.04% Swift 0.61% C 0.01% Objective-C 0.01%
bitcoin lightning

lightning-kmp's People

Contributors

araspitzu avatar cedricgatay avatar dpad85 avatar pgrange avatar pm47 avatar remyers avatar robbiehanson avatar salomonbrys avatar sstone avatar t-bast avatar thomash-acinq avatar tomcarton avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lightning-kmp's Issues

Persist channel data

This includes:

  • storing channel data locally
  • supporting "encrypted peer backups"

Unable to build iOS fatFramework

The readme says I can use this command to build a fat framework for iOS:

./gradlew :common:createFatFramework

However, this command fails:

./gradlew :common:createFatFramework -Pinclude_android=false

> Configure project :phoenix-shared
Kotlin Multiplatform Projects are an Alpha feature.

FAILURE: Build failed with an exception.

* What went wrong:
Project 'common' not found in root project 'phoenix'.

Although I am successful building via:

./gradlew publishToMavenLocal

What is the proper command I should be using to build the framework for iOS ?

Control ElectrumWatcher behavior

It appears that the ElectrumWatcher is doing too much work, or is processing too many times the redundant events. Leading to some overhead processing on the Peer side.

OutgoingPaymentHandler: disambiguate insufficient_balance error

Currently, there is a single error for INSUFFICIENT_BALANCE. I propose separating this into 2 cases:

INSUFFICIENT_BALANCE_BASE, // Not enough capacity in channel(s) to support paymentAmount
INSUFFICIENT_BALANCE_FEES, // Not enough capacity in channel(s) after accounting for fees

The average user (non-techie) is accustomed to the credit card model, where the merchant pays fees, but the customer does not. Receiving a generic "insufficient balance" error message could easily be confusing if the "base" capacity exists.

In other words, user looks at their balance. It says X. They attempt to send X. They get an error message saying "insufficient balance". Then they get upset with Phoenix, and give us a bad review.

Thus differentiating these cases could prove useful for the UI.

(As per discussion in issue #68)

Reconnect when peer connection is lost

We currently do not detect that peer connections are lost, which makes the app unusable until it is restarted again.
We should instead automatically retry to connect, with an exponential backoff strategy (and an upper bound of 30 seconds).

Rework channel errors

Eclair's RES_ADD_FAILED / RES_ADD_SETTLED model is probably a good inspiration.

We should also take this opportunity to handle HTLCs that are settled on-chain.

Add support for multi-trampoline payments

Electrum has made great progress recently in their trampoline implementation.
Electrum wallet will ship with a model similar to Phoenix, where they connect to the Electrum node which provides trampoline routing.

We should use a static list of known trampoline nodes, which would contain for now:

  • ACINQ (03864ef025fde8fb587d989186ce6a4a186895ee44a926bfc370e2c366597a3f8f)
  • Electrum (03ecef675be448b615e6176424070673ef8284e0fd19d8be062a6cb5b130a0a0d1)

When paying an invoice that sets the trampoline feature bit, we should look at its routing hints to see what node it's connected to.
If it's connected to a different trampoline node from ours, we should use 2 trampoline hops to reach the recipient.

The end result would be payments with this kind of route:

   +--------------------+ +-------------------------------------------+   +-----------------------+
   |                    | |                                           |   |                       |
   |                    v |                                           v   |                       v
Phoenix -------------> ACINQ ------------> N1 ---> ... ------------> Electrum -------------> Electrum Wallet
          (private)            (public)                  (public)               (private)

Infinite loop (+ stack overflow crash)

Here's the flow that initiates the infinite loop:

1.) receive ChannelEvent.NewBlock (comes from electrum connection)
2.) Peer.run()
3.a) Peer.processEvent()
3.b) event is WrappedChannelEvent && event.channelId = zeros
4.) ChannelState.process()
5.a) Offline.processInternal()
5.b) event is ChannelEvent.NewBlock
5.c) invokes state.process(event) ----> return to step 4, start infinite loop

This can occur if the ElectrumConnection is up, but the PeerConnection isn't.

Use unsigned integers once fully supported in Kotlin

Unsigned integers have been introduced as beta in Kotlin 1.3.
We use it in some places, but not everywhere we should.
Changing from a signed type to an unsigned type is a binary incompatible change, so we should be careful with backwards-compatibility when switching the whole codebase.

Note that we'll need to update bitcoin-kmp first to use unsigned integers.

IncomingPayment.received.amount is incorrect (when NewChannel)

When receiving an IncomingPayment, such that a new channel is created, the IncomingPayment.received.amount doesn't match the user's balance:

Screen Shot 2021-02-02 at 10 43 10

Screen Shot 2021-02-02 at 10 43 14

Screen Shot 2021-02-02 at 10 43 24

Steps to reproduce:

  • Start with a clean wallet (no existing channels)
  • Receive an incoming payment of 15,000 sat
  • Notice that wallet balance is reported as 14,000 sat (as is channel balance)
  • Notice that IncomingPayment.received.amount = 14,985 sat, with fees of only 15 sat

Connection handling issue

It looks like our connection handlers consider themselves disconnected before the tcp socket is really disconnected.
This severely breaks some core assumptions on lightning message delivery...

Here are logs showing that Phoenix thinks it's disconnected before receiving a commit_sig, but it has actually been received in the tcp socket. When we reconnect we receive that commit_sig before going through the init / channel_reestablish flow, which breaks the channel restore logic.

INFO: 2021-01-21T11:07:47.686302 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 sending UpdateFulfillHtlc(channelId=ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496, id=1, paymentPreimage=b95e2fc2563d1272d7b291b86b3ca7489238029614af28b77f7c2c1a520954ba)
INFO: 2021-01-21T11:07:47.984533 | f.a.e.channel.ChannelState: c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 built remote commit number=9 toLocalMsat=95468058 toRemoteMsat=30551942 htlc_in= htlc_out= feeratePerKw=FeeratePerKw(feerate=5000 sat) txid=a550cb48571dc3e2e188f2bd7233f4e05cefaa2f057ba0bd65b82e429798ab2f tx=0200000001ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e620444970100000000fca23080044a01000000000000220020c219eb7f4540c76362943a9f36a248734a879373488e677a2ef39a69e73542814a01000000000000220020fbb4b6620be5da83753256006febd0db92b2939dfb6476dbe2482c2e2791290a5777000000000000220020e894e2a963db6f16f6278115828281fe9005a5f3a3fbfb5f5e450b734fb7c1cc645c0100000000002200207b145c141421178db6a97e2d0f4767e87596062e87268e9dd8edae53a23885583e37ec20
INFO: 2021-01-21T11:07:48.716675 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 storing state=class fr.acinq.eclair.channel.Normal
INFO: 2021-01-21T11:07:49.400001 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 sending CommitSig(channelId=ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496, signature=a9956caf1e53043934dc740b490ccd8ef77a74d47eab1a3df7dfbed4b86d3be242ba8c95f79a426101185eb5e6cda6414702c09488d2898e26a73eb4ab28ea51, htlcSignatures=[], channelData=...)
INFO: 2021-01-21T11:07:49.755166 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received RevokeAndAck(channelId=ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496, perCommitmentSecret=PrivateKey(value=5d27c84e58aa3fedaa9679994e493f9895a9d383981bf7ef3a7b2416b9b4f16d), nextPerCommitmentPoint=03771d75d514ac3150629ac4a2eb1aa3f289b7cdb09e993fdde032e8326f7a06ca, channelData=)
INFO: 2021-01-21T11:07:49.756575 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received class fr.acinq.eclair.wire.RevokeAndAck for channel ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496
INFO: 2021-01-21T11:07:49.758858 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 new state: class fr.acinq.eclair.channel.Normal
INFO: 2021-01-21T11:07:49.759551 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 storing state=class fr.acinq.eclair.channel.Normal
DEBUG: 2021-01-21T11:07:50.348445 | f.a.p.app.AppConnectionsDaemon: peerControlFlow = TrafficControl(networkIsAvailable=true, disconnectCount=1)
DEBUG: 2021-01-21T11:07:50.349124 | f.a.p.app.AppConnectionsDaemon: electrumControlFlow = TrafficControl(networkIsAvailable=true, disconnectCount=1)

More than 3 minutes between these log lines, when nothing happened (app put into the background?)

WARNING: 2021-01-21T11:11:03.651435 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 Software caused connection abort
WARNING: 2021-01-21T11:11:03.654493 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 Socket is not connected
DEBUG: 2021-01-21T11:11:03.657661 | f.a.p.app.AppConnectionsDaemon: peerControlFlow = TrafficControl(networkIsAvailable=true, disconnectCount=0)
DEBUG: 2021-01-21T11:11:03.657897 | f.a.p.app.AppConnectionsDaemon: electrumControlFlow = TrafficControl(networkIsAvailable=true, disconnectCount=0)
DEBUG: 2021-01-21T11:11:03.658724 | f.a.p.app.AppConnectionsDaemon: New Peer status CLOSED
DEBUG: 2021-01-21T11:11:03.658775 | f.a.p.app.AppConnectionsDaemon: Wait for 500ms before retrying connection on Peer
DEBUG: 2021-01-21T11:11:03.658952 | f.a.p.app.AppConnectionsDaemon: New Electrum status ESTABLISHED

Notice the CommitSig that we receive now from the tcp socket -> it ends up being half-received which completely breaks our state.

INFO: 2021-01-21T11:11:10.667554 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received CommitSig(channelId=ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496, signature=4823e7c1735303c4f6cbcdd19b1b3b1a853a8a7e07df06aea38a8b47f9b4aa4e1eac0b25f1fad65e6a770eb647e5c838fa59f320cff055ad2b0e798eee7fb794, htlcSignatures=[], channelData=)
INFO: 2021-01-21T11:11:10.669285 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received class fr.acinq.eclair.wire.CommitSig for channel ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496
INFO: 2021-01-21T11:11:10.967573 | f.a.e.channel.ChannelState: c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 built local commit number=9 toLocalMsat=30551942 toRemoteMsat=95468058 htlc_in= htlc_out= feeratePerKw=FeeratePerKw(feerate=5000 sat) txid=733d6dafcabfb68e2fa93fb9593b5ce7a4f6b288184595b52df3323b950dfd8f tx=0200000001ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e620444970100000000fca23080044a01000000000000220020c219eb7f4540c76362943a9f36a248734a879373488e677a2ef39a69e73542814a01000000000000220020fbb4b6620be5da83753256006febd0db92b2939dfb6476dbe2482c2e2791290a577700000000000022002008d4aedcd2d0a94f5c1070450e30bd411b660d01f81a5b997615212c8feb5674645c010000000000220020345fda6ab07a492d86598542a1592f26a93124f6a5bfe5f6c1754c85ba2171933e37ec20
INFO: 2021-01-21T11:11:11.677044 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 new state: class fr.acinq.eclair.channel.Normal

And because of this, we fail to send our revocation but still believe we sent it...

WARNING: 2021-01-21T11:11:11.678158 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 unhandled action: class fr.acinq.eclair.channel.ChannelAction.Message.Send
INFO: 2021-01-21T11:11:11.679148 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 storing state=class fr.acinq.eclair.channel.Normal
WARNING: 2021-01-21T11:11:12.533617 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 disconnect peer from TCP socket
WARNING: 2021-01-21T11:11:12.536374 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 disconnecting channels
INFO: 2021-01-21T11:11:12.540368 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 connecting to 13.248.222.197
DEBUG: 2021-01-21T11:11:12.798762 | f.a.p.app.AppConnectionsDaemon: New Peer status ESTABLISHING
INFO: 2021-01-21T11:11:12.885989 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 sending init Init(features=080000002aa201, tlvs=TlvStream(records=[], unknown=[]))
INFO: 2021-01-21T11:11:12.941995 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received Init(features=0aaa8a, tlvs=TlvStream(records=[Networks(chainHashes=[43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000])], unknown=[]))
INFO: 2021-01-21T11:11:12.944982 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 peer is using features Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=optional), ActivatedFeature(feature=initial_routing_sync, support=optional), ActivatedFeature(feature=gossip_queries, support=optional), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=gossip_queries_ex, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional)], unknown=[])
WARNING: 2021-01-21T11:11:12.949575 | f.a.e.channel.ChannelState: c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 offline processing class fr.acinq.eclair.channel.ChannelEvent.Connected
INFO: 2021-01-21T11:11:12.950236 | f.a.e.channel.ChannelState: c:ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496 syncing class fr.acinq.eclair.channel.Normal, waiting fo their channelReestablish message
DEBUG: 2021-01-21T11:11:12.958208 | f.a.p.app.AppConnectionsDaemon: New Peer status ESTABLISHED
INFO: 2021-01-21T11:11:13.553430 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received ChannelReestablish(channelId=ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496, nextLocalCommitmentNumber=10, nextRemoteRevocationNumber=8, yourLastCommitmentSecret=PrivateKey(value=74fbdca67997bb2fae623ecd073c6988b39f060fd5717dc31756952abec1b951), myCurrentPerCommitmentPoint=0248bc63821d0e3edc10a0ec20ff8fb1b67511d44f7ce76cf4595eabce7358dec1, channelData=)
INFO: 2021-01-21T11:11:13.778981 | f.a.e.io.Peer: n:03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134 received class fr.acinq.eclair.wire.ChannelReestablish for channel ff7c567773605fbb24660fc2eb0bda73439c8a1796a1a45d69102a5e62044496

Clean-up the LightningSerializer interface

This abstraction doesn't match the reality of our types very well...
In particular the tag property is problematic, in many cases it doesn't make sense.

That part should be re-architected to provide utility codecs that can be composed to encode/decode messages, but also tlvs and onion parts.

Fatal error in tcp socket

Reproducible on testnet with seed=swap scale student indicate drum collect wealth jewel hope verb balance mammal

Issue happening in :

https://github.com/ACINQ/eclair-kmp/blob/88769628fb5d2d613f28ebed589a6f0d7bf18524/src/commonMain/kotlin/fr/acinq/eclair/io/LightningSession.kt#L16

https://github.com/ACINQ/eclair-kmp/blob/88769628fb5d2d613f28ebed589a6f0d7bf18524/src/commonMain/kotlin/fr/acinq/eclair/io/TcpSocket.kt#L41-L42

Logs

Uncaught Kotlin exception: kotlinx.coroutines.CoroutinesInternalError: Fatal exception in coroutines machinery for DispatchedContinuation[MainDispatcher, Continuation @ $establishConnection$lambda-15COROUTINE$63]. Please read KDoc to 'handleFatalException' method and report this incident to maintainers
    at 0   PhoenixShared                       0x0000000106d6d9ac kfun:kotlin.Error#<init>(kotlin.String?;kotlin.Throwable?){} + 124 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:14:63)
    at 1   PhoenixShared                       0x00000001070cc48c kfun:kotlinx.coroutines.CoroutinesInternalError#<init>(kotlin.String;kotlin.Throwable){} + 124 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/Exceptions.common.kt:28:77)
    at 2   PhoenixShared                       0x0000000107149799 kfun:kotlinx.coroutines.DispatchedTask#handleFatalException(kotlin.Throwable?;kotlin.Throwable?){} + 953 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:93:22)
    at 3   PhoenixShared                       0x0000000107149377 kfun:kotlinx.coroutines.DispatchedTask#run(){} + 3543 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:64:13)
    at 4   PhoenixShared                       0x000000010717f958 kfun:kotlinx.coroutines.DarwinMainDispatcher.dispatch$lambda-0#internal + 88 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:35:19)
    at 5   PhoenixShared                       0x000000010717fd2e kfun:kotlinx.coroutines.DarwinMainDispatcher.$dispatch$lambda-0$FUNCTION_REFERENCE$43.invoke#internal + 62 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:34:51)
    at 6   PhoenixShared                       0x000000010717fd8e kfun:kotlinx.coroutines.DarwinMainDispatcher.$dispatch$lambda-0$FUNCTION_REFERENCE$43.$<bridge-UNN>invoke(){}#internal + 62 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:34:51)
    at 7   PhoenixShared                       0x0000000107180e47 _6f72672e6a6574627261696e732e6b6f746c696e783a6b6f746c696e782d636f726f7574696e65732d636f7265_knbridge8 + 183 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:34:51)
    at 8   libdispatch.dylib                   0x0000000108c7a7ec _dispatch_call_block_and_release + 12
    at 9   libdispatch.dylib                   0x0000000108c7b9c8 _dispatch_client_callout + 8
    at 10  libdispatch.dylib                   0x0000000108c89e75 _dispatch_main_queue_callback_4CF + 1152
    at 11  CoreFoundation                      0x00007fff2038edbb __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    at 12  CoreFoundation                      0x00007fff2038963e __CFRunLoopRun + 2685
    at 13  CoreFoundation                      0x00007fff203886d6 CFRunLoopRunSpecific + 567
    at 14  GraphicsServices                    0x00007fff2bededb3 GSEventRunModal + 139
    at 15  UIKitCore                           0x00007fff24690e0b -[UIApplication _run] + 912
    at 16  UIKitCore                           0x00007fff24695cbc UIApplicationMain + 101
    at 17  Phoenix                             0x0000000105d0073b main + 75 (/Users/Dominique/git/phoenix-kmm/phoenix-ios/phoenix-ios/AppDelegate.swift:17:7)
    at 18  libdyld.dylib                       0x00007fff202593e9 start + 1
Caused by: kotlin.IllegalArgumentException
    at 0   PhoenixShared                       0x0000000106d754e1 kfun:kotlin.Throwable#<init>(){} + 65 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Throwable.kt:27:21)
    at 1   PhoenixShared                       0x0000000106d6daca kfun:kotlin.Exception#<init>(){} + 58 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:21:28)
    at 2   PhoenixShared                       0x0000000106d6dd1a kfun:kotlin.RuntimeException#<init>(){} + 58 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:32:28)
    at 3   PhoenixShared                       0x0000000106d6e18a kfun:kotlin.IllegalArgumentException#<init>(){} + 58 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:57:28)
    at 4   PhoenixShared                       0x0000000106dc615a ThrowIllegalArgumentException + 122 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt:72:11)
    at 5   PhoenixShared                       0x0000000106e96839 AllocArrayInstanceStrict + 73
    at 6   PhoenixShared                       0x000000010741abd8 kfun:fr.acinq.eclair.io.$receiveFullyCOROUTINE$67#invokeSuspend(kotlin.Result<kotlin.Any?>){}kotlin.Any? + 600 (/Users/Dominique/git/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/TcpSocket.kt:41:9)
    at 7   PhoenixShared                       0x000000010741af9b kfun:fr.acinq.eclair.io#[email protected](kotlin.Int){}kotlin.ByteArray + 283 (/Users/Dominique/git/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/TcpSocket.kt:41:9)
    at 8   PhoenixShared                       0x0000000107402421 kfun:fr.acinq.eclair.io.Peer.$establishConnection$lambda-15$receive$lambda-9COROUTINE$52.invokeSuspend#internal + 641 (/Users/Dominique/git/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/Peer.kt:210:53)
    at 9   PhoenixShared                       0x0000000107402959 kfun:fr.acinq.eclair.io.Peer.$establishConnection$lambda-15$receive$lambda-9COROUTINE$52.invoke#internal + 233 (/Users/Dominique/git/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/Peer.kt:210:36)
    at 10  PhoenixShared                       0x0000000107402c6e kfun:fr.acinq.eclair.io.Peer.$establishConnection$lambda-15$receive$lambda-9COROUTINE$52.$<bridge-NNNU>invoke(kotlin.Int){}kotlin.Any?#internal + 238 (/Users/Dominique/git/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/Peer.kt:210:36)
    at 11  PhoenixShared                       0x00000001073bba05 kfun:fr.acinq.eclair.io.LightningSession.$receiveCOROUTINE$22#invokeSuspend(kotlin.Result<kotlin.Any?>){}kotlin.Any? + 2741 (/Users/Dominique/git/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/LightningSession.kt:16:27)
    at 12  PhoenixShared                       0x0000000106d97736 kfun:kotlin.coroutines.native.internal.BaseContinuationImpl#resumeWith(kotlin.Result<kotlin.Any?>){} + 758 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:30:39)
    at 13  PhoenixShared                       0x0000000107149092 kfun:kotlinx.coroutines.DispatchedTask#run(){} + 2802 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:39:50)
    at 14  PhoenixShared                       0x000000010717f958 kfun:kotlinx.coroutines.DarwinMainDispatcher.dispatch$lambda-0#internal + 88 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:35:19)
    ... and 14 more common stack frames skipped

Re-design swap-in using a proof of payment

When implementing swaps, we need to generate a preimage and a payment_hash for each swap-in request.
This allows us to store it instantly in the DB while we're waiting for it to complete, otherwise we're losing data if the wallet restarts before the swap completes.

The preimage should be sent back to the swap server when the swap completes, to act as a proof of payment.

This doesn't prevent swap aggregation at the swap server: the server simply needs to explicitly say "this channel I'm opening to you completes swaps <payment_hash1>, <payment_hash2>, etc" for proper accounting.

Server ACK for FCM token registration

There is currently a mechanism for registering FCM tokens with the server. (For push notifications.) This is already implemented, but could be improved.

Theoretically, the (node_id, fcm_token) tuple only needs to be registered once. And after that, only if the tuple changes (e.g. different fcm_token). However, in practice, this optimization isn't feasible for the client. Since the server doesn't send any kind of ack/confirmation, the client doesn't have a clean hook with which it can say, "OK, FCM token xyz has been successfully registered. I'm now free to optimize the client flow to skip sending the FCM token next time."

Because the server doesn't send an ack/confirmation, the client-side registers the FCM token every app launch.

I originally thought this was a minor optimization, but a recent phoenix-kmm issue has me re-thinking this.

The issue was that:

  • there was a bug in the kotlin code that resulted in the FCM token not being sent to the server
  • without the ACK, the user interface has no way of knowing whether or not the token has been properly registered
  • we generally only discover the bug after we start missing incoming payments

If the server sends an ack/confirmation, then the clients can be updated to display this confirmation somewhere within the user interface. I think this would prove very helpful, especially for debugging background payments. I can imagine receiving bug reports from users:

"I can't receive a payment when Phoenix is running in the background?!?! Help me!"

It would be wonderful if we could say respond with something like:

"Go into settings and tap on X. Does it say 'push token registered' ?"

Import missing channel tests from eclair

Test cases to import:

  • Funder tests (WaitForAccept, WaitForFundingSigned, WaitForFundingLocked)
  • Normal state shutdown / CMD_CLOSE tests
  • Shutdown/Negotiating/Closing tests
  • Peer handling of duplicate temporaryChannelId

And implement remaining TODO in Channel.kt:

  • Revocation timeout
  • WaitForFundingConfirmed get funding tx from watcher
  • Information leak
  • Shutdown

Add on-chain fee estimation

At first we use a constant value of 20 sat/vbyte for commit txs, and allow the funder to use fees in the range [10 sat/vbyte, 40 sat/vbyte].

Until bitcoin supports package relay, it would be nice to connect to a fee provider (electrum?) to verify that this feerate allows the commit tx to at least relay through the bitcoin network.

It would also be nice to retrieve on-chain feerates to allow users to set it when they're closing a channel and when we're claiming penalty outputs.

Crash when CMD_CLOSE(scriptPubKey) has non-null parameter

I'm working on the UI for "close all channels"

The phoenix-shared implementation sends a CMD_CLOSE() command with a non-null scriptPubKey parameter. And the channel ultimately gets into state ErrorInformationLeak, and then crashes.

Context:

  • the user requested channel closure(s), with funds being sent to tb1q6k6kw2y3920s4dqgm4kdaqtann4agy2dh2lwts (bech32 decode = d5b56728912a9f0ab408dd6cde817d9cebd4114d)
  • the funds were indeed sent to this address, and I received them in my wallet. Testnet transaction: 413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e

The stack trace is below.

2020-12-14 11:41:00.274135-0500 Phoenix[36134:4865789] [AppController] First Model: Loading
2020-12-14 11:41:00.279593-0500 Phoenix[36134:4865789] [Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.
2020-12-14 11:41:00.334760-0500 Phoenix[36134:4865789] [AppController] Model: Ready(channelCount=1, sats=999)
2020-12-14 11:41:06.886966-0500 Phoenix[36134:4865789] [Peer] received pong
checkBitcoinAddress()
checkBitcoinAddress()
checkBitcoinAddress()
drainWallet()
confirm()
confirmDrainWallet()
2020-12-14 11:41:24.165676-0500 Phoenix[36134:4865789] [AppController] AppCloseChannelsConfigurationController Intent: CloseAllChannels(address=tb1q6k6kw2y3920s4dqgm4kdaqtann4agy2dh2lwts)
2020-12-14 11:41:24.184657-0500 Phoenix[36134:4865789] [Peer] storing state for channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59 data=Normal(staticParams=StaticParams(nodeParams=NodeParams(keyManager=LocalKeyManager(seed=1d5785cd0713befb8d7367c838a6a6f5daad59f58253173071e33b45097d0ef3, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000), alias=phoenix, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional)], unknown=[]), dustLimit=546 sat, onChainFeeConf=OnChainFeeConf(closeOnOfflineMismatch=true, updateFeeMinDiffRatio=0.1, feerateTolerance=FeerateTolerance(ratioLow=0.01, ratioHigh=100.0)), maxHtlcValueInFlightMsat=150000000, maxAcceptedHtlcs=30, expiryDeltaBlocks=CltvExpiryDelta(underlying=144), fulfillSafetyBeforeTimeoutBlocks=CltvExpiryDelta(underlying=6), htlcMinimum=1000 msat, toRemoteDelayBlocks=CltvExpiryDelta(underlying=144), maxToLocalDelayBlocks=CltvExpiryDelta(underlying=1000), minDepthBlocks=3, feeBase=1000 msat, feeProportionalMillionth=10, reserveToFundingRatio=0.01, maxReserveToFundingRatio=0.05, revocationTimeoutSeconds=20, authTimeoutSeconds=10, initTimeoutSeconds=10, pingIntervalSeconds=30, pingTimeoutSeconds=10, pingDisconnect=true, autoReconnect=false, initialRandomReconnectDelaySeconds=5, maxReconnectIntervalSeconds=3600, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000, channelFlags=1, paymentRequestExpirySeconds=3600, multiPartPaymentExpirySeconds=60, minFundingSatoshis=1000 sat, maxFundingSatoshis=16777215 sat, maxPaymentAttempts=5, trampolineNode=NodeUri(id=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, host=13.248.222.197, port=9735), enableTrampolinePayment=true), remoteNodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134), currentTip=(1897615, BlockHeader(version=536870912, hashPreviousBlock=5417a9ce3ed9413e492b9636cfad501b9fff861c7754ff643e00000000000000, hashMerkleRoot=31ae29df25eb9c79175eecf5bc73c9d573324998a51a76a794495b350de1f841, time=1607963875, bits=424073553, nonce=307724605)), currentOnChainFeerates=OnChainFeerates(mutualCloseFeerate=FeeratePerKw(feerate=253 sat), claimMainFeerate=FeeratePerKw(feerate=253 sat), fastFeerate=FeeratePerKw(feerate=253 sat)), commitments=Commitments(channelVersion=ChannelVersion(bits=0x0000000f), localParams=LocalParams(nodeId=039a927997b7bd773f38c74e9a2d133efd3d902756cae58574dfd71bfa79e801f7, fundingKeyPath=m/1/2/3, dustLimit=546 sat, maxHtlcValueInFlightMsat=150000000, channelReserve=600 sat, htlcMinimum=1000 msat, toSelfDelay=CltvExpiryDelta(underlying=144), maxAcceptedHtlcs=30, isFunder=false, defaultFinalScriptPubKey=00140ad04adaa1b17be55f507eb111f5ec9d5a8940e8, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional)], unknown=[])), remoteParams=RemoteParams(nodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, dustLimit=546 sat, maxHtlcValueInFlightMsat=20000000000, channelReserve=0 sat, htlcMinimum=1 msat, toSelfDelay=CltvExpiryDelta(underlying=720), maxAcceptedHtlcs=30, fundingPubKey=02f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432, revocationBasepoint=02b19257d8afa234568e65c024338c392a39f1d372845bb3e631db9489c84f596d, paymentBasepoint=026b7ba89874b9c9c718ecfe9ebf5ed8eb087c18be23b6392c56786bfc5e6145c8, delayedPaymentBasepoint=031807fdcb19550c6f9bb8c99a01004c70477bf795ad54de1349346047c1588423, htlcBasepoint=021306843946ac7660a9ca58249c6a90543686934c7e2573bc53c3c5cd42075072, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=optional), ActivatedFeature(feature=initial_routing_sync, support=optional), ActivatedFeature(feature=gossip_queries, support=optional), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=gossip_queries_ex, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional)], unknown=[])), channelFlags=0, localCommit=LocalCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=999000 msat, toRemote=100302000 msat), publishableTxs=PublishableTxs(commitTx=CommitTx(input=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000aaf56f80044a0100000000000022002014f68b86d42681f32cf5d86f068c36f2c13d6440a04590d7184222074047ee2f4a0100000000000022002086f45ec8d019457dd7cb71ba78b99768aec82cd6f1e7d9af0abf8331b38747f2e703000000000000220020fd91a0f611170c38268b915932618924dcefb7c9e7663285f27e76676f829b970883010000000000220020a9a7f11719f65f48994e9154dd93a4fefdda9a88bfc7b9c9395159ef627ead360400473044022078e495214792a90bccf100b73f04cbbfc3605bb30d73469ab967c33e1fba715f022067e440b19358faa40320031e8dc68ba886c0749fb25b0d8cdfd6f5e4c3d126b10147304402202c6c7a98302f506ce3e72a47827a20d836b9184777815f620b7687e1484b747c022021ab41fcf65a18571f24adce2cddbb9dbf29dbff3544a53a9584591f4e7614720147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae6f6f5720), htlcTxsAndSigs=[])), remoteCommit=RemoteCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=100302000 msat, toRemote=999000 msat), txid=a3797bd30c019a8e2b018fe04f8b19a368f80c72e1021748d407900f316f7085, remotePerCommitmentPoint=02412576e3b7254201970f8e0a17d4065055240e1ac2017a0c1006fac17b9f9541), localChanges=LocalChanges(proposed=[], signed=[], acked=[]), remoteChanges=RemoteChanges(proposed=[], acked=[], signed=[]), localNextHtlcId=0, remoteNextHtlcId=0, payments={}, remoteNextCommitInfo=Right(value=025490337db8dde5a5f4fec309c7afaaa85be95d97fac2eb8c7c88df186c83ea25), commitInput=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), remotePerCommitmentSecrets=ShaChain(lastIndex = null), channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, remoteChannelData=), shortChannelId=0x11465468x1, buried=false, channelAnnouncement=null, channelUpdate=ChannelUpdate(signature=43ae387a8aa3a1e8619b3170a12e7a7b98ef572c018d099f902e3553aa88d92d33683cd39a185ef597a2708daffe438b9737fa78a4aa74b9388ac22f956069d0, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000, shortChannelId=0x11465468x1, timestampSeconds=1607962664, messageFlags=1, channelFlags=1, cltvExpiryDelta=CltvExpiryDelta(underlying=144), htlcMinimumMsat=1 msat, feeBaseMsat=1000 msat, feeProportionalMillionths=10, htlcMaximumMsat=101301000 msat, unknownFields=), localShutdown=Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=0014d5b56728912a9f0ab408dd6cde817d9cebd4114d, channelData=), remoteShutdown=null)
2020-12-14 11:41:24.187631-0500 Phoenix[36134:4865789] [AppController] Model: ChannelsClosed(channelCount=1, sats=999)
2020-12-14 11:41:24.246133-0500 Phoenix[36134:4865789] [Peer] sending Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=0014d5b56728912a9f0ab408dd6cde817d9cebd4114d, channelData=) encoded as 00266f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae5900160014d5b56728912a9f0ab408dd6cde817d9cebd4114d
2020-12-14 11:41:24.247066-0500 Phoenix[36134:4865789] [AppController] Model: Model(connections=Connections(internet=ESTABLISHED, peer=ESTABLISHED, electrum=ESTABLISHED), balanceSat=999, history=[Transaction(id=53131f1d-0953-4eb8-b46b-b296ee666cbd, amountMsat=999000, desc=Phoenix payment, status=Success, timestamp=1607962656450)], lastTransaction=null)
2020-12-14 11:41:24.247340-0500 Phoenix[36134:4865789] [AppController] Model: Ready(channelCount=1, sats=999)
2020-12-14 11:41:24.647627-0500 Phoenix[36134:4865789] [Peer] received Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd2, channelData=) for channel 6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59
2020-12-14 11:41:24.650138-0500 Phoenix[36134:4865789] [Peer] channel 6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59 new state Negotiating(staticParams=StaticParams(nodeParams=NodeParams(keyManager=LocalKeyManager(seed=1d5785cd0713befb8d7367c838a6a6f5daad59f58253173071e33b45097d0ef3, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000), alias=phoenix, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional)], unknown=[]), dustLimit=546 sat, onChainFeeConf=OnChainFeeConf(closeOnOfflineMismatch=true, updateFeeMinDiffRatio=0.1, feerateTolerance=FeerateTolerance(ratioLow=0.01, ratioHigh=100.0)), maxHtlcValueInFlightMsat=150000000, maxAcceptedHtlcs=30, expiryDeltaBlocks=CltvExpiryDelta(underlying=144), fulfillSafetyBeforeTimeoutBlocks=CltvExpiryDelta(underlying=6), htlcMinimum=1000 msat, toRemoteDelayBlocks=CltvExpiryDelta(underlying=144), maxToLocalDelayBlocks=CltvExpiryDelta(underlying=1000), minDepthBlocks=3, feeBase=1000 msat, feeProportionalMillionth=10, reserveToFundingRatio=0.01, maxReserveToFundingRatio=0.05, revocationTimeoutSeconds=20, authTimeoutSeconds=10, initTimeoutSeconds=10, pingIntervalSeconds=30, pingTimeoutSeconds=10, pingDisconnect=true, autoReconnect=false, initialRandomReconnectDelaySeconds=5, maxReconnectIntervalSeconds=3600, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000, channelFlags=1, paymentRequestExpirySeconds=3600, multiPartPaymentExpirySeconds=60, minFundingSatoshis=1000 sat, maxFundingSatoshis=16777215 sat, maxPaymentAttempts=5, trampolineNode=NodeUri(id=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, host=13.248.222.197, port=9735), enableTrampolinePayment=true), remoteNodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134), currentTip=(1897615, BlockHeader(version=536870912, hashPreviousBlock=5417a9ce3ed9413e492b9636cfad501b9fff861c7754ff643e00000000000000, hashMerkleRoot=31ae29df25eb9c79175eecf5bc73c9d573324998a51a76a794495b350de1f841, time=1607963875, bits=424073553, nonce=307724605)), currentOnChainFeerates=OnChainFeerates(mutualCloseFeerate=FeeratePerKw(feerate=253 sat), claimMainFeerate=FeeratePerKw(feerate=253 sat), fastFeerate=FeeratePerKw(feerate=253 sat)), commitments=Commitments(channelVersion=ChannelVersion(bits=0x0000000f), localParams=LocalParams(nodeId=039a927997b7bd773f38c74e9a2d133efd3d902756cae58574dfd71bfa79e801f7, fundingKeyPath=m/1/2/3, dustLimit=546 sat, maxHtlcValueInFlightMsat=150000000, channelReserve=600 sat, htlcMinimum=1000 msat, toSelfDelay=CltvExpiryDelta(underlying=144), maxAcceptedHtlcs=30, isFunder=false, defaultFinalScriptPubKey=00140ad04adaa1b17be55f507eb111f5ec9d5a8940e8, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional)], unknown=[])), remoteParams=RemoteParams(nodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, dustLimit=546 sat, maxHtlcValueInFlightMsat=20000000000, channelReserve=0 sat, htlcMinimum=1 msat, toSelfDelay=CltvExpiryDelta(underlying=720), maxAcceptedHtlcs=30, fundingPubKey=02f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432, revocationBasepoint=02b19257d8afa234568e65c024338c392a39f1d372845bb3e631db9489c84f596d, paymentBasepoint=026b7ba89874b9c9c718ecfe9ebf5ed8eb087c18be23b6392c56786bfc5e6145c8, delayedPaymentBasepoint=031807fdcb19550c6f9bb8c99a01004c70477bf795ad54de1349346047c1588423, htlcBasepoint=021306843946ac7660a9ca58249c6a90543686934c7e2573bc53c3c5cd42075072, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=optional), ActivatedFeature(feature=initial_routing_sync, support=optional), ActivatedFeature(feature=gossip_queries, support=optional), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=gossip_queries_ex, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional)], unknown=[])), channelFlags=0, localCommit=LocalCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=999000 msat, toRemote=100302000 msat), publishableTxs=PublishableTxs(commitTx=CommitTx(input=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000aaf56f80044a0100000000000022002014f68b86d42681f32cf5d86f068c36f2c13d6440a04590d7184222074047ee2f4a0100000000000022002086f45ec8d019457dd7cb71ba78b99768aec82cd6f1e7d9af0abf8331b38747f2e703000000000000220020fd91a0f611170c38268b915932618924dcefb7c9e7663285f27e76676f829b970883010000000000220020a9a7f11719f65f48994e9154dd93a4fefdda9a88bfc7b9c9395159ef627ead360400473044022078e495214792a90bccf100b73f04cbbfc3605bb30d73469ab967c33e1fba715f022067e440b19358faa40320031e8dc68ba886c0749fb25b0d8cdfd6f5e4c3d126b10147304402202c6c7a98302f506ce3e72a47827a20d836b9184777815f620b7687e1484b747c022021ab41fcf65a18571f24adce2cddbb9dbf29dbff3544a53a9584591f4e7614720147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae6f6f5720), htlcTxsAndSigs=[])), remoteCommit=RemoteCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=100302000 msat, toRemote=999000 msat), txid=a3797bd30c019a8e2b018fe04f8b19a368f80c72e1021748d407900f316f7085, remotePerCommitmentPoint=02412576e3b7254201970f8e0a17d4065055240e1ac2017a0c1006fac17b9f9541), localChanges=LocalChanges(proposed=[], signed=[], acked=[]), remoteChanges=RemoteChanges(proposed=[], acked=[], signed=[]), localNextHtlcId=0, remoteNextHtlcId=0, payments={}, remoteNextCommitInfo=Right(value=025490337db8dde5a5f4fec309c7afaaa85be95d97fac2eb8c7c88df186c83ea25), commitInput=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), remotePerCommitmentSecrets=ShaChain(lastIndex = null), channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, remoteChannelData=), localShutdown=Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=0014d5b56728912a9f0ab408dd6cde817d9cebd4114d, channelData=), remoteShutdown=Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd2, channelData=), closingTxProposed=[[]], bestUnpublishedClosingTx=null)
2020-12-14 11:41:24.657517-0500 Phoenix[36134:4865789] [Peer] storing state for channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59 data=Negotiating(staticParams=StaticParams(nodeParams=NodeParams(keyManager=LocalKeyManager(seed=1d5785cd0713befb8d7367c838a6a6f5daad59f58253173071e33b45097d0ef3, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000), alias=phoenix, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional)], unknown=[]), dustLimit=546 sat, onChainFeeConf=OnChainFeeConf(closeOnOfflineMismatch=true, updateFeeMinDiffRatio=0.1, feerateTolerance=FeerateTolerance(ratioLow=0.01, ratioHigh=100.0)), maxHtlcValueInFlightMsat=150000000, maxAcceptedHtlcs=30, expiryDeltaBlocks=CltvExpiryDelta(underlying=144), fulfillSafetyBeforeTimeoutBlocks=CltvExpiryDelta(underlying=6), htlcMinimum=1000 msat, toRemoteDelayBlocks=CltvExpiryDelta(underlying=144), maxToLocalDelayBlocks=CltvExpiryDelta(underlying=1000), minDepthBlocks=3, feeBase=1000 msat, feeProportionalMillionth=10, reserveToFundingRatio=0.01, maxReserveToFundingRatio=0.05, revocationTimeoutSeconds=20, authTimeoutSeconds=10, initTimeoutSeconds=10, pingIntervalSeconds=30, pingTimeoutSeconds=10, pingDisconnect=true, autoReconnect=false, initialRandomReconnectDelaySeconds=5, maxReconnectIntervalSeconds=3600, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000, channelFlags=1, paymentRequestExpirySeconds=3600, multiPartPaymentExpirySeconds=60, minFundingSatoshis=1000 sat, maxFundingSatoshis=16777215 sat, maxPaymentAttempts=5, trampolineNode=NodeUri(id=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, host=13.248.222.197, port=9735), enableTrampolinePayment=true), remoteNodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134), currentTip=(1897615, BlockHeader(version=536870912, hashPreviousBlock=5417a9ce3ed9413e492b9636cfad501b9fff861c7754ff643e00000000000000, hashMerkleRoot=31ae29df25eb9c79175eecf5bc73c9d573324998a51a76a794495b350de1f841, time=1607963875, bits=424073553, nonce=307724605)), currentOnChainFeerates=OnChainFeerates(mutualCloseFeerate=FeeratePerKw(feerate=253 sat), claimMainFeerate=FeeratePerKw(feerate=253 sat), fastFeerate=FeeratePerKw(feerate=253 sat)), commitments=Commitments(channelVersion=ChannelVersion(bits=0x0000000f), localParams=LocalParams(nodeId=039a927997b7bd773f38c74e9a2d133efd3d902756cae58574dfd71bfa79e801f7, fundingKeyPath=m/1/2/3, dustLimit=546 sat, maxHtlcValueInFlightMsat=150000000, channelReserve=600 sat, htlcMinimum=1000 msat, toSelfDelay=CltvExpiryDelta(underlying=144), maxAcceptedHtlcs=30, isFunder=false, defaultFinalScriptPubKey=00140ad04adaa1b17be55f507eb111f5ec9d5a8940e8, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional)], unknown=[])), remoteParams=RemoteParams(nodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, dustLimit=546 sat, maxHtlcValueInFlightMsat=20000000000, channelReserve=0 sat, htlcMinimum=1 msat, toSelfDelay=CltvExpiryDelta(underlying=720), maxAcceptedHtlcs=30, fundingPubKey=02f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432, revocationBasepoint=02b19257d8afa234568e65c024338c392a39f1d372845bb3e631db9489c84f596d, paymentBasepoint=026b7ba89874b9c9c718ecfe9ebf5ed8eb087c18be23b6392c56786bfc5e6145c8, delayedPaymentBasepoint=031807fdcb19550c6f9bb8c99a01004c70477bf795ad54de1349346047c1588423, htlcBasepoint=021306843946ac7660a9ca58249c6a90543686934c7e2573bc53c3c5cd42075072, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=optional), ActivatedFeature(feature=initial_routing_sync, support=optional), ActivatedFeature(feature=gossip_queries, support=optional), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=gossip_queries_ex, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional)], unknown=[])), channelFlags=0, localCommit=LocalCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=999000 msat, toRemote=100302000 msat), publishableTxs=PublishableTxs(commitTx=CommitTx(input=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000aaf56f80044a0100000000000022002014f68b86d42681f32cf5d86f068c36f2c13d6440a04590d7184222074047ee2f4a0100000000000022002086f45ec8d019457dd7cb71ba78b99768aec82cd6f1e7d9af0abf8331b38747f2e703000000000000220020fd91a0f611170c38268b915932618924dcefb7c9e7663285f27e76676f829b970883010000000000220020a9a7f11719f65f48994e9154dd93a4fefdda9a88bfc7b9c9395159ef627ead360400473044022078e495214792a90bccf100b73f04cbbfc3605bb30d73469ab967c33e1fba715f022067e440b19358faa40320031e8dc68ba886c0749fb25b0d8cdfd6f5e4c3d126b10147304402202c6c7a98302f506ce3e72a47827a20d836b9184777815f620b7687e1484b747c022021ab41fcf65a18571f24adce2cddbb9dbf29dbff3544a53a9584591f4e7614720147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae6f6f5720), htlcTxsAndSigs=[])), remoteCommit=RemoteCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=100302000 msat, toRemote=999000 msat), txid=a3797bd30c019a8e2b018fe04f8b19a368f80c72e1021748d407900f316f7085, remotePerCommitmentPoint=02412576e3b7254201970f8e0a17d4065055240e1ac2017a0c1006fac17b9f9541), localChanges=LocalChanges(proposed=[], signed=[], acked=[]), remoteChanges=RemoteChanges(proposed=[], acked=[], signed=[]), localNextHtlcId=0, remoteNextHtlcId=0, payments={}, remoteNextCommitInfo=Right(value=025490337db8dde5a5f4fec309c7afaaa85be95d97fac2eb8c7c88df186c83ea25), commitInput=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), remotePerCommitmentSecrets=ShaChain(lastIndex = null), channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, remoteChannelData=), localShutdown=Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=0014d5b56728912a9f0ab408dd6cde817d9cebd4114d, channelData=), remoteShutdown=Shutdown(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, scriptPubKey=001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd2, channelData=), closingTxProposed=[[]], bestUnpublishedClosingTx=null)
2020-12-14 11:41:24.662287-0500 Phoenix[36134:4865789] [AppController] Model: Model(connections=Connections(internet=ESTABLISHED, peer=ESTABLISHED, electrum=ESTABLISHED), balanceSat=999, history=[Transaction(id=53131f1d-0953-4eb8-b46b-b296ee666cbd, amountMsat=999000, desc=Phoenix payment, status=Success, timestamp=1607962656450)], lastTransaction=null)
2020-12-14 11:41:24.662910-0500 Phoenix[36134:4865789] [AppController] Model: Ready(channelCount=1, sats=999)
2020-12-14 11:41:24.718099-0500 Phoenix[36134:4865789] [Peer] received ClosingSigned(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, feeSatoshis=170 sat, signature=b0db16e9d3d31cdddc6e85e325c59fb92bf6e4dd9cea6f5a599bfff83efc32f205f4303cd8a63b12d708cdea412838ca18baf185603b744e07ec737794a36534, channelData=) for channel 6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59
2020-12-14 11:41:24.718439-0500 Phoenix[36134:4865789] [ChannelState] received closingFeeSatoshis=170 sat
2020-12-14 11:41:24.728364-0500 Phoenix[36134:4865789] [ChannelState] closing tx published: closingTxId=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e
2020-12-14 11:41:24.770903-0500 Phoenix[36134:4865789] [Peer] channel 6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59 new state Closing(staticParams=StaticParams(nodeParams=NodeParams(keyManager=LocalKeyManager(seed=1d5785cd0713befb8d7367c838a6a6f5daad59f58253173071e33b45097d0ef3, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000), alias=phoenix, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional)], unknown=[]), dustLimit=546 sat, onChainFeeConf=OnChainFeeConf(closeOnOfflineMismatch=true, updateFeeMinDiffRatio=0.1, feerateTolerance=FeerateTolerance(ratioLow=0.01, ratioHigh=100.0)), maxHtlcValueInFlightMsat=150000000, maxAcceptedHtlcs=30, expiryDeltaBlocks=CltvExpiryDelta(underlying=144), fulfillSafetyBeforeTimeoutBlocks=CltvExpiryDelta(underlying=6), htlcMinimum=1000 msat, toRemoteDelayBlocks=CltvExpiryDelta(underlying=144), maxToLocalDelayBlocks=CltvExpiryDelta(underlying=1000), minDepthBlocks=3, feeBase=1000 msat, feeProportionalMillionth=10, reserveToFundingRatio=0.01, maxReserveToFundingRatio=0.05, revocationTimeoutSeconds=20, authTimeoutSeconds=10, initTimeoutSeconds=10, pingIntervalSeconds=30, pingTimeoutSeconds=10, pingDisconnect=true, autoReconnect=false, initialRandomReconnectDelaySeconds=5, maxReconnectIntervalSeconds=3600, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000, channelFlags=1, paymentRequestExpirySeconds=3600, multiPartPaymentExpirySeconds=60, minFundingSatoshis=1000 sat, maxFundingSatoshis=16777215 sat, maxPaymentAttempts=5, trampolineNode=NodeUri(id=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, host=13.248.222.197, port=9735), enableTrampolinePayment=true), remoteNodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134), currentTip=(1897615, BlockHeader(version=536870912, hashPreviousBlock=5417a9ce3ed9413e492b9636cfad501b9fff861c7754ff643e00000000000000, hashMerkleRoot=31ae29df25eb9c79175eecf5bc73c9d573324998a51a76a794495b350de1f841, time=1607963875, bits=424073553, nonce=307724605)), currentOnChainFeerates=OnChainFeerates(mutualCloseFeerate=FeeratePerKw(feerate=253 sat), claimMainFeerate=FeeratePerKw(feerate=253 sat), fastFeerate=FeeratePerKw(feerate=253 sat)), commitments=Commitments(channelVersion=ChannelVersion(bits=0x0000000f), localParams=LocalParams(nodeId=039a927997b7bd773f38c74e9a2d133efd3d902756cae58574dfd71bfa79e801f7, fundingKeyPath=m/1/2/3, dustLimit=546 sat, maxHtlcValueInFlightMsat=150000000, channelReserve=600 sat, htlcMinimum=1000 msat, toSelfDelay=CltvExpiryDelta(underlying=144), maxAcceptedHtlcs=30, isFunder=false, defaultFinalScriptPubKey=00140ad04adaa1b17be55f507eb111f5ec9d5a8940e8, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional)], unknown=[])), remoteParams=RemoteParams(nodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, dustLimit=546 sat, maxHtlcValueInFlightMsat=20000000000, channelReserve=0 sat, htlcMinimum=1 msat, toSelfDelay=CltvExpiryDelta(underlying=720), maxAcceptedHtlcs=30, fundingPubKey=02f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432, revocationBasepoint=02b19257d8afa234568e65c024338c392a39f1d372845bb3e631db9489c84f596d, paymentBasepoint=026b7ba89874b9c9c718ecfe9ebf5ed8eb087c18be23b6392c56786bfc5e6145c8, delayedPaymentBasepoint=031807fdcb19550c6f9bb8c99a01004c70477bf795ad54de1349346047c1588423, htlcBasepoint=021306843946ac7660a9ca58249c6a90543686934c7e2573bc53c3c5cd42075072, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=optional), ActivatedFeature(feature=initial_routing_sync, support=optional), ActivatedFeature(feature=gossip_queries, support=optional), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=gossip_queries_ex, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional)], unknown=[])), channelFlags=0, localCommit=LocalCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=999000 msat, toRemote=100302000 msat), publishableTxs=PublishableTxs(commitTx=CommitTx(input=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000aaf56f80044a0100000000000022002014f68b86d42681f32cf5d86f068c36f2c13d6440a04590d7184222074047ee2f4a0100000000000022002086f45ec8d019457dd7cb71ba78b99768aec82cd6f1e7d9af0abf8331b38747f2e703000000000000220020fd91a0f611170c38268b915932618924dcefb7c9e7663285f27e76676f829b970883010000000000220020a9a7f11719f65f48994e9154dd93a4fefdda9a88bfc7b9c9395159ef627ead360400473044022078e495214792a90bccf100b73f04cbbfc3605bb30d73469ab967c33e1fba715f022067e440b19358faa40320031e8dc68ba886c0749fb25b0d8cdfd6f5e4c3d126b10147304402202c6c7a98302f506ce3e72a47827a20d836b9184777815f620b7687e1484b747c022021ab41fcf65a18571f24adce2cddbb9dbf29dbff3544a53a9584591f4e7614720147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae6f6f5720), htlcTxsAndSigs=[])), remoteCommit=RemoteCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=100302000 msat, toRemote=999000 msat), txid=a3797bd30c019a8e2b018fe04f8b19a368f80c72e1021748d407900f316f7085, remotePerCommitmentPoint=02412576e3b7254201970f8e0a17d4065055240e1ac2017a0c1006fac17b9f9541), localChanges=LocalChanges(proposed=[], signed=[], acked=[]), remoteChanges=RemoteChanges(proposed=[], acked=[], signed=[]), localNextHtlcId=0, remoteNextHtlcId=0, payments={}, remoteNextCommitInfo=Right(value=025490337db8dde5a5f4fec309c7afaaa85be95d97fac2eb8c7c88df186c83ea25), commitInput=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), remotePerCommitmentSecrets=ShaChain(lastIndex = null), channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, remoteChannelData=), fundingTx=null, waitingSince=1607964084728, mutualCloseProposed=[02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000], mutualClosePublished=[02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000], localCommitPublished=null, remoteCommitPublished=null, nextRemoteCommitPublished=null, futureRemoteCommitPublished=null, revokedCommitPublished=[])
2020-12-14 11:41:24.775031-0500 Phoenix[36134:4865789] [Peer] storing state for channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59 data=Closing(staticParams=StaticParams(nodeParams=NodeParams(keyManager=LocalKeyManager(seed=1d5785cd0713befb8d7367c838a6a6f5daad59f58253173071e33b45097d0ef3, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000), alias=phoenix, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional)], unknown=[]), dustLimit=546 sat, onChainFeeConf=OnChainFeeConf(closeOnOfflineMismatch=true, updateFeeMinDiffRatio=0.1, feerateTolerance=FeerateTolerance(ratioLow=0.01, ratioHigh=100.0)), maxHtlcValueInFlightMsat=150000000, maxAcceptedHtlcs=30, expiryDeltaBlocks=CltvExpiryDelta(underlying=144), fulfillSafetyBeforeTimeoutBlocks=CltvExpiryDelta(underlying=6), htlcMinimum=1000 msat, toRemoteDelayBlocks=CltvExpiryDelta(underlying=144), maxToLocalDelayBlocks=CltvExpiryDelta(underlying=1000), minDepthBlocks=3, feeBase=1000 msat, feeProportionalMillionth=10, reserveToFundingRatio=0.01, maxReserveToFundingRatio=0.05, revocationTimeoutSeconds=20, authTimeoutSeconds=10, initTimeoutSeconds=10, pingIntervalSeconds=30, pingTimeoutSeconds=10, pingDisconnect=true, autoReconnect=false, initialRandomReconnectDelaySeconds=5, maxReconnectIntervalSeconds=3600, chainHash=43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000, channelFlags=1, paymentRequestExpirySeconds=3600, multiPartPaymentExpirySeconds=60, minFundingSatoshis=1000 sat, maxFundingSatoshis=16777215 sat, maxPaymentAttempts=5, trampolineNode=NodeUri(id=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, host=13.248.222.197, port=9735), enableTrampolinePayment=true), remoteNodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134), currentTip=(1897615, BlockHeader(version=536870912, hashPreviousBlock=5417a9ce3ed9413e492b9636cfad501b9fff861c7754ff643e00000000000000, hashMerkleRoot=31ae29df25eb9c79175eecf5bc73c9d573324998a51a76a794495b350de1f841, time=1607963875, bits=424073553, nonce=307724605)), currentOnChainFeerates=OnChainFeerates(mutualCloseFeerate=FeeratePerKw(feerate=253 sat), claimMainFeerate=FeeratePerKw(feerate=253 sat), fastFeerate=FeeratePerKw(feerate=253 sat)), commitments=Commitments(channelVersion=ChannelVersion(bits=0x0000000f), localParams=LocalParams(nodeId=039a927997b7bd773f38c74e9a2d133efd3d902756cae58574dfd71bfa79e801f7, fundingKeyPath=m/1/2/3, dustLimit=546 sat, maxHtlcValueInFlightMsat=150000000, channelReserve=600 sat, htlcMinimum=1000 msat, toSelfDelay=CltvExpiryDelta(underlying=144), maxAcceptedHtlcs=30, isFunder=false, defaultFinalScriptPubKey=00140ad04adaa1b17be55f507eb111f5ec9d5a8940e8, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=mandatory), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional), ActivatedFeature(feature=option_anchor_outputs, support=optional), ActivatedFeature(feature=trampoline_payment, support=optional)], unknown=[])), remoteParams=RemoteParams(nodeId=03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134, dustLimit=546 sat, maxHtlcValueInFlightMsat=20000000000, channelReserve=0 sat, htlcMinimum=1 msat, toSelfDelay=CltvExpiryDelta(underlying=720), maxAcceptedHtlcs=30, fundingPubKey=02f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432, revocationBasepoint=02b19257d8afa234568e65c024338c392a39f1d372845bb3e631db9489c84f596d, paymentBasepoint=026b7ba89874b9c9c718ecfe9ebf5ed8eb087c18be23b6392c56786bfc5e6145c8, delayedPaymentBasepoint=031807fdcb19550c6f9bb8c99a01004c70477bf795ad54de1349346047c1588423, htlcBasepoint=021306843946ac7660a9ca58249c6a90543686934c7e2573bc53c3c5cd42075072, features=Features(activated=[ActivatedFeature(feature=option_data_loss_protect, support=optional), ActivatedFeature(feature=initial_routing_sync, support=optional), ActivatedFeature(feature=gossip_queries, support=optional), ActivatedFeature(feature=var_onion_optin, support=optional), ActivatedFeature(feature=gossip_queries_ex, support=optional), ActivatedFeature(feature=option_static_remotekey, support=optional), ActivatedFeature(feature=payment_secret, support=optional), ActivatedFeature(feature=basic_mpp, support=optional), ActivatedFeature(feature=option_support_large_channel, support=optional)], unknown=[])), channelFlags=0, localCommit=LocalCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=999000 msat, toRemote=100302000 msat), publishableTxs=PublishableTxs(commitTx=CommitTx(input=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000aaf56f80044a0100000000000022002014f68b86d42681f32cf5d86f068c36f2c13d6440a04590d7184222074047ee2f4a0100000000000022002086f45ec8d019457dd7cb71ba78b99768aec82cd6f1e7d9af0abf8331b38747f2e703000000000000220020fd91a0f611170c38268b915932618924dcefb7c9e7663285f27e76676f829b970883010000000000220020a9a7f11719f65f48994e9154dd93a4fefdda9a88bfc7b9c9395159ef627ead360400473044022078e495214792a90bccf100b73f04cbbfc3605bb30d73469ab967c33e1fba715f022067e440b19358faa40320031e8dc68ba886c0749fb25b0d8cdfd6f5e4c3d126b10147304402202c6c7a98302f506ce3e72a47827a20d836b9184777815f620b7687e1484b747c022021ab41fcf65a18571f24adce2cddbb9dbf29dbff3544a53a9584591f4e7614720147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae6f6f5720), htlcTxsAndSigs=[])), remoteCommit=RemoteCommit(index=0, spec=CommitmentSpec(htlcs=[], feerate=FeeratePerKw(feerate=500 sat), toLocal=100302000 msat, toRemote=999000 msat), txid=a3797bd30c019a8e2b018fe04f8b19a368f80c72e1021748d407900f316f7085, remotePerCommitmentPoint=02412576e3b7254201970f8e0a17d4065055240e1ac2017a0c1006fac17b9f9541), localChanges=LocalChanges(proposed=[], signed=[], acked=[]), remoteChanges=RemoteChanges(proposed=[], acked=[], signed=[]), localNextHtlcId=0, remoteNextHtlcId=0, payments={}, remoteNextCommitInfo=Right(value=025490337db8dde5a5f4fec309c7afaaa85be95d97fac2eb8c7c88df186c83ea25), commitInput=InputInfo(outPoint=OutPoint(hash=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae58, index=1), txOut=TxOut(amount=101301 sat, publicKeyScript=0020b95d05a2e59c8bd08029203e132d7f1dc2d1c9b11765fa99a26e4471d51e028c), redeemScript=522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae), remotePerCommitmentSecrets=ShaChain(lastIndex = null), channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, remoteChannelData=), fundingTx=null, waitingSince=1607964084728, mutualCloseProposed=[02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000], mutualClosePublished=[02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000], localCommitPublished=null, remoteCommitPublished=null, nextRemoteCommitPublished=null, futureRemoteCommitPublished=null, revokedCommitPublished=[])
2020-12-14 11:41:24.777604-0500 Phoenix[36134:4865789] [AppController] Model: Model(connections=Connections(internet=ESTABLISHED, peer=ESTABLISHED, electrum=ESTABLISHED), balanceSat=999, history=[Transaction(id=53131f1d-0953-4eb8-b46b-b296ee666cbd, amountMsat=999000, desc=Phoenix payment, status=Success, timestamp=1607962656450)], lastTransaction=null)
2020-12-14 11:41:24.778094-0500 Phoenix[36134:4865789] [AppController] Model: Ready(channelCount=1, sats=999)
2020-12-14 11:41:24.834947-0500 Phoenix[36134:4865789] [Peer] sending ClosingSigned(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, feeSatoshis=170 sat, signature=41e2b19777fe492ddbcd6f64dc3d9025bacf7eece2bc532a58543be79809253100112f4c44c5704fc038a16eb0b9bdacb20511dd54dce3b9bd7fa5a8e9c37418, channelData=7b9539023776905d240cbd97cd7f417558269a19c9d026a2fb689368b201a4ef4ece41b739e1096b900499248b5961fa48ef1202ea52720f4f67852cb701ee3b39c160ed08d38f60029a4872b59ca1fa59697ac1a32b0a5ef588095ca48c742a24284ee13cbb73c6609c9b0bffa9bfed5538352dadda7923921ef543a2ae415a471b88fb1261c649842762c463f348d3b11a4e982c965649b6b21e980e0bfac8c3f19fde16da301ebfeae9552b1f89eb60364890dfb7a74f908eb218476d5abc59a169ce8b066aefcf887dad9a286f59552449d054855a49f0e0ca07d66ae0b52706f62200029b72fd501b22d2de8b66240ffe1b85be6718b589b45b99c16ddd64b42df1c596ce58cfc0c9b20605a755a40cfc1ec227553ae36556b8ca04eb1e7865b8eb4f1feef64404238feda8ac714ca32f62542fe81d05e89b151e2726cb615f04378b754864243336f80dae7f1cee35c0e1d46dd98c89f15a29d9f6e5eace5df16da72e5fc30107c974098af1eced1f1ccc91adde075093c9197c1c2e82f0cd97f78a9418848f523e97d28201b68d004f3f0b0cb15c01b9249a60e1310a81818f9d8771da23a3c93d483abb1cac35f8dd6c815b9f846f6f3605c5446558fdda459dd3c77a48ca7a565ffd1d4c47d633cd38ec7982124be53fc2c9486a690873270a209a099b720bd27b9d0d510b7815ff1fdd52e06abf98671fd0bd18402f22ce969d00982c1c2d785710bd813bb0f8ce53b1d8fe1e0211093f8e7bb450841f0fb1db6834e838a49b37ab775bbbb4afae40a09bc471af17ae6f0d3f19e679e60166201cbfc6eac81547208f7456e4073607f4558b18e41482e2b02cac2c32b0c1008aca224248000a00aad8c0a878d7f168f983a51c2e3089fd970626cb0f7191abce61181f0a6a58fe19424c274bc68c5f4cf5001cce47d6b2278ecec7e63a59afb639173f44947c266140a305826c8e9e4e085f9237fd50a9231892161a29308e21f13daef5b1a3daa2aab1eb7a277b83aa2e7acac0963161c8e7cc5ca7e4e52638a494f4d78756da880bd9ed347c4de11a4394234646a44d2fd2786cee2e4ee1848f46d61f4af489c6dc770f557ac582bc913e87c17fccf50aaaecf7ad4be26b9234a8cf45e1c01107eac704eb104ee7928f763d9637166b8f5711c6e0a79383d53f1b285d3b7265df7e0753eca82c9074e0bb40d174a5ecf13888c7596c6e874d649e4ff7eeb0019380a2788029441819d031e7ea52e6ad143ccb6d850ce49cf722b9eaee2b6fe5ac7ada3b7bc1ab4f5bfe49e790131a7909fcf460a1b7583bc3bd9288b79405344f5de16d75640f11a3a440b3d6de1b1765e138743fc660682117ae7bfb24da6c05e35900c0bec3466aa6f1ef8d4183f7dba08cbb0e7a36f0bd3297e8f092356c0b63363d1517e22d156be95de5ee27f360247df4a6fa055abdc7ca5da3e21576aec1622bc86f0e4621ba36967fe37cb3473ed91bd2b55ca9311c4d283305cd0ebbf911eb8199155ce0b715cab1235ce120abaa5134d27d36dbc8676510d4e091ca645fea08f75912b0e3458bd0e83e19c6c01f2cbfce09b7973a31ea012d58e51f1f88457434a0f42204eabea48c5338523d384a05c0d2cd98778e26b3cf7172aef8d22831d7a6c0d04ee21e76666da72a52af8b970a78402845c07f687e3bdc09299c8f2ce2507bec542376fa3de16d002cd4c7e171b69e13e5183279ccd8252b49cd8388b6786204ef8279227dc59089fe616f1e4d4a015e0c18c4184805059eaf17ae373e6c1b760261b4cc4851ec916cbc2dddc88d4483de987a6987ffa3fe341b765f84d6b2b2e52caef76f72e3776b87b6734160e25e5df2112c8249804f8243ca22f37c3ced475aebcf1727edfbf53974e81673288ba687f13b7d407b5c06fb22a9bf56d7215b7018e0227292a2cf65eb675d5296e9c857f5f6603fcac96626911489ecb491cd492f19517c7af469b6df60b38fd6f45cf13630e95fd37ea5dd7d6a18ab4009eff5d93613faaa9ea91c9542b51de5292c7bbf134925ebfa1046e79c6f50a59537a45e85dfa785e78215c930dd7062a6e063d38b88238fa5187ec89f0115a57cf158314c7e0a5b6f898006f822d57eeb80556f7674ebdfbfef1cb4b95867964ace6b5e028e98749dd5b37763ef7579f4cf570b03120b9f15121772474985530a54c1f26651d4ed69d09b6b296adf41338fc20ba487071dc5de72ab7e41489b3713f8c06a8848554644c2a23e34d4bc168645326df10c5436b8093945a6296ed7ef4b2c107f8017541a26d5daf466b932c91038bcc9cf607af22d6f81cd41ef470a719ee68ffe6c2c6b3c7f328f61a8d462a8adebcef3527c33afc610fa12a86c78bc56ede53e6f3b705b21fb6bbbd4d3dcbec68c60e20d47475ed88a786a7d014a51781cbee3dcd84b50d654286ee64a95d3c2b7abe3c388a60a676c41b07c63f49973146cee42122daa4ce7b96b62c8cdf14661f887eab00d39b2af1fa1553ae6b41f49c41c924be3822004a004f098347f445ecca359b38165c8446193b6b5995bbe691a564f7c315836a10fde2a86d394823f9b945a511ea6cee4bb9bd901d058c2429b426b712fe4a4af0cc94c45e4f4a92d16b3cf6d754ef1cca3d2252b15f15db0cd838f7ae1edd33cd7be80aded3d23668cfb0bc36a962213638f97569bb87f3ccc3d9dc565d4a28c5644366acbdc8bc2e392ee823d898b89dab0f2cb453a0d99643c271eed8aa965b2fd6bb627ce35f3a4285130543ea4d2d0bd6e09a85bfae92f0a48c3c45e6f43385d6840df2a5f1d3742a7100a6fc3fb7ba2adab5687b565c9c1f7232aa37072fd31167c8257c9f580f527c10e2aeae1ec3239fa3e8d2e2035c6c82f439c4f74901efaddf3d4e8a0308f2a810d13da551d93ee5f6efa742138e1fffd84b1860123bfb2c4f6cc328017ea23accca5d8389442f1e8825094d612e8952bef4fa5bb46ec8d8087bebc234b400dba9e8a36eea78534cb8837c80a04c8d5efab2f62167067194038a1b93d36fe15f969c204ee856006cea057ed6141e31a698fa1fbb6d5f476a29bf0fb163d4392e9d5c36166308d096b0ce34a63eb7c7d6570332162da8f0860acd17cba3fed31b5be7dba183386667f1bff45cbb7684ebe91ad378a8968c9db8bf85b4210bc7bb78dd7eed7a6cc9dd5b7568bab0dca0b40209ab4884d8e234ed45a1415106b828adc28e61ba368ba0d1dffd0d4460fc1391afd3794b2d1b603379bdd414eb6861f7a6f5ec1fb4914b3c446b0168d080182f7e3e74110a3522079988cce8bac06b8cc4aef36fbd898a3b94c6d0b516ce7c8244c7173a038587407c1317e1c1aba7b95e298730dbff9320832b924a1c2905e6e99c03dbe7063ff108ed36de7ff9d5d026419cb44560612d925ea9743b27b6ed406ed1c8104d38d7413d8b43c432e04a5d34a5eac80a7e5d1ddfecaf573cfaaff0cf3d1f423e4d684b37df0c362d8470e2b351ca5ce7ccd7940b44923ec73f8868fcfa55013e68c6923b3d26b9954963efe23d735e0af9e24014c140a8e347d617451b01ca956bc8e18862aef9a37e9fd0cd254ed4c4fe12696c53fa13c6adadebf9213d2f21ca95113d1439d2936750958efd1d509c1f0e9f40ad88222faa81fcddb1ac51d3fb6f3dee2ccef0325ed5d7d9f8dcc154e8d579170b0ec91950a2e7b0d435a842255c19c731e4a197a668e8d60802a3957e909177129db8af21d6a93e58bc68a70938744f94ba973236ec051f69b234449436ac674e7577a7931dabe01590a7ca5a72f9862f495ff46992072385432c5d2c79d5c04b91bc2990002d68c898bd18d695f0ece837f4c68a03cd8664af3cc13ee8f1ed1578717ca631fcffaeacb1b767a6e7f87cbe5c462252b908996a0a647293ecc12ae276add71622091785c7863616363630dc65badadc66ace92c98905be0c6ca5327e941535497c688b3a48a95a61b82b242d17594154e5fea1514ad2e4b3646a120e9b4a1a0649f27dff972993e6be9aee5e47f4f8c22ececf617d693fb513c62f8ad85a0819d88d092f9c39858b8e72949943b3f1c00c3688c38a3e54d919469353bcd350c0305f9b7feba1caf1b3cd9c3cbe84d116f368eefcdbc1cdd6f552954c96924350e90ea3bd0686a32e17819910fcd4632abd95c481c5fcb04a0ce39ff6e8cfcc09bb252daa86b615a316f79a8fb587ab511a3ae569c192fefe991164d6ad8f23e878849b86f6b80dc186e0300771f1de6370ce57209f66f801481a8c7fb6f18067e4db295b8947cc6faebcdfd3bf1881122a87a5092fc62982716f66741559455bd8d155a581611e35deff3a9d9aa74ca0b98741d09f69a6826a8935a539133fa580178b04cfeee1d9332c03b374696e1d658cf27eff92f9a95b63c2d25dfab059905667f45549a71c3f9cf5a6064404b5444971cb0d79d5f3f903bea6293f9a5410026a262632c83fdb7b557d3eeffec1897756e5f04ddbb7020da113ec16118adbb8b5f75f76275bc5299a3ba1f8aa6c9b30f99eb0c020c844142dbb3bd589823f13412704a57679591ed6e1e5eb2b8349676aa3c25362271da9c2ec1ac0e0584265594816774bfbedc804e2966961d754f42f4cd0387128bfce1652d825713a7f52a2e249f713f7ed34ef584e41c9d6dd583949441dc44eb6a51330d5ee4604be52f78776cbf6659ab0a2dcaa46a68a793428441638ad0bf35ea8acadcf0d8831b50e42106891012c0f1f30e70143f239da1d676f4bbbc2b0a04a8744b8eed9955f4948c69ef7544ec6ce79ea4a41062521009b29e1ead329b55debb9e045feb3c5e391460e268ba6e3f983901149d3ad07830078ceb13a5ccd197bed041d1e64c77e5be223358c835f15e49f7eb36ffbe9350d72e90139f5af274dd6c876382df4cca17c62b46e5a45b6067f208c00ec5db5202cb8a91a70501fc5ebcd9416c5229ff53e9ac7b5787e812b2bfce8e6003e8fa534760e1efe91f44c1fbea3feca1c47a7bda2f025f883f004adccb02603c537d3ec7cf5774f66f510f9fd792d6be7740c2e50a776f2089788c7a7a8f3224cf5f68bdf6c87d2863051f5c25c2d99bbf105aa6b6325ab546740272e7d9cc4841d71df18983db46a2505f29a0cc05082012712baf5ec42cb9bed38bcbe91be789e3eb8ecdcb7d32f6aaa6bb0c3456436d85755092e31f304164cba2d4ef6488d511afccb79ddcc791e6112ac70724d5d09a77bd158eb7686672e8d3e8e0d07201841a977bb95689f1a3a6efd5ccdbdfae571a95d0877fb850bd4b82e7e6e236e51c9698c910aa726a1fb7867867fd839587796a689d9ff130d41542acaa203eb0f677976d55f393c71de4b87ea07383033e7552007464c55a76c868b3aa69c79c5b4785125e47162c24f0e5057ce120c54e7dbf20090b35753f04f2f8e0dd904b9e05358f344541004ce47811ce198fe702a6718ae5b006094a9cdb18b2c2976e2f5f58426a20d58641a795c098f42ac48ed101a69d331cfbacb8448489dfe541d876d7d384399febff2080629a75743da4535fca2e995785d36d6cc1159717595d39fe723602f62720a2de07e106f0f2c0b26c4264888bc03f364733dcc7df46c56077bd0cb9208b8477b1b22fcb0bac2a798231160abbe0d9ea301e2c0a01ebd0977c87ac8b4d91b6c65e70456834aeca8dd0b0359ac7cb5f640de49e613d8dfbf8c0c9fa18b47d4151dea039ab8e1469c157b4818ee1028790a55bb844ca5b23c53ad9af615baa652cfba14eb2cad2d142ae7808ee1a88392cabbc8f8dfb7118dab26a509f58f425de0bb49a9198c5bd74eb859f5feeff0af0a324cade601b4bda08affda4e3da6627065d06200afe1e776aa728a6d9b3b09cfbe0e5e107bdf1ae46f138f815ace7ad9224248da111ec79de9e198c4c930ca523b07af983f909f254c3bcabd89139909b5b85e3f5fdf752873e21dd35f7d3775811d6bf55a3a290b24e929817998ad00c99f8be7b8bbfa49d365e6947c342cf1730779a4084dc13312d48b33dc4f886ea15fcd64ca434640df662bcf67fc2edabe53afc66c48c8104feac56bd3093bbae0ec6f0266496e2856c73cd6a53d7281fbbe7993bd0b0d3c6043e6efb584f148478c0924cd592fd226bc08703fab758091e6c2f50309fc206a1e2a90fb206353983b11cc66abec80a7a50aadf8ebe266ada33210e09ca5458e2f79c057a838d90890e4a48fe7596fba5b9dda293267f4fb113cf31a8e3c60151ec4ed840980a8632cbe113c25a851cd05f774dcf5bb0717f75e71598dd500841ce97780b5041a900e2e3a89028c08fb42a18e86e3040b5dda969027413b83d18634a578e33ba2a1371883ab8d00a70d475c631f7da2c9acc9665e58aea1c9ff17564a4f37eb3b5eecfb340a8b03233a61797161b29fc1507ccb00673fa237dc47a8f787e058e0b42135e811d4cede09076909b4f36d94b085bd419a26b9e31bc3646d8f89aedca3080740af7de89b445de4032d1ffcfb630224418378a224cbce311128edcc8696bb88bc608d73c07f7fe3233a85d906953e1d74feb5d950067cc4074eac25f56e328bdda4d1a6009f9b8330aa8261f63cf81d88e171bdf78e221e6a78e2c4c72d808a7f7cb5afa1046b3d4127e25fdcceababd7edfaf3cff90a2b447c6db621498b7a6896c86dc50ef071896f8c0c7bc771480f8a6947bbc9eef612fb9a3895f89c512e99c19cedd3f255810af1f6fc1bd87bb97c7205ed31c33a9627ba354515930aef8db3be4ecfe65abc2ab5c61a549da20fdb71a444d4b39cd40e8cabe112cc95d2452dd7716dbb5d345f9045e774ae123b967d40f5712a26e253581691cd5e3e0ee7db58239f86b7f779e80a8fa9d4701d667eeecc418d48b2e2374416348c4a67cadbe63017bd46e6514c74846e340c1ea48c4e4c6d0af3034339d1c880b7109debdb3e630d3b3b08e40d4005ede30b1e9da9820f208accfe1bd33e3cbe08ceb31b118f99ffdcd1ebfbdba05f7a62908363144ba02416d02484ec1a4ad490cf713500a87f856db15ed0fb27b958c0f50d817cda77b760594ebe0aa7b484087c406b5e7df84f17f152d7bc55703e3155bc1ffc6430bfcecedb684442acd06f02e9051646cb79ba6e25fc78139d038446cdd22788a51834cbbc152d08ef76f40ab5e1fcebcdf12538bc7e714fe9cbeeab6ebc91a11166d983ba44019cf7886c1db41d128293e4e9d7383e83c7f114af5cf202e46f56f9e4a4dcc9dce12647a4441642747aeaf050b3a335bd52fcc9f32022fbf625c4c676ab12a2f4bb8ee36b5d86bffa29b7b1dc201bb4644b73999dfe41cbe6b0d5a00eb1ffd1a965e2cb8546eda3baed3a2b8e329da9365a133e9bca2e94fac7a5bc48a1682196a94ecb8beb602ac64b2a2618fd2e03adcb5c9564cd805f4853c22ffade710dfec09b6c4706f7069fed74f4b5a821b2514cbca653505f253320ee48783cba0f69db7a205092aa9f06d5c45a0d42cec35cff5a779c494f87077733ec3d933ae9f9e55784c45ec092dba4db6c28dc68c71a2653353690359288a0bcbc2130bae0a78ca6ccb9f7a0965e4152496e629ba9c93c23b93e5ef7969f44ffa3ebe8d6183eb19feeaa8a47053fa3edc9c6c35a3351b6e3bb9e37a3e3389af475e41641725ca833e44845cfd92c588fcf92f902d7769cbba0409aaa8df37b75321715f56939640d5af50212b2dcc83a22b94bd006094921cac3a249583a506bfdb774cc4c2bfceaf404aed04d14c1531e808db2db1051c03d07eb489b4c65cbb263d3c112d01bd41b38fb9e7c74430f465a41e64b1bb6df8983c1d850458a93c12438e20757da170aa4d201e83f0dbde64c3d8cb28ed1e78771dddb1ba8404dd0460f7aa36475681337524b18a24c2088f6651a5bacc76851f7662fd932602aeb3cd0ef99f91e37e76883301e12e1cccd2bec4e13d7028b3bf9cd0865f2b0a6ff202dc86b6a268947fc961d1e5c184b576f8ad853e3bbfd5df4c4df3b20da00c7ae6745b029f45f91a8e2aaa7dfe93f4520d05892c466e15dc55d96c6be127f8158fd641804dfb5f001710e0e9a0520f50f070f4ffed614d3bd21fe66133c5c15cd77fefd98466ea8e53c6efe984a8b5ee0df90d54cba55214a95d6a0f37399bf32549658dc7b747946ea43c46c7c1adbd93457cc9a80de2e9aa3c8c64a8f442fb21088e7e2e1ad8b65d5805b5d747242334b40c7c8d6fcff15638f44a04ea5936bb080a45cc3a9219b9c03c9470974914c419b876e36c997669651d6a4fe21c85f20ea2688510a64afd675232445857ffecab17ae9a6a9898b7fca07bd3affdc022682f693a28a173d86cc99a971bd2ef82338ebc65e3f0ce1130e20085a555ce06482eee3efb4ac37d083816e6ac775d11e3b01fc209e0a51934f80f201af9278672a802420584d135a77e58f31238ad53f5b7c61781f6476d4492615ea4f60739eb955e8b19cb7b4a06c5290052b62273019378f1d65eee812c3d8efc8f87645efa12ef59057bf4a79ed36393b001eeff87c0b2d8317c6194670a2a2a6b6494f526e4dbdf4b8bdb9443a3a99940254956121169c66e3873c1b4111e724f368674e264fb19bcaf78fee2ac44c4c66bc544a660844ab1a8bb7a761e531b8aee06f889cb1352c637cad2367a4d9af2312ed987340121b8495f2470a71e8be27a8da0015f570f40ccc99276975b0bcf552462ad055774dee34d369ede8aa4cc750065459b4de512b685b1a1a0ee7f0fbda97e4308af5fa54ab47621cf3f48662b6f22d5fddc45fe18391d867f859982bd82d014e4ba4edc4e874ad27ed60bf1f36bcd6603b6f565cbb31fc32b13abd5de14e9a5f34dde9519f3c229da5e6aa2158a5ba9b0a8a33feb5b4c532d9b50006fef2ed6467ed8fbd637d3d950c96df17bb7536c363d120cbb95c0e61bf413679a19ccf8ff6fca0755013c35c1cde828230e5cdb15a71f63e004db49f30a78cafaae21a4741ae0a464376c7a520a8a11b018d5dc550a001da78f45a67a09e1441597ee7952af3548155fe4681c67e93f517b4b8070e4b232771b6ab99187e440dcc21a03b249b5212abe25ce4c628db401d7a1fc400d53e81e1ea28a98d50ac4d2065e41cbc0059a786e391c4857c75966a8a3fa4cd6be8f5834230d745ccd7de438618f44f797469dc67068cccce3f63343ff16a9cb3017c26d17caf1e2c5eac9157c78a486251bdd5382e967b193f485f5df1cdee720a44e5c8a56ee7446a269af5b76069ba3f103d056a65aa9aebc5cca3918dcc93e81114063e95b3c2be37098f8fd0182fbf42a6b99b79b10952338662119ac2e8a0f96944fb1899491ad3f13113a4982c9b4cbc4a57fa58c91090ae7db9e935691a9e6afe34a714cb27545b7c16b3de85de5b9939996b2eea43efb80b5dcc8842f30c4069b82af5fa01497dbf61799806c96d1a1e9ca29fb1970fecc15edd80f5b80b79828fb5be2aabdc4fc6f2d0b6903c443e094a3ffc762e7c3ae47c59acc1d4e91ec7c13325b74ab16c69339db2154a2557e9f809c2d0cc787377f5e4f2fbd3e2217892daf717534a4c7f9663496e0e46957524525eb01418dd47d553ba9556287f41fe929892cdd5081b994e092b35f52a3e942a2e8ffec3d0db625db75d4acc10e742b2b627f92a67540cbd1a60203c2cc3bf45a9fe61941ecb34a077d4c272d855b26edc4b695c212852ff633ebe4ea5083b92e15faba4585d81e1a807498b856e3f4986dc68c7cb5274755b656fdf0c4112bce1472a9fc4b536cc5e75ec40eb1bdb4815ebedb4fbd31158a5e5f6f56a1036234cf00e8780143ebe860ef25e737b53b8ba94986c3e1c5c78a562cee98064443aa551dc40162d2107c9defb616daea49b9639bd6c0714a29ff8c0408cf125cbb19a9c79862bca66329bf4a084ee6ba39ff1e109f9824daf9af2be906f9d8732449c7fe56fd438d59ded286a198dff9c19843a9bb1af91cd6ee54ec05495264adbdcf7ced15efcc7fd365385439aea0f31e4f9d884d9eb0087ef85dac23795de2fd4ec2ddce83256238aaee6f24e6ea05d52f972fde4005b26fe894fde052fa8253cf8a81a36951d5f98f8706708726a98d078eb0110b4eac355ccd010ad953d0ca8c645d21aa09bd769d1bb4c5efdd403165e2b80fc8d01d8b08e5c80f7fbf3195a324f72700d7284641a49af2f27194b9a60e279310f6db9d41cb3702fc0a54120c5e3e397fbeea9460f49de5a52b2d96728734130b73787ccf0733cfb75c95209b152c34ef4b4287a7a5bf23688ff65d5cdeaa9afd1fa5e4ab4189160a3501a7dcc89a05417a631d40193e88eb07d229e05ebecb99848d351a8bd4da27743968f8df4cd82a89e73a0a0b138eaf741862840ba78774a8796c8841f9bee496b614d70f67c7541fb7f9705d7c5a48bf2b13f93fe51e94379dfb6e16fd1a3d8c5c16174ce30de1cf3f86786167e6045fde9ce3c2bceae3c7917d00dc053e2979ee5facba96ecffa181a62557ac0367aae517bc06ff334c1bef5ffdd42d5e63b7b85312dfdcb04db035027912379dd703e922b9d9cebdae8531af06db953af2257fb5bb1660540b6849bf9028a32756cfa6d8b66d01f08b93f10958825e73bc6c4e1b986735e00e883daa36ccb215bd2d01f6a0b8bea705b7399a92e31ff8473bd9b68c1c9b4eeb352ff8f3788d973f6e54a9cfbcad60d0b6d7e4df1fbcf073d1f884aaa28ab5067) encoded as 00276f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae5900000000000000aa41e2b19777fe492ddbcd6f64dc3d9025bacf7eece2bc532a58543be79809253100112f4c44c5704fc038a16eb0b9bdacb20511dd54dce3b9bd7fa5a8e9c37418fe47010000fd1db57b9539023776905d240cbd97cd7f417558269a19c9d026a2fb689368b201a4ef4ece41b739e1096b900499248b5961fa48ef1202ea52720f4f67852cb701ee3b39c160ed08d38f60029a4872b59ca1fa59697ac1a32b0a5ef588095ca48c742a24284ee13cbb73c6609c9b0bffa9bfed5538352dadda7923921ef543a2ae415a471b88fb1261c649842762c463f348d3b11a4e982c965649b6b21e980e0bfac8c3f19fde16da301ebfeae9552b1f89eb60364890dfb7a74f908eb218476d5abc59a169ce8b066aefcf887dad9a286f59552449d054855a49f0e0ca07d66ae0b52706f62200029b72fd501b22d2de8b66240ffe1b85be6718b589b45b99c16ddd64b42df1c596ce58cfc0c9b20605a755a40cfc1ec227553ae36556b8ca04eb1e7865b8eb4f1feef64404238feda8ac714ca32f62542fe81d05e89b151e2726cb615f04378b754864243336f80dae7f1cee35c0e1d46dd98c89f15a29d9f6e5eace5df16da72e5fc30107c974098af1eced1f1ccc91adde075093c9197c1c2e82f0cd97f78a9418848f523e97d28201b68d004f3f0b0cb15c01b9249a60e1310a81818f9d8771da23a3c93d483abb1cac35f8dd6c815b9f846f6f3605c5446558fdda459dd3c77a48ca7a565ffd1d4c47d633cd38ec7982124be53fc2c9486a690873270a209a099b720bd27b9d0d510b7815ff1fdd52e06abf98671fd0bd18402f22ce969d00982c1c2d785710bd813bb0f8ce53b1d8fe1e0211093f8e7bb450841f0fb1db6834e838a49b37ab775bbbb4afae40a09bc471af17ae6f0d3f19e679e60166201cbfc6eac81547208f7456e4073607f4558b18e41482e2b02cac2c32b0c1008aca224248000a00aad8c0a878d7f168f983a51c2e3089fd970626cb0f7191abce61181f0a6a58fe19424c274bc68c5f4cf5001cce47d6b2278ecec7e63a59afb639173f44947c266140a305826c8e9e4e085f9237fd50a9231892161a29308e21f13daef5b1a3daa2aab1eb7a277b83aa2e7acac0963161c8e7cc5ca7e4e52638a494f4d78756da880bd9ed347c4de11a4394234646a44d2fd2786cee2e4ee1848f46d61f4af489c6dc770f557ac582bc913e87c17fccf50aaaecf7ad4be26b9234a8cf45e1c01107eac704eb104ee7928f763d9637166b8f5711c6e0a79383d53f1b285d3b7265df7e0753eca82c9074e0bb40d174a5ecf13888c7596c6e874d649e4ff7eeb0019380a2788029441819d031e7ea52e6ad143ccb6d850ce49cf722b9eaee2b6fe5ac7ada3b7bc1ab4f5bfe49e790131a7909fcf460a1b7583bc3bd9288b79405344f5de16d75640f11a3a440b3d6de1b1765e138743fc660682117ae7bfb24da6c05e35900c0bec3466aa6f1ef8d4183f7dba08cbb0e7a36f0bd3297e8f092356c0b63363d1517e22d156be95de5ee27f360247df4a6fa055abdc7ca5da3e21576aec1622bc86f0e4621ba36967fe37cb3473ed91bd2b55ca9311c4d283305cd0ebbf911eb8199155ce0b715cab1235ce120abaa5134d27d36dbc8676510d4e091ca645fea08f75912b0e3458bd0e83e19c6c01f2cbfce09b7973a31ea012d58e51f1f88457434a0f42204eabea48c5338523d384a05c0d2cd98778e26b3cf7172aef8d22831d7a6c0d04ee21e76666da72a52af8b970a78402845c07f687e3bdc09299c8f2ce2507bec542376fa3de16d002cd4c7e171b69e13e5183279ccd8252b49cd8388b6786204ef8279227dc59089fe616f1e4d4a015e0c18c4184805059eaf17ae373e6c1b760261b4cc4851ec916cbc2dddc88d4483de987a6987ffa3fe341b765f84d6b2b2e52caef76f72e3776b87b6734160e25e5df2112c8249804f8243ca22f37c3ced475aebcf1727edfbf53974e81673288ba687f13b7d407b5c06fb22a9bf56d7215b7018e0227292a2cf65eb675d5296e9c857f5f6603fcac96626911489ecb491cd492f19517c7af469b6df60b38fd6f45cf13630e95fd37ea5dd7d6a18ab4009eff5d93613faaa9ea91c9542b51de5292c7bbf134925ebfa1046e79c6f50a59537a45e85dfa785e78215c930dd7062a6e063d38b88238fa5187ec89f0115a57cf158314c7e0a5b6f898006f822d57eeb80556f7674ebdfbfef1cb4b95867964ace6b5e028e98749dd5b37763ef7579f4cf570b03120b9f15121772474985530a54c1f26651d4ed69d09b6b296adf41338fc20ba487071dc5de72ab7e41489b3713f8c06a8848554644c2a23e34d4bc168645326df10c5436b8093945a6296ed7ef4b2c107f8017541a26d5daf466b932c91038bcc9cf607af22d6f81cd41ef470a719ee68ffe6c2c6b3c7f328f61a8d462a8adebcef3527c33afc610fa12a86c78bc56ede53e6f3b705b21fb6bbbd4d3dcbec68c60e20d47475ed88a786a7d014a51781cbee3dcd84b50d654286ee64a95d3c2b7abe3c388a60a676c41b07c63f49973146cee42122daa4ce7b96b62c8cdf14661f887eab00d39b2af1fa1553ae6b41f49c41c924be3822004a004f098347f445ecca359b38165c8446193b6b5995bbe691a564f7c315836a10fde2a86d394823f9b945a511ea6cee4bb9bd901d058c2429b426b712fe4a4af0cc94c45e4f4a92d16b3cf6d754ef1cca3d2252b15f15db0cd838f7ae1edd33cd7be80aded3d23668cfb0bc36a962213638f97569bb87f3ccc3d9dc565d4a28c5644366acbdc8bc2e392ee823d898b89dab0f2cb453a0d99643c271eed8aa965b2fd6bb627ce35f3a4285130543ea4d2d0bd6e09a85bfae92f0a48c3c45e6f43385d6840df2a5f1d3742a7100a6fc3fb7ba2adab5687b565c9c1f7232aa37072fd31167c8257c9f580f527c10e2aeae1ec3239fa3e8d2e2035c6c82f439c4f74901efaddf3d4e8a0308f2a810d13da551d93ee5f6efa742138e1fffd84b1860123bfb2c4f6cc328017ea23accca5d8389442f1e8825094d612e8952bef4fa5bb46ec8d8087bebc234b400dba9e8a36eea78534cb8837c80a04c8d5efab2f62167067194038a1b93d36fe15f969c204ee856006cea057ed6141e31a698fa1fbb6d5f476a29bf0fb163d4392e9d5c36166308d096b0ce34a63eb7c7d6570332162da8f0860acd17cba3fed31b5be7dba183386667f1bff45cbb7684ebe91ad378a8968c9db8bf85b4210bc7bb78dd7eed7a6cc9dd5b7568bab0dca0b40209ab4884d8e234ed45a1415106b828adc28e61ba368ba0d1dffd0d4460fc1391afd3794b2d1b603379bdd414eb6861f7a6f5ec1fb4914b3c446b0168d080182f7e3e74110a3522079988cce8bac06b8cc4aef36fbd898a3b94c6d0b516ce7c8244c7173a038587407c1317e1c1aba7b95e298730dbff9320832b924a1c2905e6e99c03dbe7063ff108ed36de7ff9d5d026419cb44560612d925ea9743b27b6ed406ed1c8104d38d7413d8b43c432e04a5d34a5eac80a7e5d1ddfecaf573cfaaff0cf3d1f423e4d684b37df0c362d8470e2b351ca5ce7ccd7940b44923ec73f8868fcfa55013e68c6923b3d26b9954963efe23d735e0af9e24014c140a8e347d617451b01ca956bc8e18862aef9a37e9fd0cd254ed4c4fe12696c53fa13c6adadebf9213d2f21ca95113d1439d2936750958efd1d509c1f0e9f40ad88222faa81fcddb1ac51d3fb6f3dee2ccef0325ed5d7d9f8dcc154e8d579170b0ec91950a2e7b0d435a842255c19c731e4a197a668e8d60802a3957e909177129db8af21d6a93e58bc68a70938744f94ba973236ec051f69b234449436ac674e7577a7931dabe01590a7ca5a72f9862f495ff46992072385432c5d2c79d5c04b91bc2990002d68c898bd18d695f0ece837f4c68a03cd8664af3cc13ee8f1ed1578717ca631fcffaeacb1b767a6e7f87cbe5c462252b908996a0a647293ecc12ae276add71622091785c7863616363630dc65badadc66ace92c98905be0c6ca5327e941535497c688b3a48a95a61b82b242d17594154e5fea1514ad2e4b3646a120e9b4a1a0649f27dff972993e6be9aee5e47f4f8c22ececf617d693fb513c62f8ad85a0819d88d092f9c39858b8e72949943b3f1c00c3688c38a3e54d919469353bcd350c0305f9b7feba1caf1b3cd9c3cbe84d116f368eefcdbc1cdd6f552954c96924350e90ea3bd0686a32e17819910fcd4632abd95c481c5fcb04a0ce39ff6e8cfcc09bb252daa86b615a316f79a8fb587ab511a3ae569c192fefe991164d6ad8f23e878849b86f6b80dc186e0300771f1de6370ce57209f66f801481a8c7fb6f18067e4db295b8947cc6faebcdfd3bf1881122a87a5092fc62982716f66741559455bd8d155a581611e35deff3a9d9aa74ca0b98741d09f69a6826a8935a539133fa580178b04cfeee1d9332c03b374696e1d658cf27eff92f9a95b63c2d25dfab059905667f45549a71c3f9cf5a6064404b5444971cb0d79d5f3f903bea6293f9a5410026a262632c83fdb7b557d3eeffec1897756e5f04ddbb7020da113ec16118adbb8b5f75f76275bc5299a3ba1f8aa6c9b30f99eb0c020c844142dbb3bd589823f13412704a57679591ed6e1e5eb2b8349676aa3c25362271da9c2ec1ac0e0584265594816774bfbedc804e2966961d754f42f4cd0387128bfce1652d825713a7f52a2e249f713f7ed34ef584e41c9d6dd583949441dc44eb6a51330d5ee4604be52f78776cbf6659ab0a2dcaa46a68a793428441638ad0bf35ea8acadcf0d8831b50e42106891012c0f1f30e70143f239da1d676f4bbbc2b0a04a8744b8eed9955f4948c69ef7544ec6ce79ea4a41062521009b29e1ead329b55debb9e045feb3c5e391460e268ba6e3f983901149d3ad07830078ceb13a5ccd197bed041d1e64c77e5be223358c835f15e49f7eb36ffbe9350d72e90139f5af274dd6c876382df4cca17c62b46e5a45b6067f208c00ec5db5202cb8a91a70501fc5ebcd9416c5229ff53e9ac7b5787e812b2bfce8e6003e8fa534760e1efe91f44c1fbea3feca1c47a7bda2f025f883f004adccb02603c537d3ec7cf5774f66f510f9fd792d6be7740c2e50a776f2089788c7a7a8f3224cf5f68bdf6c87d2863051f5c25c2d99bbf105aa6b6325ab546740272e7d9cc4841d71df18983db46a2505f29a0cc05082012712baf5ec42cb9bed38bcbe91be789e3eb8ecdcb7d32f6aaa6bb0c3456436d85755092e31f304164cba2d4ef6488d511afccb79ddcc791e6112ac70724d5d09a77bd158eb7686672e8d3e8e0d07201841a977bb95689f1a3a6efd5ccdbdfae571a95d0877fb850bd4b82e7e6e236e51c9698c910aa726a1fb7867867fd839587796a689d9ff130d41542acaa203eb0f677976d55f393c71de4b87ea07383033e7552007464c55a76c868b3aa69c79c5b4785125e47162c24f0e5057ce120c54e7dbf20090b35753f04f2f8e0dd904b9e05358f344541004ce47811ce198fe702a6718ae5b006094a9cdb18b2c2976e2f5f58426a20d58641a795c098f42ac48ed101a69d331cfbacb8448489dfe541d876d7d384399febff2080629a75743da4535fca2e995785d36d6cc1159717595d39fe723602f62720a2de07e106f0f2c0b26c4264888bc03f364733dcc7df46c56077bd0cb9208b8477b1b22fcb0bac2a798231160abbe0d9ea301e2c0a01ebd0977c87ac8b4d91b6c65e70456834aeca8dd0b0359ac7cb5f640de49e613d8dfbf8c0c9fa18b47d4151dea039ab8e1469c157b4818ee1028790a55bb844ca5b23c53ad9af615baa652cfba14eb2cad2d142ae7808ee1a88392cabbc8f8dfb7118dab26a509f58f425de0bb49a9198c5bd74eb859f5feeff0af0a324cade601b4bda08affda4e3da6627065d06200afe1e776aa728a6d9b3b09cfbe0e5e107bdf1ae46f138f815ace7ad9224248da111ec79de9e198c4c930ca523b07af983f909f254c3bcabd89139909b5b85e3f5fdf752873e21dd35f7d3775811d6bf55a3a290b24e929817998ad00c99f8be7b8bbfa49d365e6947c342cf1730779a4084dc13312d48b33dc4f886ea15fcd64ca434640df662bcf67fc2edabe53afc66c48c8104feac56bd3093bbae0ec6f0266496e2856c73cd6a53d7281fbbe7993bd0b0d3c6043e6efb584f148478c0924cd592fd226bc08703fab758091e6c2f50309fc206a1e2a90fb206353983b11cc66abec80a7a50aadf8ebe266ada33210e09ca5458e2f79c057a838d90890e4a48fe7596fba5b9dda293267f4fb113cf31a8e3c60151ec4ed840980a8632cbe113c25a851cd05f774dcf5bb0717f75e71598dd500841ce97780b5041a900e2e3a89028c08fb42a18e86e3040b5dda969027413b83d18634a578e33ba2a1371883ab8d00a70d475c631f7da2c9acc9665e58aea1c9ff17564a4f37eb3b5eecfb340a8b03233a61797161b29fc1507ccb00673fa237dc47a8f787e058e0b42135e811d4cede09076909b4f36d94b085bd419a26b9e31bc3646d8f89aedca3080740af7de89b445de4032d1ffcfb630224418378a224cbce311128edcc8696bb88bc608d73c07f7fe3233a85d906953e1d74feb5d950067cc4074eac25f56e328bdda4d1a6009f9b8330aa8261f63cf81d88e171bdf78e221e6a78e2c4c72d808a7f7cb5afa1046b3d4127e25fdcceababd7edfaf3cff90a2b447c6db621498b7a6896c86dc50ef071896f8c0c7bc771480f8a6947bbc9eef612fb9a3895f89c512e99c19cedd3f255810af1f6fc1bd87bb97c7205ed31c33a9627ba354515930aef8db3be4ecfe65abc2ab5c61a549da20fdb71a444d4b39cd40e8cabe112cc95d2452dd7716dbb5d345f9045e774ae123b967d40f5712a26e253581691cd5e3e0ee7db58239f86b7f779e80a8fa9d4701d667eeecc418d48b2e2374416348c4a67cadbe63017bd46e6514c74846e340c1ea48c4e4c6d0af3034339d1c880b7109debdb3e630d3b3b08e40d4005ede30b1e9da9820f208accfe1bd33e3cbe08ceb31b118f99ffdcd1ebfbdba05f7a62908363144ba02416d02484ec1a4ad490cf713500a87f856db15ed0fb27b958c0f50d817cda77b760594ebe0aa7b484087c406b5e7df84f17f152d7bc55703e3155bc1ffc6430bfcecedb684442acd06f02e9051646cb79ba6e25fc78139d038446cdd22788a51834cbbc152d08ef76f40ab5e1fcebcdf12538bc7e714fe9cbeeab6ebc91a11166d983ba44019cf7886c1db41d128293e4e9d7383e83c7f114af5cf202e46f56f9e4a4dcc9dce12647a4441642747aeaf050b3a335bd52fcc9f32022fbf625c4c676ab12a2f4bb8ee36b5d86bffa29b7b1dc201bb4644b73999dfe41cbe6b0d5a00eb1ffd1a965e2cb8546eda3baed3a2b8e329da9365a133e9bca2e94fac7a5bc48a1682196a94ecb8beb602ac64b2a2618fd2e03adcb5c9564cd805f4853c22ffade710dfec09b6c4706f7069fed74f4b5a821b2514cbca653505f253320ee48783cba0f69db7a205092aa9f06d5c45a0d42cec35cff5a779c494f87077733ec3d933ae9f9e55784c45ec092dba4db6c28dc68c71a2653353690359288a0bcbc2130bae0a78ca6ccb9f7a0965e4152496e629ba9c93c23b93e5ef7969f44ffa3ebe8d6183eb19feeaa8a47053fa3edc9c6c35a3351b6e3bb9e37a3e3389af475e41641725ca833e44845cfd92c588fcf92f902d7769cbba0409aaa8df37b75321715f56939640d5af50212b2dcc83a22b94bd006094921cac3a249583a506bfdb774cc4c2bfceaf404aed04d14c1531e808db2db1051c03d07eb489b4c65cbb263d3c112d01bd41b38fb9e7c74430f465a41e64b1bb6df8983c1d850458a93c12438e20757da170aa4d201e83f0dbde64c3d8cb28ed1e78771dddb1ba8404dd0460f7aa36475681337524b18a24c2088f6651a5bacc76851f7662fd932602aeb3cd0ef99f91e37e76883301e12e1cccd2bec4e13d7028b3bf9cd0865f2b0a6ff202dc86b6a268947fc961d1e5c184b576f8ad853e3bbfd5df4c4df3b20da00c7ae6745b029f45f91a8e2aaa7dfe93f4520d05892c466e15dc55d96c6be127f8158fd641804dfb5f001710e0e9a0520f50f070f4ffed614d3bd21fe66133c5c15cd77fefd98466ea8e53c6efe984a8b5ee0df90d54cba55214a95d6a0f37399bf32549658dc7b747946ea43c46c7c1adbd93457cc9a80de2e9aa3c8c64a8f442fb21088e7e2e1ad8b65d5805b5d747242334b40c7c8d6fcff15638f44a04ea5936bb080a45cc3a9219b9c03c9470974914c419b876e36c997669651d6a4fe21c85f20ea2688510a64afd675232445857ffecab17ae9a6a9898b7fca07bd3affdc022682f693a28a173d86cc99a971bd2ef82338ebc65e3f0ce1130e20085a555ce06482eee3efb4ac37d083816e6ac775d11e3b01fc209e0a51934f80f201af9278672a802420584d135a77e58f31238ad53f5b7c61781f6476d4492615ea4f60739eb955e8b19cb7b4a06c5290052b62273019378f1d65eee812c3d8efc8f87645efa12ef59057bf4a79ed36393b001eeff87c0b2d8317c6194670a2a2a6b6494f526e4dbdf4b8bdb9443a3a99940254956121169c66e3873c1b4111e724f368674e264fb19bcaf78fee2ac44c4c66bc544a660844ab1a8bb7a761e531b8aee06f889cb1352c637cad2367a4d9af2312ed987340121b8495f2470a71e8be27a8da0015f570f40ccc99276975b0bcf552462ad055774dee34d369ede8aa4cc750065459b4de512b685b1a1a0ee7f0fbda97e4308af5fa54ab47621cf3f48662b6f22d5fddc45fe18391d867f859982bd82d014e4ba4edc4e874ad27ed60bf1f36bcd6603b6f565cbb31fc32b13abd5de14e9a5f34dde9519f3c229da5e6aa2158a5ba9b0a8a33feb5b4c532d9b50006fef2ed6467ed8fbd637d3d950c96df17bb7536c363d120cbb95c0e61bf413679a19ccf8ff6fca0755013c35c1cde828230e5cdb15a71f63e004db49f30a78cafaae21a4741ae0a464376c7a520a8a11b018d5dc550a001da78f45a67a09e1441597ee7952af3548155fe4681c67e93f517b4b8070e4b232771b6ab99187e440dcc21a03b249b5212abe25ce4c628db401d7a1fc400d53e81e1ea28a98d50ac4d2065e41cbc0059a786e391c4857c75966a8a3fa4cd6be8f5834230d745ccd7de438618f44f797469dc67068cccce3f63343ff16a9cb3017c26d17caf1e2c5eac9157c78a486251bdd5382e967b193f485f5df1cdee720a44e5c8a56ee7446a269af5b76069ba3f103d056a65aa9aebc5cca3918dcc93e81114063e95b3c2be37098f8fd0182fbf42a6b99b79b10952338662119ac2e8a0f96944fb1899491ad3f13113a4982c9b4cbc4a57fa58c91090ae7db9e935691a9e6afe34a714cb27545b7c16b3de85de5b9939996b2eea43efb80b5dcc8842f30c4069b82af5fa01497dbf61799806c96d1a1e9ca29fb1970fecc15edd80f5b80b79828fb5be2aabdc4fc6f2d0b6903c443e094a3ffc762e7c3ae47c59acc1d4e91ec7c13325b74ab16c69339db2154a2557e9f809c2d0cc787377f5e4f2fbd3e2217892daf717534a4c7f9663496e0e46957524525eb01418dd47d553ba9556287f41fe929892cdd5081b994e092b35f52a3e942a2e8ffec3d0db625db75d4acc10e742b2b627f92a67540cbd1a60203c2cc3bf45a9fe61941ecb34a077d4c272d855b26edc4b695c212852ff633ebe4ea5083b92e15faba4585d81e1a807498b856e3f4986dc68c7cb5274755b656fdf0c4112bce1472a9fc4b536cc5e75ec40eb1bdb4815ebedb4fbd31158a5e5f6f56a1036234cf00e8780143ebe860ef25e737b53b8ba94986c3e1c5c78a562cee98064443aa551dc40162d2107c9defb616daea49b9639bd6c0714a29ff8c0408cf125cbb19a9c79862bca66329bf4a084ee6ba39ff1e109f9824daf9af2be906f9d8732449c7fe56fd438d59ded286a198dff9c19843a9bb1af91cd6ee54ec05495264adbdcf7ced15efcc7fd365385439aea0f31e4f9d884d9eb0087ef85dac23795de2fd4ec2ddce83256238aaee6f24e6ea05d52f972fde4005b26fe894fde052fa8253cf8a81a36951d5f98f8706708726a98d078eb0110b4eac355ccd010ad953d0ca8c645d21aa09bd769d1bb4c5efdd403165e2b80fc8d01d8b08e5c80f7fbf3195a324f72700d7284641a49af2f27194b9a60e279310f6db9d41cb3702fc0a54120c5e3e397fbeea9460f49de5a52b2d96728734130b73787ccf0733cfb75c95209b152c34ef4b4287a7a5bf23688ff65d5cdeaa9afd1fa5e4ab4189160a3501a7dcc89a05417a631d40193e88eb07d229e05ebecb99848d351a8bd4da27743968f8df4cd82a89e73a0a0b138eaf741862840ba78774a8796c8841f9bee496b614d70f67c7541fb7f9705d7c5a48bf2b13f93fe51e94379dfb6e16fd1a3d8c5c16174ce30de1cf3f86786167e6045fde9ce3c2bceae3c7917d00dc053e2979ee5facba96ecffa181a62557ac0367aae517bc06ff334c1bef5ffdd42d5e63b7b85312dfdcb04db035027912379dd703e922b9d9cebdae8531af06db953af2257fb5bb1660540b6849bf9028a32756cfa6d8b66d01f08b93f10958825e73bc6c4e1b986735e00e883daa36ccb215bd2d01f6a0b8bea705b7399a92e31ff8473bd9b68c1c9b4eeb352ff8f3788d973f6e54a9cfbcad60d0b6d7e4df1fbcf073d1f884aaa28ab5067
2020-12-14 11:41:24.841824-0500 Phoenix[36134:4865789] [ElectrumWatcher] publishing tx=[413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e / 02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000]
2020-12-14 11:41:24.842344-0500 Phoenix[36134:4865789] [ElectrumWatcher] added watch-confirmed on txid=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e scriptHash=fa4af4997df6f5f46ead23a35332ebdaeb24fdaf945673068f2b64069c72c5f4
2020-12-14 11:41:25.008049-0500 Phoenix[36134:4865789] [ElectrumWatcher] broadcast failed for txid=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e tx=02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000 with error=JsonRPCError(code=1, message=the transaction was rejected by network rules.

non-mandatory-script-verify-flag (Witness program was passed an empty witness) (code 64)
[02000000016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd200000000])
2020-12-14 11:41:25.159744-0500 Phoenix[36134:4865789] [ElectrumWatcher] scriptHash=fa4af4997df6f5f46ead23a35332ebdaeb24fdaf945673068f2b64069c72c5f4 at height=1897615
2020-12-14 11:41:30.759422-0500 Phoenix[36134:4865789] [ElectrumWatcher] scriptHash=e67140c74d898196f78c9a33ee903bbd0ae4c357b6951af6337286da516ffc6f at height=1897615
2020-12-14 11:41:30.760167-0500 Phoenix[36134:4865789] [ElectrumWatcher] scriptHash=fa4af4997df6f5f46ead23a35332ebdaeb24fdaf945673068f2b64069c72c5f4 at height=1897615
2020-12-14 11:41:31.222022-0500 Phoenix[36134:4865789] [ElectrumWatcher] txid=58aef2fc3bb6682e6e98d256ec876db1f855d229b302d93ecd35304edabe736f was confirmed at height=1897614 and now has confirmations=2 (currentHeight=1897615)
2020-12-14 11:41:31.222321-0500 Phoenix[36134:4865789] [ElectrumWatcher] txid=58aef2fc3bb6682e6e98d256ec876db1f855d229b302d93ecd35304edabe736f was confirmed at height=1897614 and now has confirmations=2 (currentHeight=1897615)
2020-12-14 11:41:31.224421-0500 Phoenix[36134:4865789] [ElectrumWatcher] output 58aef2fc3bb6682e6e98d256ec876db1f855d229b302d93ecd35304edabe736f:1 spent by transaction 413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e
2020-12-14 11:41:31.224902-0500 Phoenix[36134:4865789] [ElectrumWatcher] txid=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e was confirmed at height=0 and now has confirmations=1897616 (currentHeight=1897615)
2020-12-14 11:41:31.226130-0500 Phoenix[36134:4865789] [Peer] notification: WatchEventSpent(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, event=fr.acinq.eclair.blockchain.BITCOIN_FUNDING_SPENT@2b62828, tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd20400483045022100b0db16e9d3d31cdddc6e85e325c59fb92bf6e4dd9cea6f5a599bfff83efc32f2022005f4303cd8a63b12d708cdea412838ca18baf185603b744e07ec737794a3653401463043022041e2b19777fe492ddbcd6f64dc3d9025bacf7eece2bc532a58543be798092531021f112f4c44c5704fc038a16eb0b9bdacb20511dd54dce3b9bd7fa5a8e9c374180147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae00000000)
2020-12-14 11:41:31.230600-0500 Phoenix[36134:4865789] [ChannelState] funding tx spent in txid=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e
2020-12-14 11:41:31.235820-0500 Phoenix[36134:4865789] [Helpers] a revoked commit has been published with txnumber=158374055866223
2020-12-14 11:41:31.236347-0500 Phoenix[36134:4865789] [ChannelState] couldn't identify txid=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e, something very bad is going on!!!
2020-12-14 11:41:31.238876-0500 Phoenix[36134:4865789] [AppController] Model: Model(connections=Connections(internet=ESTABLISHED, peer=ESTABLISHED, electrum=ESTABLISHED), balanceSat=999, history=[Transaction(id=53131f1d-0953-4eb8-b46b-b296ee666cbd, amountMsat=999000, desc=Phoenix payment, status=Success, timestamp=1607962656450)], lastTransaction=null)
2020-12-14 11:41:31.239720-0500 Phoenix[36134:4865789] [AppController] Model: Ready(channelCount=1, sats=999)
2020-12-14 11:41:31.368575-0500 Phoenix[36134:4865789] [ElectrumWatcher] output 58aef2fc3bb6682e6e98d256ec876db1f855d229b302d93ecd35304edabe736f:1 spent by transaction 413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e
2020-12-14 11:41:31.368907-0500 Phoenix[36134:4865789] [ElectrumWatcher] txid=413912c84b120ff30ae2b8c53b590918c59458de97d796759fcc4b772593796e was confirmed at height=0 and now has confirmations=1897616 (currentHeight=1897615)
2020-12-14 11:41:31.370132-0500 Phoenix[36134:4865789] [Peer] notification: WatchEventSpent(channelId=6f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae59, event=fr.acinq.eclair.blockchain.BITCOIN_FUNDING_SPENT@2b62828, tx=020000000001016f73beda4e3035cd3ed902b329d255f8b16d87ec56d2986e2e68b63bfcf2ae580100000000ffffffff02e703000000000000160014d5b56728912a9f0ab408dd6cde817d9cebd4114d248701000000000016001416edfa875d4fb61756c0f0d2ad9d3804f7e03dd20400483045022100b0db16e9d3d31cdddc6e85e325c59fb92bf6e4dd9cea6f5a599bfff83efc32f2022005f4303cd8a63b12d708cdea412838ca18baf185603b744e07ec737794a3653401463043022041e2b19777fe492ddbcd6f64dc3d9025bacf7eece2bc532a58543be798092531021f112f4c44c5704fc038a16eb0b9bdacb20511dd54dce3b9bd7fa5a8e9c374180147522102f8ee8cac89d5f8803e6f63e54efe80b311dcbf472670c467320e4c9e04eab432210305ebb33158e0145b33fb48fe15c69be8e849f94024a77a32f81463ed917e9c0052ae00000000)
Uncaught Kotlin exception: kotlinx.coroutines.CoroutinesInternalError: Fatal exception in coroutines machinery for CancellableContinuation(Shareable[used]){true}@3357c48. Please read KDoc to 'handleFatalException' method and report this incident to maintainers
    at 0   PhoenixShared                       0x0000000107dacb8c kfun:kotlin.Error#<init>(kotlin.String?;kotlin.Throwable?){} + 124 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:14:63)
    at 1   PhoenixShared                       0x000000010810765c kfun:kotlinx.coroutines.CoroutinesInternalError#<init>(kotlin.String;kotlin.Throwable){} + 124 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/Exceptions.common.kt:28:77)
    at 2   PhoenixShared                       0x0000000108179b29 kfun:kotlinx.coroutines.DispatchedTask#handleFatalException(kotlin.Throwable?;kotlin.Throwable?){} + 953 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:93:22)
    at 3   PhoenixShared                       0x0000000108179707 kfun:kotlinx.coroutines.DispatchedTask#run(){} + 3543 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:64:13)
    at 4   PhoenixShared                       0x00000001081a7658 kfun:kotlinx.coroutines.DarwinMainDispatcher.dispatch$lambda-0#internal + 88 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:35:19)
    at 5   PhoenixShared                       0x00000001081a7a2e kfun:kotlinx.coroutines.DarwinMainDispatcher.$dispatch$lambda-0$FUNCTION_REFERENCE$43.invoke#internal + 62 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:34:51)
    at 6   PhoenixShared                       0x00000001081a7a8e kfun:kotlinx.coroutines.DarwinMainDispatcher.$dispatch$lambda-0$FUNCTION_REFERENCE$43.$<bridge-UNN>invoke(){}#internal + 62 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:34:51)
    at 7   PhoenixShared                       0x00000001081a8b47 _6f72672e6a6574627261696e732e6b6f746c696e783a6b6f746c696e782d636f726f7574696e65732d636f7265_knbridge8 + 183 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:34:51)
    at 8   libdispatch.dylib                   0x0000000109bd47ec _dispatch_call_block_and_release + 12
    at 9   libdispatch.dylib                   0x0000000109bd59c8 _dispatch_client_callout + 8
    at 10  libdispatch.dylib                   0x0000000109be3e75 _dispatch_main_queue_callback_4CF + 1152
    at 11  CoreFoundation                      0x00007fff2038bdab __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    at 12  CoreFoundation                      0x00007fff2038662e __CFRunLoopRun + 2685
    at 13  CoreFoundation                      0x00007fff203856c6 CFRunLoopRunSpecific + 567
    at 14  GraphicsServices                    0x00007fff2b76adb3 GSEventRunModal + 139
    at 15  UIKitCore                           0x00007fff24675187 -[UIApplication _run] + 912
    at 16  UIKitCore                           0x00007fff2467a038 UIApplicationMain + 101
    at 17  Phoenix                             0x00000001071ccdcb main + 75 (/Users/robbie/Programs/Acinq/phoenix-kmm/phoenix-ios/phoenix-ios/PhoenixApplicationDelegate.swift:5:7)
    at 18  libdyld.dylib                       0x00007fff20256409 start + 1
Caused by: kotlin.NotImplementedError: An operation is not implemented: Not yet implemented
    at 0   PhoenixShared                       0x0000000107db44dd kfun:kotlin.Throwable#<init>(kotlin.String?){} + 93 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Throwable.kt:23:37)
    at 1   PhoenixShared                       0x0000000107dacadb kfun:kotlin.Error#<init>(kotlin.String?){} + 91 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:12:44)
    at 2   PhoenixShared                       0x0000000107d9dfdb kfun:kotlin.NotImplementedError#<init>(kotlin.String){} + 91 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/backend.native/build/stdlib/kotlin/util/Standard.kt:15:90)
    at 3   PhoenixShared                       0x000000010833df0b kfun:fr.acinq.eclair.channel.ErrorInformationLeak#handleLocalError(fr.acinq.eclair.channel.ChannelEvent;kotlin.Throwable){}kotlin.Pair<fr.acinq.eclair.channel.ChannelState,kotlin.collections.List<fr.acinq.eclair.channel.ChannelAction>> + 555 (/Users/robbie/Programs/Acinq/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/channel/Channel.kt:2592:15)
    at 4   PhoenixShared                       0x0000000108265f2b kfun:fr.acinq.eclair.channel.ChannelState#process(fr.acinq.eclair.channel.ChannelEvent){}kotlin.Pair<fr.acinq.eclair.channel.ChannelState,kotlin.collections.List<fr.acinq.eclair.channel.ChannelAction>> + 923 (/Users/robbie/Programs/Acinq/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/channel/Channel.kt:156:13)
    at 5   PhoenixShared                       0x0000000108485c2a kfun:fr.acinq.eclair.io.Peer.$processEventCOROUTINE$41.invokeSuspend#internal + 96634 (/Users/robbie/Programs/Acinq/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/Peer.kt:593:51)
    at 6   PhoenixShared                       0x0000000108486e50 kfun:fr.acinq.eclair.io.Peer.processEvent#internal + 320 (/Users/robbie/Programs/Acinq/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/Peer.kt:410:21)
    at 7   PhoenixShared                       0x000000010846da44 kfun:fr.acinq.eclair.io.Peer.$runCOROUTINE$40.invokeSuspend#internal + 1956 (/Users/robbie/Programs/Acinq/eclair-kmp/src/commonMain/kotlin/fr/acinq/eclair/io/Peer.kt:406:13)
    at 8   PhoenixShared                       0x0000000107dd6916 kfun:kotlin.coroutines.native.internal.BaseContinuationImpl#resumeWith(kotlin.Result<kotlin.Any?>){} + 758 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:30:39)
    at 9   PhoenixShared                       0x0000000108179422 kfun:kotlinx.coroutines.DispatchedTask#run(){} + 2802 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:39:50)
    at 10  PhoenixShared                       0x00000001081a7658 kfun:kotlinx.coroutines.DarwinMainDispatcher.dispatch$lambda-0#internal + 88 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:35:19)
    ... and 14 more common stack frames skipped
CoreSimulator 732.18.0.2 - Device: iPhone 8 (49224348-C143-44F6-B255-A2FE9B2439EB) - Runtime: iOS 14.2 (18B79) - DeviceType: iPhone 8
(lldb) 

Edge case: restoring wallet with unconfirmed funding tx

Under normal circumstances, when the Phoenix app receives a payment, the state transitions to Normal immediately. However, this is not the case when restoring a wallet.

Steps to reproduce:

  • Send a payment to Phoenix/eclair-kmp such that a new channel is created
  • Notice that the channel is in Normal mode
  • Now start fresh (e.g. delete the Phoenix app & data)
  • Restore the wallet (i.e. restore using the same seed/phrase)
  • The channel is restored, but it's now in state WaitForFundingConfirmed

I'm not sure if this is working as designed or not.

However, when the client is in this state, other strange things happen. In particular:

  • attempt to receive a payment
  • the sender gets "payment processing" for ... a long time
  • the recipient enters slow loop of getting disconnected from the server

Screen Shot 2020-12-29 at 10 33 49

^ When in this state, attempt to receive a payment where sats is well below 103,252.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.