acinq / lightning-kmp Goto Github PK
View Code? Open in Web Editor NEWAn implementation of the Lightning Network in Kotlin.
License: Apache License 2.0
An implementation of the Lightning Network in Kotlin.
License: Apache License 2.0
This includes:
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 ?
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.
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)
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).
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.
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:
03864ef025fde8fb587d989186ce6a4a186895ee44a926bfc370e2c366597a3f8f
)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)
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.
We need to implement GetTxWithMeta
(see the eclair implementation for reference):
This requires a bit of work on the ElectrumWatcher
as well.
In Helpers.kt
, claimRevokedRemoteCommitTxOutputs
isn't fully implemented because we're lacking information about pending HTLCs.
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.
When receiving an IncomingPayment, such that a new channel is created, the IncomingPayment.received.amount doesn't match the user's balance:
Steps to reproduce:
Should the http fetch be done in Phoenix-KMM or in eclair-kmp?
See ACINQ/eclair#1484 and ACINQ/eclair#1491
This means receiving payments from node that do not support trampoline payments.
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
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.
I didn't look further into it, but this seems problematic.
Reproducible on the socket tests, on JVM and iOS, connection is failing if requests are repeated multiple times (<25).
Reproducible on testnet with seed=swap scale student indicate drum collect wealth jewel hope verb balance mammal
Issue happening in :
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
It will then need to be implemented by the kmm layers
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.
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:
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' ?"
Test cases to import:
And implement remaining TODO in Channel.kt
:
We should not log any seed, private key, secret, etc.
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.
It has to be different from the derivation used in the old Phoenix.
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:
tb1q6k6kw2y3920s4dqgm4kdaqtann4agy2dh2lwts
(bech32 decode = d5b56728912a9f0ab408dd6cde817d9cebd4114d
)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)
linked to ACINQ/phoenix-kmm#99
This error occurs since #173 (#172 or above are not affected).
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:
Normal
modeWaitForFundingConfirmed
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:
^ When in this state, attempt to receive a payment where sats is well below 103,252.
We should save our remote peer's latest channel_update
and use that in our routing hints in Bolt 11 invoices.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.