fundingmanager: change funding messages to use server.sendToPeer

Previously, during the channel funding process, peers sent wire
messages using peer.queueMsg. By switching to server.sendToPeer, the
fundingManager is more resilient to network connection issues or system
restarts during the funding process. With server.sendToPeer, if a peer
gets disconnected, the daemon can attempt to reconnect and continue the
process using the peer’s public key ID.
This commit is contained in:
bryanvu 2017-01-12 19:40:38 -08:00 committed by Olaoluwa Osuntokun
parent 69faebfcae
commit b21bd351e8
7 changed files with 923 additions and 680 deletions

View File

@ -35,7 +35,7 @@ const (
// * deadlines, etc.
type reservationWithCtx struct {
reservation *lnwallet.ChannelReservation
peer *peer
peerAddress *lnwire.NetAddress
updates chan *lnrpc.OpenStatusUpdate
err chan error
@ -47,7 +47,7 @@ type reservationWithCtx struct {
// embedded within this message giving the funding manager full context w.r.t
// the workflow.
type initFundingMsg struct {
peer *peer
peerAddress *lnwire.NetAddress
*openChanReq
}
@ -55,54 +55,84 @@ type initFundingMsg struct {
// peer who sent the message. This allows the funding manager to queue a
// response directly to the peer, progressing the funding workflow.
type fundingRequestMsg struct {
msg *lnwire.SingleFundingRequest
peer *peer
msg *lnwire.SingleFundingRequest
peerAddress *lnwire.NetAddress
}
// fundingResponseMsg couples an lnwire.SingleFundingResponse message with the
// peer who sent the message. This allows the funding manager to queue a
// response directly to the peer, progressing the funding workflow.
type fundingResponseMsg struct {
msg *lnwire.SingleFundingResponse
peer *peer
msg *lnwire.SingleFundingResponse
peerAddress *lnwire.NetAddress
}
// fundingCompleteMsg couples an lnwire.SingleFundingComplete message with the
// peer who sent the message. This allows the funding manager to queue a
// response directly to the peer, progressing the funding workflow.
type fundingCompleteMsg struct {
msg *lnwire.SingleFundingComplete
peer *peer
msg *lnwire.SingleFundingComplete
peerAddress *lnwire.NetAddress
}
// fundingSignCompleteMsg couples an lnwire.SingleFundingSignComplete message
// with the peer who sent the message. This allows the funding manager to
// queue a response directly to the peer, progressing the funding workflow.
type fundingSignCompleteMsg struct {
msg *lnwire.SingleFundingSignComplete
peer *peer
msg *lnwire.SingleFundingSignComplete
peerAddress *lnwire.NetAddress
}
// fundingOpenMsg couples an lnwire.SingleFundingOpenProof message
// with the peer who sent the message. This allows the funding manager to
// queue a response directly to the peer, progressing the funding workflow.
type fundingOpenMsg struct {
msg *lnwire.SingleFundingOpenProof
peer *peer
msg *lnwire.SingleFundingOpenProof
peerAddress *lnwire.NetAddress
}
// fundingErrorMsg couples an lnwire.ErrorGeneric message
// with the peer who sent the message. This allows the funding
// manager to properly process the error.
type fundingErrorMsg struct {
err *lnwire.ErrorGeneric
peer *peer
err *lnwire.ErrorGeneric
peerAddress *lnwire.NetAddress
}
// pendingChannels is a map instantiated per-peer which tracks all active
// pending single funded channels indexed by their pending channel identifier.
type pendingChannels map[uint64]*reservationWithCtx
// serializedPubKey is used within the FundingManager's activeReservations list
// to identify the nodes with which the FundingManager is actively working to
// initiate new channels.
type serializedPubKey [33]byte
// FundingConfig defines the configuration for the FundingManager. All elements
// within the configuration MUST be non-nil for the FundingManager to carry out
// its duties.
type FundingConfig struct {
// Wallet handles the parts of the funding process that involves moving
// funds from on-chain transaction outputs into Lightning channels.
Wallet *lnwallet.LightningWallet
// ArbiterChan allows the FundingManager to notify the BreachArbiter
// that a new channel has been created that should be observed to
// ensure that the channel counterparty hasn't broadcasted an invalid
// commitment transaction.
ArbiterChan chan<- *lnwallet.LightningChannel
// SendToPeer allows the FundingManager to send messages to the peer
// node during the multiple steps involved in the creation of the
// channel's funding transaction and initial commitment transaction.
SendToPeer func(target *btcec.PublicKey, msgs ...lnwire.Message) error
// FindPeer searches the list of peers connected to the node so that
// the FundingManager can notify other daemon subsystems as necessary
// during the funding process.
FindPeer func(peerKey *btcec.PublicKey) (*peer, error)
}
// fundingManager acts as an orchestrator/bridge between the wallet's
// 'ChannelReservation' workflow, and the wire protocol's funding initiation
// messages. Any requests to initiate the funding workflow for a channel,
@ -117,15 +147,14 @@ type fundingManager struct {
started int32
stopped int32
// cfg is a copy of the configuration struct that the FundingManager was
// initialized with.
cfg *FundingConfig
// channelReservations is a map which houses the state of all pending
// funding workflows.
resMtx sync.RWMutex
activeReservations map[int32]pendingChannels
// wallet is the daemon's internal Lightning enabled wallet.
wallet *lnwallet.LightningWallet
breachAribter *breachArbiter
activeReservations map[serializedPubKey]pendingChannels
// fundingMsgs is a channel which receives wrapped wire messages
// related to funding workflow from outside peers.
@ -147,7 +176,7 @@ type fundingManager struct {
// newFundingManager creates and initializes a new instance of the
// fundingManager.
func newFundingManager(w *lnwallet.LightningWallet, b *breachArbiter) *fundingManager {
func newFundingManager(cfg FundingConfig) (*fundingManager, error) {
// TODO(roasbeef): remove once we actually sign the funding_locked
// stuffs
s := "30450221008ce2bc69281ce27da07e6683571319d18e949ddfa2965fb6caa" +
@ -157,20 +186,19 @@ func newFundingManager(w *lnwallet.LightningWallet, b *breachArbiter) *fundingMa
fakeSig, _ := btcec.ParseSignature(fakeSigHex, btcec.S256())
return &fundingManager{
wallet: w,
breachAribter: b,
cfg: &cfg,
fakeProof: &channelProof{
nodeSig: fakeSig,
bitcoinSig: fakeSig,
},
activeReservations: make(map[int32]pendingChannels),
activeReservations: make(map[serializedPubKey]pendingChannels),
fundingMsgs: make(chan interface{}, msgBufferSize),
fundingRequests: make(chan *initFundingMsg, msgBufferSize),
queries: make(chan interface{}, 1),
quit: make(chan struct{}),
}
}, nil
}
// Start launches all helper goroutines required for handling requests sent
@ -219,7 +247,6 @@ func (f *fundingManager) NumPendingChannels() uint32 {
}
type pendingChannel struct {
peerId int32
identityPub *btcec.PublicKey
channelPoint *wire.OutPoint
capacity btcutil.Amount
@ -295,16 +322,14 @@ func (f *fundingManager) handleNumPending(msg *numPendingReq) {
// workflow (funding txn confirmation).
func (f *fundingManager) handlePendingChannels(msg *pendingChansReq) {
var pendingChannels []*pendingChannel
for peerID, peerChannels := range f.activeReservations {
for _, peerChannels := range f.activeReservations {
for _, pendingChan := range peerChannels {
peer := pendingChan.peer
res := pendingChan.reservation
localFund := res.OurContribution().FundingAmount
remoteFund := res.TheirContribution().FundingAmount
pendingChan := &pendingChannel{
peerId: peerID,
identityPub: peer.addr.IdentityKey,
identityPub: pendingChan.peerAddress.IdentityKey,
channelPoint: res.FundingOutpoint(),
capacity: localFund + remoteFund,
localBalance: localFund,
@ -318,8 +343,9 @@ func (f *fundingManager) handlePendingChannels(msg *pendingChansReq) {
// processFundingRequest sends a message to the fundingManager allowing it to
// initiate the new funding workflow with the source peer.
func (f *fundingManager) processFundingRequest(msg *lnwire.SingleFundingRequest, peer *peer) {
f.fundingMsgs <- &fundingRequestMsg{msg, peer}
func (f *fundingManager) processFundingRequest(msg *lnwire.SingleFundingRequest,
peerAddress *lnwire.NetAddress) {
f.fundingMsgs <- &fundingRequestMsg{msg, peerAddress}
}
// handleFundingRequest creates an initial 'ChannelReservation' within
@ -330,7 +356,9 @@ func (f *fundingManager) processFundingRequest(msg *lnwire.SingleFundingRequest,
func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
// Check number of pending channels to be smaller than maximum allowed
// number and send ErrorGeneric to remote peer if condition is violated.
if len(f.activeReservations[fmsg.peer.id]) >= cfg.MaxPendingChannels {
peerIDKey := newSerializedKey(fmsg.peerAddress.IdentityKey)
if len(f.activeReservations[peerIDKey]) >= cfg.MaxPendingChannels {
errMsg := &lnwire.ErrorGeneric{
ChannelPoint: wire.OutPoint{
Hash: chainhash.Hash{},
@ -340,14 +368,16 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
Code: lnwire.ErrMaxPendingChannels,
PendingChannelID: fmsg.msg.ChannelID,
}
fmsg.peer.queueMsg(errMsg, nil)
return
if err := f.cfg.SendToPeer(fmsg.peerAddress.IdentityKey, errMsg); err != nil {
fndgLog.Errorf("unable to send max pending channels message to peer", err)
return
}
}
// We'll also reject any requests to create channels until we're fully
// synced to the network as we won't be able to properly validate the
// confirmation of the funding transaction.
isSynced, err := f.wallet.IsSynced()
isSynced, err := f.cfg.Wallet.IsSynced()
if err != nil {
fndgLog.Errorf("unable to query wallet: %v", err)
return
@ -362,7 +392,10 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
Code: lnwire.ErrSynchronizingChain,
PendingChannelID: fmsg.msg.ChannelID,
}
fmsg.peer.queueMsg(errMsg, nil)
if err := f.cfg.SendToPeer(fmsg.peerAddress.IdentityKey, errMsg); err != nil {
fndgLog.Errorf("unable to send error message to peer %v", err)
return
}
return
}
@ -371,9 +404,9 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
delay := msg.CsvDelay
// TODO(roasbeef): error if funding flow already ongoing
fndgLog.Infof("Recv'd fundingRequest(amt=%v, push=%v, delay=%v, pendingId=%v) "+
"from peerID(%v)", amt, msg.PushSatoshis, delay, msg.ChannelID,
fmsg.peer.id)
fndgLog.Infof("Recv'd fundingRequest(amt=%v, delay=%v, pendingId=%v) "+
"from peer(%v)", amt, msg.PushSatoshis, delay, msg.ChannelID,
fmsg.peerAddress.IdentityKey.SerializeCompressed())
ourDustLimit := lnwallet.DefaultDustLimit()
theirDustlimit := msg.DustLimit
@ -386,13 +419,12 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
// TODO(roasbeef): passing num confs 1 is irrelevant here, make signed?
// TODO(roasbeef): assuming this was an inbound connection, replace
// port with default advertised port
reservation, err := f.wallet.InitChannelReservation(amt, 0,
fmsg.peer.addr.IdentityKey, fmsg.peer.addr.Address, 1, delay,
reservation, err := f.cfg.Wallet.InitChannelReservation(amt, 0,
fmsg.peerAddress.IdentityKey, fmsg.peerAddress.Address, 1, delay,
ourDustLimit, msg.PushSatoshis)
if err != nil {
// TODO(roasbeef): push ErrorGeneric message
fndgLog.Errorf("Unable to initialize reservation: %v", err)
fmsg.peer.Disconnect()
return
}
@ -402,12 +434,12 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
// peers map of pending reservations to track this particular reservation
// until either abort or completion.
f.resMtx.Lock()
if _, ok := f.activeReservations[fmsg.peer.id]; !ok {
f.activeReservations[fmsg.peer.id] = make(pendingChannels)
if _, ok := f.activeReservations[peerIDKey]; !ok {
f.activeReservations[peerIDKey] = make(pendingChannels)
}
f.activeReservations[fmsg.peer.id][msg.ChannelID] = &reservationWithCtx{
f.activeReservations[peerIDKey][msg.ChannelID] = &reservationWithCtx{
reservation: reservation,
peer: fmsg.peer,
peerAddress: fmsg.peerAddress,
}
f.resMtx.Unlock()
@ -427,7 +459,6 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
}
if err := reservation.ProcessSingleContribution(contribution); err != nil {
fndgLog.Errorf("unable to add contribution reservation: %v", err)
fmsg.peer.Disconnect()
return
}
@ -446,13 +477,17 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
ourContribution.MultiSigKey, ourContribution.CsvDelay,
deliveryScript, ourDustLimit)
fmsg.peer.queueMsg(fundingResp, nil)
if err := f.cfg.SendToPeer(fmsg.peerAddress.IdentityKey, fundingResp); err != nil {
fndgLog.Errorf("unable to send funding response to peer: %v", err)
return
}
}
// processFundingRequest sends a message to the fundingManager allowing it to
// continue the second phase of a funding workflow with the target peer.
func (f *fundingManager) processFundingResponse(msg *lnwire.SingleFundingResponse, peer *peer) {
f.fundingMsgs <- &fundingResponseMsg{msg, peer}
func (f *fundingManager) processFundingResponse(msg *lnwire.SingleFundingResponse,
peerAddress *lnwire.NetAddress) {
f.fundingMsgs <- &fundingResponseMsg{msg, peerAddress}
}
// handleFundingResponse processes a response to the workflow initiation sent
@ -460,14 +495,13 @@ func (f *fundingManager) processFundingResponse(msg *lnwire.SingleFundingRespons
// outpoint, and a commitment signature to the remote peer.
func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
msg := fmsg.msg
peerID := fmsg.peer.id
chanID := fmsg.msg.ChannelID
sourcePeer := fmsg.peer
peerKey := fmsg.peerAddress.IdentityKey
resCtx, err := f.getReservationCtx(peerID, chanID)
resCtx, err := f.getReservationCtx(peerKey, chanID)
if err != nil {
fndgLog.Warnf("Can't find reservation (peerID:%v, chanID:%v)",
peerID, chanID)
fndgLog.Warnf("Can't find reservation (peerKey:%v, chanID:%v)",
peerKey, chanID)
return
}
@ -496,8 +530,7 @@ func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
}
if err := resCtx.reservation.ProcessContribution(contribution); err != nil {
fndgLog.Errorf("Unable to process contribution from %v: %v",
sourcePeer, err)
fmsg.peer.Disconnect()
fmsg.peerAddress.IdentityKey, err)
resCtx.err <- err
return
}
@ -516,7 +549,12 @@ func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
// Register a new barrier for this channel to properly synchronize with
// the peer's readHandler once the channel is open.
fmsg.peer.barrierInits <- *outPoint
peer, err := f.cfg.FindPeer(peerKey)
if err != nil {
fndgLog.Errorf("Error finding peer: %v", err)
return
}
peer.barrierInits <- *outPoint
fndgLog.Infof("Generated ChannelPoint(%v) for pendingID(%v)", outPoint,
chanID)
@ -526,13 +564,19 @@ func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
fundingComplete := lnwire.NewSingleFundingComplete(chanID, *outPoint,
commitSig, revocationKey, obsfucator)
sourcePeer.queueMsg(fundingComplete, nil)
if err := f.cfg.SendToPeer(fmsg.peerAddress.IdentityKey, fundingComplete); err != nil {
fndgLog.Errorf("Unable to send funding complete message: %v", err)
resCtx.err <- err
return
}
}
// processFundingComplete queues a funding complete message coupled with the
// source peer to the fundingManager.
func (f *fundingManager) processFundingComplete(msg *lnwire.SingleFundingComplete, peer *peer) {
f.fundingMsgs <- &fundingCompleteMsg{msg, peer}
func (f *fundingManager) processFundingComplete(msg *lnwire.SingleFundingComplete,
peerAddress *lnwire.NetAddress) {
f.fundingMsgs <- &fundingCompleteMsg{msg, peerAddress}
}
// handleFundingComplete progresses the funding workflow when the daemon is on
@ -540,10 +584,13 @@ func (f *fundingManager) processFundingComplete(msg *lnwire.SingleFundingComplet
// processed, a signature is sent to the remote peer allowing it to broadcast
// the funding transaction, progressing the workflow into the final stage.
func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
resCtx, err := f.getReservationCtx(fmsg.peer.id, fmsg.msg.ChannelID)
peerKey := fmsg.peerAddress.IdentityKey
chanID := fmsg.msg.ChannelID
resCtx, err := f.getReservationCtx(peerKey, chanID)
if err != nil {
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
fmsg.peer.id, fmsg.msg.ChannelID)
peerKey, chanID)
return
}
@ -553,7 +600,6 @@ func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
// inititator's commitment transaction, then send our own if it's valid.
// TODO(roasbeef): make case (p vs P) consistent throughout
fundingOut := fmsg.msg.FundingOutPoint
chanID := fmsg.msg.ChannelID
fndgLog.Infof("completing pendingID(%v) with ChannelPoint(%v)",
chanID, fundingOut,
)
@ -570,7 +616,6 @@ func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
if err != nil {
// TODO(roasbeef): better error logging: peerID, channelID, etc.
fndgLog.Errorf("unable to complete single reservation: %v", err)
fmsg.peer.Disconnect()
return
}
@ -587,19 +632,28 @@ func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
// Register a new barrier for this channel to properly synchronize with
// the peer's readHandler once the channel is open.
fmsg.peer.barrierInits <- fundingOut
peer, err := f.cfg.FindPeer(peerKey)
if err != nil {
fndgLog.Errorf("Error finding peer: %v", err)
return
}
peer.barrierInits <- fundingOut
fndgLog.Infof("sending signComplete for pendingID(%v) over ChannelPoint(%v)",
fmsg.msg.ChannelID, fundingOut)
chanID, fundingOut)
signComplete := lnwire.NewSingleFundingSignComplete(chanID, ourCommitSig)
fmsg.peer.queueMsg(signComplete, nil)
if err := f.cfg.SendToPeer(peerKey, signComplete); err != nil {
fndgLog.Errorf("unable to send signComplete message: %v", err)
return
}
}
// processFundingSignComplete sends a single funding sign complete message
// along with the source peer to the funding manager.
func (f *fundingManager) processFundingSignComplete(msg *lnwire.SingleFundingSignComplete, peer *peer) {
f.fundingMsgs <- &fundingSignCompleteMsg{msg, peer}
func (f *fundingManager) processFundingSignComplete(msg *lnwire.SingleFundingSignComplete,
peerAddress *lnwire.NetAddress) {
f.fundingMsgs <- &fundingSignCompleteMsg{msg, peerAddress}
}
// channelProof is one half of the proof necessary to create an authenticated
@ -707,12 +761,12 @@ func newChanAnnouncement(localIdentity *btcec.PublicKey,
// encoding of the location of the channel within the blockchain.
func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg) {
chanID := fmsg.msg.ChannelID
peerID := fmsg.peer.id
peerKey := fmsg.peerAddress.IdentityKey
resCtx, err := f.getReservationCtx(peerID, chanID)
resCtx, err := f.getReservationCtx(peerKey, chanID)
if err != nil {
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
peerID, chanID)
peerKey, chanID)
return
}
@ -722,7 +776,6 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
commitSig := fmsg.msg.CommitSignature.Serialize()
if err := resCtx.reservation.CompleteReservation(nil, commitSig); err != nil {
fndgLog.Errorf("unable to complete reservation sign complete: %v", err)
fmsg.peer.Disconnect()
resCtx.err <- err
return
}
@ -759,22 +812,27 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
// This reservation is no longer pending as the funding
// transaction has been fully confirmed.
f.deleteReservationCtx(peerID, chanID)
f.deleteReservationCtx(peerKey, chanID)
fndgLog.Infof("ChannelPoint(%v) with peerID(%v) is now active",
fundingPoint, peerID)
fundingPoint, peerKey)
// Now that the channel is open, we need to notify a number of
// parties of this event.
// First we send the newly opened channel to the source server
// peer.
fmsg.peer.newChannels <- openChanDetails.Channel
peer, err := f.cfg.FindPeer(peerKey)
if err != nil {
fndgLog.Errorf("Error finding peer: %v", err)
return
}
peer.newChannels <- openChanDetails.Channel
// Afterwards we send the breach arbiter the new channel so it
// can watch for attempts to breach the channel's contract by
// the remote party.
f.breachAribter.newContracts <- openChanDetails.Channel
f.cfg.ArbiterChan <- openChanDetails.Channel
// With the block height and the transaction index known, we
// can construct the compact chainID which is used on the
@ -789,7 +847,11 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
// channel is open. We additionally provide the compact
// channelID so they can advertise the channel.
fundingOpen := lnwire.NewSingleFundingOpenProof(chanID, chainID)
fmsg.peer.queueMsg(fundingOpen, nil)
if err := f.cfg.SendToPeer(peerKey, fundingOpen); err != nil {
fndgLog.Errorf("unable to send fundingOpen message %v", err)
resCtx.err <- err
return
}
// Register the new link with the L3 routing manager so this
// new channel can be utilized during path
@ -797,8 +859,8 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
// TODO(roasbeef): should include sigs from funding
// locked
// * should be moved to after funding locked is recv'd
f.announceChannel(fmsg.peer.server, openChanDetails.Channel,
chainID, f.fakeProof, f.fakeProof)
f.announceChannel(peer.server, openChanDetails.Channel, chainID, f.fakeProof,
f.fakeProof)
// Finally give the caller a final update notifying them that
// the channel is now open.
@ -839,20 +901,21 @@ func (f *fundingManager) announceChannel(s *server,
// processFundingOpenProof sends a message to the fundingManager allowing it
// to process the final message received when the daemon is on the responding
// side of a single funder channel workflow.
func (f *fundingManager) processFundingOpenProof(msg *lnwire.SingleFundingOpenProof, peer *peer) {
f.fundingMsgs <- &fundingOpenMsg{msg, peer}
func (f *fundingManager) processFundingOpenProof(msg *lnwire.SingleFundingOpenProof,
peerAddress *lnwire.NetAddress) {
f.fundingMsgs <- &fundingOpenMsg{msg, peerAddress}
}
// handleFundingOpen processes the final message when the daemon is the
// responder to a single funder channel workflow.
func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
chanID := fmsg.msg.ChannelID
peerID := fmsg.peer.id
peerKey := fmsg.peerAddress.IdentityKey
resCtx, err := f.getReservationCtx(peerID, chanID)
resCtx, err := f.getReservationCtx(peerKey, chanID)
if err != nil {
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
peerID, chanID)
peerKey, chanID)
return
}
@ -867,40 +930,45 @@ func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
openChan, err := resCtx.reservation.FinalizeReservation()
if err != nil {
fndgLog.Errorf("unable to finalize reservation: %v", err)
fmsg.peer.Disconnect()
return
}
// The reservation has been completed, therefore we can stop tracking
// it within our active reservations map.
f.deleteReservationCtx(peerID, chanID)
f.deleteReservationCtx(peerKey, chanID)
fndgLog.Infof("FundingOpen: ChannelPoint(%v) with peerID(%v) is now open",
resCtx.reservation.FundingOutpoint(), peerID)
fndgLog.Infof("FundingOpen: ChannelPoint(%v) with peerKey(%v) is now open",
resCtx.reservation.FundingOutpoint(), peerKey)
// Notify the L3 routing manager of the newly active channel link.
// TODO(roasbeef): should have sigs, only after funding_locked is
// recv'd
// * also ensure fault tolerance, scan opened chan on start up check
// for graph existence
f.announceChannel(fmsg.peer.server, openChan, fmsg.msg.ChanChainID,
peer, err := f.cfg.FindPeer(peerKey)
if err != nil {
fndgLog.Errorf("Error finding peer: %v", err)
return
}
f.announceChannel(peer.server, openChan, fmsg.msg.ChanChainID,
f.fakeProof, f.fakeProof)
// Send the newly opened channel to the breach arbiter to it can watch
// for uncooperative channel breaches, potentially punishing the
// counterparty for attempting to cheat us.
f.breachAribter.newContracts <- openChan
f.cfg.ArbiterChan <- openChan
// Finally, notify the target peer of the newly opened channel.
fmsg.peer.newChannels <- openChan
// Finally, notify the target peer of the newly open channel.
peer.newChannels <- openChan
}
// initFundingWorkflow sends a message to the funding manager instructing it
// to initiate a single funder workflow with the source peer.
// TODO(roasbeef): re-visit blocking nature..
func (f *fundingManager) initFundingWorkflow(targetPeer *peer, req *openChanReq) {
func (f *fundingManager) initFundingWorkflow(peerAddress *lnwire.NetAddress,
req *openChanReq) {
f.fundingRequests <- &initFundingMsg{
peer: targetPeer,
peerAddress: peerAddress,
openChanReq: req,
}
}
@ -911,7 +979,7 @@ func (f *fundingManager) initFundingWorkflow(targetPeer *peer, req *openChanReq)
func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
var (
// TODO(roasbeef): add delay
nodeID = msg.peer.addr.IdentityKey
peerKey = msg.peerAddress.IdentityKey
localAmt = msg.localFundingAmt
remoteAmt = msg.remoteFundingAmt
capacity = localAmt + remoteAmt
@ -921,15 +989,13 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
fndgLog.Infof("Initiating fundingRequest(localAmt=%v, remoteAmt=%v, "+
"capacity=%v, numConfs=%v, addr=%v, dustLimit=%v)", localAmt,
msg.pushAmt, capacity, numConfs, msg.peer.addr.Address,
ourDustLimit)
msg.pushAmt, capacity, numConfs, msg.peerAddress.Address, ourDustLimit)
// Initialize a funding reservation with the local wallet. If the
// wallet doesn't have enough funds to commit to this channel, then
// the request will fail, and be aborted.
reservation, err := f.wallet.InitChannelReservation(capacity, localAmt,
nodeID, msg.peer.addr.Address, uint16(numConfs), 4,
ourDustLimit, msg.pushAmt)
reservation, err := f.cfg.Wallet.InitChannelReservation(capacity, localAmt,
peerKey, msg.peerAddress.Address, uint16(numConfs), 4, ourDustLimit, msg.pushAmt)
if err != nil {
msg.err <- err
return
@ -937,22 +1003,27 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
// Obtain a new pending channel ID which is used to track this
// reservation throughout its lifetime.
msg.peer.pendingChannelMtx.Lock()
chanID := msg.peer.nextPendingChannelID
msg.peer.nextPendingChannelID++
msg.peer.pendingChannelMtx.Unlock()
peer, err := f.cfg.FindPeer(peerKey)
if err != nil {
msg.err <- err
return
}
// TODO(bvu): add comment
chanID := peer.fetchNextPendingChanID()
// If a pending channel map for this peer isn't already created, then
// we create one, ultimately allowing us to track this pending
// reservation within the target peer.
peerIDKey := newSerializedKey(peerKey)
f.resMtx.Lock()
if _, ok := f.activeReservations[msg.peer.id]; !ok {
f.activeReservations[msg.peer.id] = make(pendingChannels)
if _, ok := f.activeReservations[peerIDKey]; !ok {
f.activeReservations[peerIDKey] = make(pendingChannels)
}
f.activeReservations[msg.peer.id][chanID] = &reservationWithCtx{
f.activeReservations[peerIDKey][chanID] = &reservationWithCtx{
reservation: reservation,
peer: msg.peer,
peerAddress: msg.peerAddress,
updates: msg.updates,
err: msg.err,
}
@ -985,15 +1056,19 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
ourDustLimit,
msg.pushAmt,
)
msg.peer.queueMsg(fundingReq, nil)
if err := f.cfg.SendToPeer(peerKey, fundingReq); err != nil {
fndgLog.Errorf("Unable to send funding request message: %v", err)
msg.err <- err
return
}
}
// processErrorGeneric sends a message to the fundingManager allowing it to
// process the occurred generic error.
func (f *fundingManager) processErrorGeneric(err *lnwire.ErrorGeneric,
peer *peer) {
peerAddress *lnwire.NetAddress) {
f.fundingMsgs <- &fundingErrorMsg{err, peer}
f.fundingMsgs <- &fundingErrorMsg{err, peerAddress}
}
// handleErrorGenericMsg process the error which was received from remote peer,
@ -1006,22 +1081,22 @@ func (f *fundingManager) handleErrorGenericMsg(fmsg *fundingErrorMsg) {
case lnwire.ErrMaxPendingChannels:
fallthrough
case lnwire.ErrSynchronizingChain:
peerID := fmsg.peer.id
peerKey := fmsg.peerAddress.IdentityKey
chanID := fmsg.err.PendingChannelID
resCtx, err := f.cancelReservationCtx(peerID, chanID)
ctx, err := f.cancelReservationCtx(peerKey, chanID)
if err != nil {
fndgLog.Warnf("unable to delete reservation: %v", err)
return
}
fndgLog.Errorf("Received funding error from %v: %v", fmsg.peer,
fndgLog.Errorf("Received funding error from %v: %v", peerKey.SerializeCompressed(),
newLogClosure(func() string {
return spew.Sdump(e)
}),
)
resCtx.err <- grpc.Errorf(e.Code.ToGrpcCode(), e.Problem)
ctx.err <- grpc.Errorf(e.Code.ToGrpcCode(), e.Problem)
return
default:
@ -1031,10 +1106,10 @@ func (f *fundingManager) handleErrorGenericMsg(fmsg *fundingErrorMsg) {
// cancelReservationCtx do all needed work in order to securely cancel the
// reservation.
func (f *fundingManager) cancelReservationCtx(peerID int32,
func (f *fundingManager) cancelReservationCtx(peerKey *btcec.PublicKey,
chanID uint64) (*reservationWithCtx, error) {
ctx, err := f.getReservationCtx(peerID, chanID)
ctx, err := f.getReservationCtx(peerKey, chanID)
if err != nil {
return nil, errors.Errorf("can't find reservation: %v",
err)
@ -1046,25 +1121,27 @@ func (f *fundingManager) cancelReservationCtx(peerID int32,
err)
}
f.deleteReservationCtx(peerID, chanID)
f.deleteReservationCtx(peerKey, chanID)
return ctx, nil
}
// deleteReservationCtx is needed in order to securely delete the reservation.
func (f *fundingManager) deleteReservationCtx(peerID int32, chanID uint64) {
func (f *fundingManager) deleteReservationCtx(peerKey *btcec.PublicKey, chanID uint64) {
// TODO(roasbeef): possibly cancel funding barrier in peer's
// channelManager?
peerIDKey := newSerializedKey(peerKey)
f.resMtx.Lock()
delete(f.activeReservations[peerID], chanID)
delete(f.activeReservations[peerIDKey], chanID)
f.resMtx.Unlock()
}
// getReservationCtx returns the reservation context by peer id and channel id.
func (f *fundingManager) getReservationCtx(peerID int32,
func (f *fundingManager) getReservationCtx(peerKey *btcec.PublicKey,
chanID uint64) (*reservationWithCtx, error) {
peerIDKey := newSerializedKey(peerKey)
f.resMtx.RLock()
resCtx, ok := f.activeReservations[peerID][chanID]
resCtx, ok := f.activeReservations[peerIDKey][chanID]
f.resMtx.RUnlock()
if !ok {
@ -1081,3 +1158,9 @@ func copyPubKey(pub *btcec.PublicKey) *btcec.PublicKey {
Y: pub.Y,
}
}
func newSerializedKey(pubKey *btcec.PublicKey) serializedPubKey {
serializedKey := serializedPubKey{}
copy(serializedKey[:33], pubKey.SerializeCompressed()[:])
return serializedKey
}

View File

@ -153,13 +153,13 @@ func (NewAddressRequest_AddressType) EnumDescriptor() ([]byte, []int) {
}
type Transaction struct {
TxHash string `protobuf:"bytes,1,opt,name=tx_hash" json:"tx_hash,omitempty"`
TxHash string `protobuf:"bytes,1,opt,name=tx_hash,json=txHash" json:"tx_hash,omitempty"`
Amount float64 `protobuf:"fixed64,2,opt,name=amount" json:"amount,omitempty"`
NumConfirmations int32 `protobuf:"varint,3,opt,name=num_confirmations" json:"num_confirmations,omitempty"`
BlockHash string `protobuf:"bytes,4,opt,name=block_hash" json:"block_hash,omitempty"`
BlockHeight int32 `protobuf:"varint,5,opt,name=block_height" json:"block_height,omitempty"`
TimeStamp int64 `protobuf:"varint,6,opt,name=time_stamp" json:"time_stamp,omitempty"`
TotalFees int64 `protobuf:"varint,7,opt,name=total_fees" json:"total_fees,omitempty"`
NumConfirmations int32 `protobuf:"varint,3,opt,name=num_confirmations,json=numConfirmations" json:"num_confirmations,omitempty"`
BlockHash string `protobuf:"bytes,4,opt,name=block_hash,json=blockHash" json:"block_hash,omitempty"`
BlockHeight int32 `protobuf:"varint,5,opt,name=block_height,json=blockHeight" json:"block_height,omitempty"`
TimeStamp int64 `protobuf:"varint,6,opt,name=time_stamp,json=timeStamp" json:"time_stamp,omitempty"`
TotalFees int64 `protobuf:"varint,7,opt,name=total_fees,json=totalFees" json:"total_fees,omitempty"`
}
func (m *Transaction) Reset() { *m = Transaction{} }
@ -242,11 +242,11 @@ func (m *TransactionDetails) GetTransactions() []*Transaction {
type SendRequest struct {
Dest []byte `protobuf:"bytes,1,opt,name=dest,proto3" json:"dest,omitempty"`
DestString string `protobuf:"bytes,2,opt,name=dest_string" json:"dest_string,omitempty"`
DestString string `protobuf:"bytes,2,opt,name=dest_string,json=destString" json:"dest_string,omitempty"`
Amt int64 `protobuf:"varint,3,opt,name=amt" json:"amt,omitempty"`
PaymentHash []byte `protobuf:"bytes,4,opt,name=payment_hash,proto3" json:"payment_hash,omitempty"`
PaymentHashString string `protobuf:"bytes,5,opt,name=payment_hash_string" json:"payment_hash_string,omitempty"`
PaymentRequest string `protobuf:"bytes,6,opt,name=payment_request" json:"payment_request,omitempty"`
PaymentHash []byte `protobuf:"bytes,4,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"`
PaymentHashString string `protobuf:"bytes,5,opt,name=payment_hash_string,json=paymentHashString" json:"payment_hash_string,omitempty"`
PaymentRequest string `protobuf:"bytes,6,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
}
func (m *SendRequest) Reset() { *m = SendRequest{} }
@ -297,8 +297,8 @@ func (m *SendRequest) GetPaymentRequest() string {
}
type SendResponse struct {
PaymentPreimage []byte `protobuf:"bytes,1,opt,name=payment_preimage,proto3" json:"payment_preimage,omitempty"`
PaymentRoute *Route `protobuf:"bytes,2,opt,name=payment_route" json:"payment_route,omitempty"`
PaymentPreimage []byte `protobuf:"bytes,1,opt,name=payment_preimage,json=paymentPreimage,proto3" json:"payment_preimage,omitempty"`
PaymentRoute *Route `protobuf:"bytes,2,opt,name=payment_route,json=paymentRoute" json:"payment_route,omitempty"`
}
func (m *SendResponse) Reset() { *m = SendResponse{} }
@ -321,9 +321,9 @@ func (m *SendResponse) GetPaymentRoute() *Route {
}
type ChannelPoint struct {
FundingTxid []byte `protobuf:"bytes,1,opt,name=funding_txid,proto3" json:"funding_txid,omitempty"`
FundingTxidStr string `protobuf:"bytes,2,opt,name=funding_txid_str" json:"funding_txid_str,omitempty"`
OutputIndex uint32 `protobuf:"varint,3,opt,name=output_index" json:"output_index,omitempty"`
FundingTxid []byte `protobuf:"bytes,1,opt,name=funding_txid,json=fundingTxid,proto3" json:"funding_txid,omitempty"`
FundingTxidStr string `protobuf:"bytes,2,opt,name=funding_txid_str,json=fundingTxidStr" json:"funding_txid_str,omitempty"`
OutputIndex uint32 `protobuf:"varint,3,opt,name=output_index,json=outputIndex" json:"output_index,omitempty"`
}
func (m *ChannelPoint) Reset() { *m = ChannelPoint{} }
@ -377,7 +377,7 @@ func (m *LightningAddress) GetHost() string {
}
type SendManyRequest struct {
AddrToAmount map[string]int64 `protobuf:"bytes,1,rep,name=AddrToAmount" json:"AddrToAmount,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
AddrToAmount map[string]int64 `protobuf:"bytes,1,rep,name=AddrToAmount,json=addrToAmount" json:"AddrToAmount,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
}
func (m *SendManyRequest) Reset() { *m = SendManyRequest{} }
@ -513,7 +513,7 @@ func (m *ConnectPeerRequest) GetPerm() bool {
}
type ConnectPeerResponse struct {
PeerId int32 `protobuf:"varint,1,opt,name=peer_id" json:"peer_id,omitempty"`
PeerId int32 `protobuf:"varint,1,opt,name=peer_id,json=peerId" json:"peer_id,omitempty"`
}
func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} }
@ -531,9 +531,9 @@ func (m *ConnectPeerResponse) GetPeerId() int32 {
type HTLC struct {
Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"`
Amount int64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
HashLock []byte `protobuf:"bytes,3,opt,name=hash_lock,proto3" json:"hash_lock,omitempty"`
ExpirationHeight uint32 `protobuf:"varint,4,opt,name=expiration_height" json:"expiration_height,omitempty"`
RevocationDelay uint32 `protobuf:"varint,5,opt,name=revocation_delay" json:"revocation_delay,omitempty"`
HashLock []byte `protobuf:"bytes,3,opt,name=hash_lock,json=hashLock,proto3" json:"hash_lock,omitempty"`
ExpirationHeight uint32 `protobuf:"varint,4,opt,name=expiration_height,json=expirationHeight" json:"expiration_height,omitempty"`
RevocationDelay uint32 `protobuf:"varint,5,opt,name=revocation_delay,json=revocationDelay" json:"revocation_delay,omitempty"`
}
func (m *HTLC) Reset() { *m = HTLC{} }
@ -577,17 +577,17 @@ func (m *HTLC) GetRevocationDelay() uint32 {
}
type ActiveChannel struct {
RemotePubkey string `protobuf:"bytes,1,opt,name=remote_pubkey" json:"remote_pubkey,omitempty"`
ChannelPoint string `protobuf:"bytes,2,opt,name=channel_point" json:"channel_point,omitempty"`
ChanId uint64 `protobuf:"varint,3,opt,name=chan_id" json:"chan_id,omitempty"`
RemotePubkey string `protobuf:"bytes,1,opt,name=remote_pubkey,json=remotePubkey" json:"remote_pubkey,omitempty"`
ChannelPoint string `protobuf:"bytes,2,opt,name=channel_point,json=channelPoint" json:"channel_point,omitempty"`
ChanId uint64 `protobuf:"varint,3,opt,name=chan_id,json=chanId" json:"chan_id,omitempty"`
Capacity int64 `protobuf:"varint,4,opt,name=capacity" json:"capacity,omitempty"`
LocalBalance int64 `protobuf:"varint,5,opt,name=local_balance" json:"local_balance,omitempty"`
RemoteBalance int64 `protobuf:"varint,6,opt,name=remote_balance" json:"remote_balance,omitempty"`
UnsettledBalance int64 `protobuf:"varint,7,opt,name=unsettled_balance" json:"unsettled_balance,omitempty"`
TotalSatoshisSent int64 `protobuf:"varint,8,opt,name=total_satoshis_sent" json:"total_satoshis_sent,omitempty"`
TotalSatoshisReceived int64 `protobuf:"varint,9,opt,name=total_satoshis_received" json:"total_satoshis_received,omitempty"`
NumUpdates uint64 `protobuf:"varint,10,opt,name=num_updates" json:"num_updates,omitempty"`
PendingHtlcs []*HTLC `protobuf:"bytes,11,rep,name=pending_htlcs" json:"pending_htlcs,omitempty"`
LocalBalance int64 `protobuf:"varint,5,opt,name=local_balance,json=localBalance" json:"local_balance,omitempty"`
RemoteBalance int64 `protobuf:"varint,6,opt,name=remote_balance,json=remoteBalance" json:"remote_balance,omitempty"`
UnsettledBalance int64 `protobuf:"varint,7,opt,name=unsettled_balance,json=unsettledBalance" json:"unsettled_balance,omitempty"`
TotalSatoshisSent int64 `protobuf:"varint,8,opt,name=total_satoshis_sent,json=totalSatoshisSent" json:"total_satoshis_sent,omitempty"`
TotalSatoshisReceived int64 `protobuf:"varint,9,opt,name=total_satoshis_received,json=totalSatoshisReceived" json:"total_satoshis_received,omitempty"`
NumUpdates uint64 `protobuf:"varint,10,opt,name=num_updates,json=numUpdates" json:"num_updates,omitempty"`
PendingHtlcs []*HTLC `protobuf:"bytes,11,rep,name=pending_htlcs,json=pendingHtlcs" json:"pending_htlcs,omitempty"`
}
func (m *ActiveChannel) Reset() { *m = ActiveChannel{} }
@ -697,15 +697,15 @@ func (m *ListChannelsResponse) GetChannels() []*ActiveChannel {
}
type Peer struct {
PubKey string `protobuf:"bytes,1,opt,name=pub_key" json:"pub_key,omitempty"`
PeerId int32 `protobuf:"varint,2,opt,name=peer_id" json:"peer_id,omitempty"`
PubKey string `protobuf:"bytes,1,opt,name=pub_key,json=pubKey" json:"pub_key,omitempty"`
PeerId int32 `protobuf:"varint,2,opt,name=peer_id,json=peerId" json:"peer_id,omitempty"`
Address string `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"`
BytesSent uint64 `protobuf:"varint,4,opt,name=bytes_sent" json:"bytes_sent,omitempty"`
BytesRecv uint64 `protobuf:"varint,5,opt,name=bytes_recv" json:"bytes_recv,omitempty"`
SatSent int64 `protobuf:"varint,6,opt,name=sat_sent" json:"sat_sent,omitempty"`
SatRecv int64 `protobuf:"varint,7,opt,name=sat_recv" json:"sat_recv,omitempty"`
BytesSent uint64 `protobuf:"varint,4,opt,name=bytes_sent,json=bytesSent" json:"bytes_sent,omitempty"`
BytesRecv uint64 `protobuf:"varint,5,opt,name=bytes_recv,json=bytesRecv" json:"bytes_recv,omitempty"`
SatSent int64 `protobuf:"varint,6,opt,name=sat_sent,json=satSent" json:"sat_sent,omitempty"`
SatRecv int64 `protobuf:"varint,7,opt,name=sat_recv,json=satRecv" json:"sat_recv,omitempty"`
Inbound bool `protobuf:"varint,8,opt,name=inbound" json:"inbound,omitempty"`
PingTime int64 `protobuf:"varint,9,opt,name=ping_time" json:"ping_time,omitempty"`
PingTime int64 `protobuf:"varint,9,opt,name=ping_time,json=pingTime" json:"ping_time,omitempty"`
}
func (m *Peer) Reset() { *m = Peer{} }
@ -809,14 +809,14 @@ func (*GetInfoRequest) ProtoMessage() {}
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
type GetInfoResponse struct {
IdentityPubkey string `protobuf:"bytes,1,opt,name=identity_pubkey" json:"identity_pubkey,omitempty"`
IdentityPubkey string `protobuf:"bytes,1,opt,name=identity_pubkey,json=identityPubkey" json:"identity_pubkey,omitempty"`
Alias string `protobuf:"bytes,2,opt,name=alias" json:"alias,omitempty"`
NumPendingChannels uint32 `protobuf:"varint,3,opt,name=num_pending_channels" json:"num_pending_channels,omitempty"`
NumActiveChannels uint32 `protobuf:"varint,4,opt,name=num_active_channels" json:"num_active_channels,omitempty"`
NumPeers uint32 `protobuf:"varint,5,opt,name=num_peers" json:"num_peers,omitempty"`
BlockHeight uint32 `protobuf:"varint,6,opt,name=block_height" json:"block_height,omitempty"`
BlockHash string `protobuf:"bytes,8,opt,name=block_hash" json:"block_hash,omitempty"`
SyncedToChain bool `protobuf:"varint,9,opt,name=synced_to_chain" json:"synced_to_chain,omitempty"`
NumPendingChannels uint32 `protobuf:"varint,3,opt,name=num_pending_channels,json=numPendingChannels" json:"num_pending_channels,omitempty"`
NumActiveChannels uint32 `protobuf:"varint,4,opt,name=num_active_channels,json=numActiveChannels" json:"num_active_channels,omitempty"`
NumPeers uint32 `protobuf:"varint,5,opt,name=num_peers,json=numPeers" json:"num_peers,omitempty"`
BlockHeight uint32 `protobuf:"varint,6,opt,name=block_height,json=blockHeight" json:"block_height,omitempty"`
BlockHash string `protobuf:"bytes,8,opt,name=block_hash,json=blockHash" json:"block_hash,omitempty"`
SyncedToChain bool `protobuf:"varint,9,opt,name=synced_to_chain,json=syncedToChain" json:"synced_to_chain,omitempty"`
Testnet bool `protobuf:"varint,10,opt,name=testnet" json:"testnet,omitempty"`
}
@ -889,9 +889,9 @@ func (m *GetInfoResponse) GetTestnet() bool {
}
type ConfirmationUpdate struct {
BlockSha []byte `protobuf:"bytes,1,opt,name=block_sha,proto3" json:"block_sha,omitempty"`
BlockHeight int32 `protobuf:"varint,2,opt,name=block_height" json:"block_height,omitempty"`
NumConfsLeft uint32 `protobuf:"varint,3,opt,name=num_confs_left" json:"num_confs_left,omitempty"`
BlockSha []byte `protobuf:"bytes,1,opt,name=block_sha,json=blockSha,proto3" json:"block_sha,omitempty"`
BlockHeight int32 `protobuf:"varint,2,opt,name=block_height,json=blockHeight" json:"block_height,omitempty"`
NumConfsLeft uint32 `protobuf:"varint,3,opt,name=num_confs_left,json=numConfsLeft" json:"num_confs_left,omitempty"`
}
func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
@ -921,7 +921,7 @@ func (m *ConfirmationUpdate) GetNumConfsLeft() uint32 {
}
type ChannelOpenUpdate struct {
ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point" json:"channel_point,omitempty"`
ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point,json=channelPoint" json:"channel_point,omitempty"`
}
func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} }
@ -937,7 +937,7 @@ func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint {
}
type ChannelCloseUpdate struct {
ClosingTxid []byte `protobuf:"bytes,1,opt,name=closing_txid,proto3" json:"closing_txid,omitempty"`
ClosingTxid []byte `protobuf:"bytes,1,opt,name=closing_txid,json=closingTxid,proto3" json:"closing_txid,omitempty"`
Success bool `protobuf:"varint,2,opt,name=success" json:"success,omitempty"`
}
@ -961,8 +961,8 @@ func (m *ChannelCloseUpdate) GetSuccess() bool {
}
type CloseChannelRequest struct {
ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point" json:"channel_point,omitempty"`
TimeLimit int64 `protobuf:"varint,2,opt,name=time_limit" json:"time_limit,omitempty"`
ChannelPoint *ChannelPoint `protobuf:"bytes,1,opt,name=channel_point,json=channelPoint" json:"channel_point,omitempty"`
TimeLimit int64 `protobuf:"varint,2,opt,name=time_limit,json=timeLimit" json:"time_limit,omitempty"`
Force bool `protobuf:"varint,3,opt,name=force" json:"force,omitempty"`
}
@ -1010,13 +1010,13 @@ type isCloseStatusUpdate_Update interface {
}
type CloseStatusUpdate_ClosePending struct {
ClosePending *PendingUpdate `protobuf:"bytes,1,opt,name=close_pending,oneof"`
ClosePending *PendingUpdate `protobuf:"bytes,1,opt,name=close_pending,json=closePending,oneof"`
}
type CloseStatusUpdate_Confirmation struct {
Confirmation *ConfirmationUpdate `protobuf:"bytes,2,opt,name=confirmation,oneof"`
}
type CloseStatusUpdate_ChanClose struct {
ChanClose *ChannelCloseUpdate `protobuf:"bytes,3,opt,name=chan_close,oneof"`
ChanClose *ChannelCloseUpdate `protobuf:"bytes,3,opt,name=chan_close,json=chanClose,oneof"`
}
func (*CloseStatusUpdate_ClosePending) isCloseStatusUpdate_Update() {}
@ -1161,12 +1161,12 @@ func (m *PendingUpdate) GetTxid() []byte {
}
type OpenChannelRequest struct {
TargetPeerId int32 `protobuf:"varint,1,opt,name=target_peer_id" json:"target_peer_id,omitempty"`
NodePubkey []byte `protobuf:"bytes,2,opt,name=node_pubkey,proto3" json:"node_pubkey,omitempty"`
NodePubkeyString string `protobuf:"bytes,3,opt,name=node_pubkey_string" json:"node_pubkey_string,omitempty"`
LocalFundingAmount int64 `protobuf:"varint,4,opt,name=local_funding_amount" json:"local_funding_amount,omitempty"`
PushSat int64 `protobuf:"varint,5,opt,name=push_sat" json:"push_sat,omitempty"`
NumConfs uint32 `protobuf:"varint,6,opt,name=num_confs" json:"num_confs,omitempty"`
TargetPeerId int32 `protobuf:"varint,1,opt,name=target_peer_id,json=targetPeerId" json:"target_peer_id,omitempty"`
NodePubkey []byte `protobuf:"bytes,2,opt,name=node_pubkey,json=nodePubkey,proto3" json:"node_pubkey,omitempty"`
NodePubkeyString string `protobuf:"bytes,3,opt,name=node_pubkey_string,json=nodePubkeyString" json:"node_pubkey_string,omitempty"`
LocalFundingAmount int64 `protobuf:"varint,4,opt,name=local_funding_amount,json=localFundingAmount" json:"local_funding_amount,omitempty"`
PushSat int64 `protobuf:"varint,5,opt,name=push_sat,json=pushSat" json:"push_sat,omitempty"`
NumConfs uint32 `protobuf:"varint,6,opt,name=num_confs,json=numConfs" json:"num_confs,omitempty"`
}
func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
@ -1234,13 +1234,13 @@ type isOpenStatusUpdate_Update interface {
}
type OpenStatusUpdate_ChanPending struct {
ChanPending *PendingUpdate `protobuf:"bytes,1,opt,name=chan_pending,oneof"`
ChanPending *PendingUpdate `protobuf:"bytes,1,opt,name=chan_pending,json=chanPending,oneof"`
}
type OpenStatusUpdate_Confirmation struct {
Confirmation *ConfirmationUpdate `protobuf:"bytes,2,opt,name=confirmation,oneof"`
}
type OpenStatusUpdate_ChanOpen struct {
ChanOpen *ChannelOpenUpdate `protobuf:"bytes,3,opt,name=chan_open,oneof"`
ChanOpen *ChannelOpenUpdate `protobuf:"bytes,3,opt,name=chan_open,json=chanOpen,oneof"`
}
func (*OpenStatusUpdate_ChanPending) isOpenStatusUpdate_Update() {}
@ -1385,7 +1385,7 @@ func (m *PendingChannelRequest) GetStatus() ChannelStatus {
}
type PendingChannelResponse struct {
PendingChannels []*PendingChannelResponse_PendingChannel `protobuf:"bytes,1,rep,name=pending_channels" json:"pending_channels,omitempty"`
PendingChannels []*PendingChannelResponse_PendingChannel `protobuf:"bytes,1,rep,name=pending_channels,json=pendingChannels" json:"pending_channels,omitempty"`
}
func (m *PendingChannelResponse) Reset() { *m = PendingChannelResponse{} }
@ -1401,14 +1401,13 @@ func (m *PendingChannelResponse) GetPendingChannels() []*PendingChannelResponse_
}
type PendingChannelResponse_PendingChannel struct {
PeerId int32 `protobuf:"varint,1,opt,name=peer_id" json:"peer_id,omitempty"`
IdentityKey string `protobuf:"bytes,2,opt,name=identity_key" json:"identity_key,omitempty"`
ChannelPoint string `protobuf:"bytes,3,opt,name=channel_point" json:"channel_point,omitempty"`
Capacity int64 `protobuf:"varint,4,opt,name=capacity" json:"capacity,omitempty"`
LocalBalance int64 `protobuf:"varint,5,opt,name=local_balance" json:"local_balance,omitempty"`
RemoteBalance int64 `protobuf:"varint,6,opt,name=remote_balance" json:"remote_balance,omitempty"`
ClosingTxid string `protobuf:"bytes,7,opt,name=closing_txid" json:"closing_txid,omitempty"`
Status ChannelStatus `protobuf:"varint,8,opt,name=status,enum=lnrpc.ChannelStatus" json:"status,omitempty"`
IdentityKey string `protobuf:"bytes,1,opt,name=identity_key,json=identityKey" json:"identity_key,omitempty"`
ChannelPoint string `protobuf:"bytes,2,opt,name=channel_point,json=channelPoint" json:"channel_point,omitempty"`
Capacity int64 `protobuf:"varint,3,opt,name=capacity" json:"capacity,omitempty"`
LocalBalance int64 `protobuf:"varint,4,opt,name=local_balance,json=localBalance" json:"local_balance,omitempty"`
RemoteBalance int64 `protobuf:"varint,5,opt,name=remote_balance,json=remoteBalance" json:"remote_balance,omitempty"`
ClosingTxid string `protobuf:"bytes,6,opt,name=closing_txid,json=closingTxid" json:"closing_txid,omitempty"`
Status ChannelStatus `protobuf:"varint,7,opt,name=status,enum=lnrpc.ChannelStatus" json:"status,omitempty"`
}
func (m *PendingChannelResponse_PendingChannel) Reset() { *m = PendingChannelResponse_PendingChannel{} }
@ -1418,13 +1417,6 @@ func (*PendingChannelResponse_PendingChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{34, 0}
}
func (m *PendingChannelResponse_PendingChannel) GetPeerId() int32 {
if m != nil {
return m.PeerId
}
return 0
}
func (m *PendingChannelResponse_PendingChannel) GetIdentityKey() string {
if m != nil {
return m.IdentityKey
@ -1475,7 +1467,7 @@ func (m *PendingChannelResponse_PendingChannel) GetStatus() ChannelStatus {
}
type WalletBalanceRequest struct {
WitnessOnly bool `protobuf:"varint,1,opt,name=witness_only" json:"witness_only,omitempty"`
WitnessOnly bool `protobuf:"varint,1,opt,name=witness_only,json=witnessOnly" json:"witness_only,omitempty"`
}
func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} }
@ -1531,7 +1523,7 @@ func (m *ChannelBalanceResponse) GetBalance() int64 {
}
type RouteRequest struct {
PubKey string `protobuf:"bytes,1,opt,name=pub_key" json:"pub_key,omitempty"`
PubKey string `protobuf:"bytes,1,opt,name=pub_key,json=pubKey" json:"pub_key,omitempty"`
Amt int64 `protobuf:"varint,2,opt,name=amt" json:"amt,omitempty"`
}
@ -1555,9 +1547,9 @@ func (m *RouteRequest) GetAmt() int64 {
}
type Hop struct {
ChanId uint64 `protobuf:"varint,1,opt,name=chan_id" json:"chan_id,omitempty"`
ChanCapacity int64 `protobuf:"varint,2,opt,name=chan_capacity" json:"chan_capacity,omitempty"`
AmtToForward int64 `protobuf:"varint,3,opt,name=amt_to_forward" json:"amt_to_forward,omitempty"`
ChanId uint64 `protobuf:"varint,1,opt,name=chan_id,json=chanId" json:"chan_id,omitempty"`
ChanCapacity int64 `protobuf:"varint,2,opt,name=chan_capacity,json=chanCapacity" json:"chan_capacity,omitempty"`
AmtToForward int64 `protobuf:"varint,3,opt,name=amt_to_forward,json=amtToForward" json:"amt_to_forward,omitempty"`
Fee int64 `protobuf:"varint,4,opt,name=fee" json:"fee,omitempty"`
}
@ -1595,9 +1587,9 @@ func (m *Hop) GetFee() int64 {
}
type Route struct {
TotalTimeLock uint32 `protobuf:"varint,1,opt,name=total_time_lock" json:"total_time_lock,omitempty"`
TotalFees int64 `protobuf:"varint,2,opt,name=total_fees" json:"total_fees,omitempty"`
TotalAmt int64 `protobuf:"varint,3,opt,name=total_amt" json:"total_amt,omitempty"`
TotalTimeLock uint32 `protobuf:"varint,1,opt,name=total_time_lock,json=totalTimeLock" json:"total_time_lock,omitempty"`
TotalFees int64 `protobuf:"varint,2,opt,name=total_fees,json=totalFees" json:"total_fees,omitempty"`
TotalAmt int64 `protobuf:"varint,3,opt,name=total_amt,json=totalAmt" json:"total_amt,omitempty"`
Hops []*Hop `protobuf:"bytes,4,rep,name=hops" json:"hops,omitempty"`
}
@ -1635,7 +1627,7 @@ func (m *Route) GetHops() []*Hop {
}
type NodeInfoRequest struct {
PubKey string `protobuf:"bytes,1,opt,name=pub_key" json:"pub_key,omitempty"`
PubKey string `protobuf:"bytes,1,opt,name=pub_key,json=pubKey" json:"pub_key,omitempty"`
}
func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
@ -1652,8 +1644,8 @@ func (m *NodeInfoRequest) GetPubKey() string {
type NodeInfo struct {
Node *LightningNode `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"`
NumChannels uint32 `protobuf:"varint,2,opt,name=num_channels" json:"num_channels,omitempty"`
TotalCapacity int64 `protobuf:"varint,3,opt,name=total_capacity" json:"total_capacity,omitempty"`
NumChannels uint32 `protobuf:"varint,2,opt,name=num_channels,json=numChannels" json:"num_channels,omitempty"`
TotalCapacity int64 `protobuf:"varint,3,opt,name=total_capacity,json=totalCapacity" json:"total_capacity,omitempty"`
}
func (m *NodeInfo) Reset() { *m = NodeInfo{} }
@ -1683,8 +1675,8 @@ func (m *NodeInfo) GetTotalCapacity() int64 {
}
type LightningNode struct {
LastUpdate uint32 `protobuf:"varint,1,opt,name=last_update" json:"last_update,omitempty"`
PubKey string `protobuf:"bytes,2,opt,name=pub_key" json:"pub_key,omitempty"`
LastUpdate uint32 `protobuf:"varint,1,opt,name=last_update,json=lastUpdate" json:"last_update,omitempty"`
PubKey string `protobuf:"bytes,2,opt,name=pub_key,json=pubKey" json:"pub_key,omitempty"`
Address string `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"`
Alias string `protobuf:"bytes,4,opt,name=alias" json:"alias,omitempty"`
}
@ -1723,10 +1715,10 @@ func (m *LightningNode) GetAlias() string {
}
type RoutingPolicy struct {
TimeLockDelta uint32 `protobuf:"varint,1,opt,name=time_lock_delta" json:"time_lock_delta,omitempty"`
MinHtlc int64 `protobuf:"varint,2,opt,name=min_htlc" json:"min_htlc,omitempty"`
FeeBaseMsat int64 `protobuf:"varint,3,opt,name=fee_base_msat" json:"fee_base_msat,omitempty"`
FeeRateMilliMsat int64 `protobuf:"varint,4,opt,name=fee_rate_milli_msat" json:"fee_rate_milli_msat,omitempty"`
TimeLockDelta uint32 `protobuf:"varint,1,opt,name=time_lock_delta,json=timeLockDelta" json:"time_lock_delta,omitempty"`
MinHtlc int64 `protobuf:"varint,2,opt,name=min_htlc,json=minHtlc" json:"min_htlc,omitempty"`
FeeBaseMsat int64 `protobuf:"varint,3,opt,name=fee_base_msat,json=feeBaseMsat" json:"fee_base_msat,omitempty"`
FeeRateMilliMsat int64 `protobuf:"varint,4,opt,name=fee_rate_milli_msat,json=feeRateMilliMsat" json:"fee_rate_milli_msat,omitempty"`
}
func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
@ -1763,14 +1755,14 @@ func (m *RoutingPolicy) GetFeeRateMilliMsat() int64 {
}
type ChannelEdge struct {
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id" json:"channel_id,omitempty"`
ChanPoint string `protobuf:"bytes,2,opt,name=chan_point" json:"chan_point,omitempty"`
LastUpdate uint32 `protobuf:"varint,3,opt,name=last_update" json:"last_update,omitempty"`
Node1Pub string `protobuf:"bytes,4,opt,name=node1_pub" json:"node1_pub,omitempty"`
Node2Pub string `protobuf:"bytes,5,opt,name=node2_pub" json:"node2_pub,omitempty"`
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"`
ChanPoint string `protobuf:"bytes,2,opt,name=chan_point,json=chanPoint" json:"chan_point,omitempty"`
LastUpdate uint32 `protobuf:"varint,3,opt,name=last_update,json=lastUpdate" json:"last_update,omitempty"`
Node1Pub string `protobuf:"bytes,4,opt,name=node1_pub,json=node1Pub" json:"node1_pub,omitempty"`
Node2Pub string `protobuf:"bytes,5,opt,name=node2_pub,json=node2Pub" json:"node2_pub,omitempty"`
Capacity int64 `protobuf:"varint,6,opt,name=capacity" json:"capacity,omitempty"`
Node1Policy *RoutingPolicy `protobuf:"bytes,7,opt,name=node1_policy" json:"node1_policy,omitempty"`
Node2Policy *RoutingPolicy `protobuf:"bytes,8,opt,name=node2_policy" json:"node2_policy,omitempty"`
Node1Policy *RoutingPolicy `protobuf:"bytes,7,opt,name=node1_policy,json=node1Policy" json:"node1_policy,omitempty"`
Node2Policy *RoutingPolicy `protobuf:"bytes,8,opt,name=node2_policy,json=node2Policy" json:"node2_policy,omitempty"`
}
func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
@ -1867,7 +1859,7 @@ func (m *ChannelGraph) GetEdges() []*ChannelEdge {
}
type ChanInfoRequest struct {
ChanId uint64 `protobuf:"varint,1,opt,name=chan_id" json:"chan_id,omitempty"`
ChanId uint64 `protobuf:"varint,1,opt,name=chan_id,json=chanId" json:"chan_id,omitempty"`
}
func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
@ -1891,15 +1883,15 @@ func (*NetworkInfoRequest) ProtoMessage() {}
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
type NetworkInfo struct {
GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter" json:"graph_diameter,omitempty"`
AvgOutDegree float64 `protobuf:"fixed64,2,opt,name=avg_out_degree" json:"avg_out_degree,omitempty"`
MaxOutDegree uint32 `protobuf:"varint,3,opt,name=max_out_degree" json:"max_out_degree,omitempty"`
NumNodes uint32 `protobuf:"varint,4,opt,name=num_nodes" json:"num_nodes,omitempty"`
NumChannels uint32 `protobuf:"varint,5,opt,name=num_channels" json:"num_channels,omitempty"`
TotalNetworkCapacity int64 `protobuf:"varint,6,opt,name=total_network_capacity" json:"total_network_capacity,omitempty"`
AvgChannelSize float64 `protobuf:"fixed64,7,opt,name=avg_channel_size" json:"avg_channel_size,omitempty"`
MinChannelSize int64 `protobuf:"varint,8,opt,name=min_channel_size" json:"min_channel_size,omitempty"`
MaxChannelSize int64 `protobuf:"varint,9,opt,name=max_channel_size" json:"max_channel_size,omitempty"`
GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter,json=graphDiameter" json:"graph_diameter,omitempty"`
AvgOutDegree float64 `protobuf:"fixed64,2,opt,name=avg_out_degree,json=avgOutDegree" json:"avg_out_degree,omitempty"`
MaxOutDegree uint32 `protobuf:"varint,3,opt,name=max_out_degree,json=maxOutDegree" json:"max_out_degree,omitempty"`
NumNodes uint32 `protobuf:"varint,4,opt,name=num_nodes,json=numNodes" json:"num_nodes,omitempty"`
NumChannels uint32 `protobuf:"varint,5,opt,name=num_channels,json=numChannels" json:"num_channels,omitempty"`
TotalNetworkCapacity int64 `protobuf:"varint,6,opt,name=total_network_capacity,json=totalNetworkCapacity" json:"total_network_capacity,omitempty"`
AvgChannelSize float64 `protobuf:"fixed64,7,opt,name=avg_channel_size,json=avgChannelSize" json:"avg_channel_size,omitempty"`
MinChannelSize int64 `protobuf:"varint,8,opt,name=min_channel_size,json=minChannelSize" json:"min_channel_size,omitempty"`
MaxChannelSize int64 `protobuf:"varint,9,opt,name=max_channel_size,json=maxChannelSize" json:"max_channel_size,omitempty"`
}
func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
@ -1971,7 +1963,7 @@ func (m *NetworkInfo) GetMaxChannelSize() int64 {
}
type SetAliasRequest struct {
NewAlias string `protobuf:"bytes,1,opt,name=new_alias" json:"new_alias,omitempty"`
NewAlias string `protobuf:"bytes,1,opt,name=new_alias,json=newAlias" json:"new_alias,omitempty"`
}
func (m *SetAliasRequest) Reset() { *m = SetAliasRequest{} }
@ -1997,13 +1989,13 @@ func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0,
type Invoice struct {
Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"`
Receipt []byte `protobuf:"bytes,2,opt,name=receipt,proto3" json:"receipt,omitempty"`
RPreimage []byte `protobuf:"bytes,3,opt,name=r_preimage,proto3" json:"r_preimage,omitempty"`
RHash []byte `protobuf:"bytes,4,opt,name=r_hash,proto3" json:"r_hash,omitempty"`
RPreimage []byte `protobuf:"bytes,3,opt,name=r_preimage,json=rPreimage,proto3" json:"r_preimage,omitempty"`
RHash []byte `protobuf:"bytes,4,opt,name=r_hash,json=rHash,proto3" json:"r_hash,omitempty"`
Value int64 `protobuf:"varint,5,opt,name=value" json:"value,omitempty"`
Settled bool `protobuf:"varint,6,opt,name=settled" json:"settled,omitempty"`
CreationDate int64 `protobuf:"varint,7,opt,name=creation_date" json:"creation_date,omitempty"`
SettleDate int64 `protobuf:"varint,8,opt,name=settle_date" json:"settle_date,omitempty"`
PaymentRequest string `protobuf:"bytes,9,opt,name=payment_request" json:"payment_request,omitempty"`
CreationDate int64 `protobuf:"varint,7,opt,name=creation_date,json=creationDate" json:"creation_date,omitempty"`
SettleDate int64 `protobuf:"varint,8,opt,name=settle_date,json=settleDate" json:"settle_date,omitempty"`
PaymentRequest string `protobuf:"bytes,9,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
}
func (m *Invoice) Reset() { *m = Invoice{} }
@ -2075,8 +2067,8 @@ func (m *Invoice) GetPaymentRequest() string {
}
type AddInvoiceResponse struct {
RHash []byte `protobuf:"bytes,1,opt,name=r_hash,proto3" json:"r_hash,omitempty"`
PaymentRequest string `protobuf:"bytes,2,opt,name=payment_request" json:"payment_request,omitempty"`
RHash []byte `protobuf:"bytes,1,opt,name=r_hash,json=rHash,proto3" json:"r_hash,omitempty"`
PaymentRequest string `protobuf:"bytes,2,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
}
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
@ -2099,8 +2091,8 @@ func (m *AddInvoiceResponse) GetPaymentRequest() string {
}
type PaymentHash struct {
RHashStr string `protobuf:"bytes,1,opt,name=r_hash_str" json:"r_hash_str,omitempty"`
RHash []byte `protobuf:"bytes,2,opt,name=r_hash,proto3" json:"r_hash,omitempty"`
RHashStr string `protobuf:"bytes,1,opt,name=r_hash_str,json=rHashStr" json:"r_hash_str,omitempty"`
RHash []byte `protobuf:"bytes,2,opt,name=r_hash,json=rHash,proto3" json:"r_hash,omitempty"`
}
func (m *PaymentHash) Reset() { *m = PaymentHash{} }
@ -2123,7 +2115,7 @@ func (m *PaymentHash) GetRHash() []byte {
}
type ListInvoiceRequest struct {
PendingOnly bool `protobuf:"varint,1,opt,name=pending_only" json:"pending_only,omitempty"`
PendingOnly bool `protobuf:"varint,1,opt,name=pending_only,json=pendingOnly" json:"pending_only,omitempty"`
}
func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
@ -2163,9 +2155,9 @@ func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
type Payment struct {
PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash" json:"payment_hash,omitempty"`
PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash,json=paymentHash" json:"payment_hash,omitempty"`
Value int64 `protobuf:"varint,2,opt,name=value" json:"value,omitempty"`
CreationDate int64 `protobuf:"varint,3,opt,name=creation_date" json:"creation_date,omitempty"`
CreationDate int64 `protobuf:"varint,3,opt,name=creation_date,json=creationDate" json:"creation_date,omitempty"`
Path []string `protobuf:"bytes,4,rep,name=path" json:"path,omitempty"`
Fee int64 `protobuf:"varint,5,opt,name=fee" json:"fee,omitempty"`
}
@ -2252,7 +2244,7 @@ func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDesc
type DebugLevelRequest struct {
Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"`
LevelSpec string `protobuf:"bytes,2,opt,name=level_spec" json:"level_spec,omitempty"`
LevelSpec string `protobuf:"bytes,2,opt,name=level_spec,json=levelSpec" json:"level_spec,omitempty"`
}
func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
@ -2275,7 +2267,7 @@ func (m *DebugLevelRequest) GetLevelSpec() string {
}
type DebugLevelResponse struct {
SubSystems string `protobuf:"bytes,1,opt,name=sub_systems" json:"sub_systems,omitempty"`
SubSystems string `protobuf:"bytes,1,opt,name=sub_systems,json=subSystems" json:"sub_systems,omitempty"`
}
func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
@ -2291,7 +2283,7 @@ func (m *DebugLevelResponse) GetSubSystems() string {
}
type PayReqString struct {
PayReq string `protobuf:"bytes,1,opt,name=pay_req" json:"pay_req,omitempty"`
PayReq string `protobuf:"bytes,1,opt,name=pay_req,json=payReq" json:"pay_req,omitempty"`
}
func (m *PayReqString) Reset() { *m = PayReqString{} }
@ -2308,8 +2300,8 @@ func (m *PayReqString) GetPayReq() string {
type PayReq struct {
Destination string `protobuf:"bytes,1,opt,name=destination" json:"destination,omitempty"`
PaymentHash string `protobuf:"bytes,2,opt,name=payment_hash" json:"payment_hash,omitempty"`
NumSatoshis int64 `protobuf:"varint,3,opt,name=num_satoshis" json:"num_satoshis,omitempty"`
PaymentHash string `protobuf:"bytes,2,opt,name=payment_hash,json=paymentHash" json:"payment_hash,omitempty"`
NumSatoshis int64 `protobuf:"varint,3,opt,name=num_satoshis,json=numSatoshis" json:"num_satoshis,omitempty"`
}
func (m *PayReq) Reset() { *m = PayReq{} }
@ -3654,203 +3646,246 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 3166 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5a, 0x4f, 0x6f, 0x1b, 0xc7,
0x15, 0xf7, 0x8a, 0x94, 0x44, 0x3e, 0x2e, 0x45, 0x6a, 0x24, 0x51, 0x34, 0xed, 0xc4, 0xf2, 0xc6,
0x49, 0x15, 0xc3, 0xb1, 0x6c, 0x05, 0x45, 0x83, 0x04, 0x49, 0xa1, 0xd8, 0xae, 0x65, 0x54, 0x91,
0x15, 0x4b, 0x8e, 0xdb, 0xa4, 0xc5, 0x66, 0xb5, 0x3b, 0xa2, 0x36, 0x5e, 0xee, 0x6e, 0x76, 0x87,
0x92, 0x59, 0x43, 0x97, 0x1e, 0x0a, 0xf4, 0xdc, 0x4b, 0x81, 0x02, 0x45, 0x7b, 0x2c, 0x50, 0x14,
0xed, 0xe7, 0xe8, 0xb1, 0xb7, 0xf6, 0x54, 0xa0, 0xc7, 0x7e, 0x88, 0x62, 0xde, 0xcc, 0xec, 0xce,
0x2c, 0xe9, 0xa0, 0x41, 0xd1, 0x9b, 0xf8, 0x66, 0xe6, 0xcd, 0x7b, 0x6f, 0xde, 0x9f, 0xdf, 0x7b,
0x2b, 0x68, 0x66, 0xa9, 0x7f, 0x3b, 0xcd, 0x12, 0x96, 0x90, 0xf9, 0x28, 0xce, 0x52, 0x7f, 0x70,
0x75, 0x98, 0x24, 0xc3, 0x88, 0x6e, 0x79, 0x69, 0xb8, 0xe5, 0xc5, 0x71, 0xc2, 0x3c, 0x16, 0x26,
0x71, 0x2e, 0x36, 0x39, 0xbf, 0xb1, 0xa0, 0x75, 0x94, 0x79, 0x71, 0xee, 0xf9, 0x9c, 0x4c, 0x3a,
0xb0, 0xc8, 0x5e, 0xb8, 0xa7, 0x5e, 0x7e, 0xda, 0xb7, 0x36, 0xac, 0xcd, 0x26, 0x59, 0x82, 0x05,
0x6f, 0x94, 0x8c, 0x63, 0xd6, 0x9f, 0xdb, 0xb0, 0x36, 0x2d, 0x72, 0x19, 0x96, 0xe3, 0xf1, 0xc8,
0xf5, 0x93, 0xf8, 0x24, 0xcc, 0x46, 0x82, 0x57, 0xbf, 0xb6, 0x61, 0x6d, 0xce, 0x13, 0x02, 0x70,
0x1c, 0x25, 0xfe, 0x73, 0x71, 0xbc, 0x8e, 0xc7, 0x57, 0xc1, 0x96, 0x34, 0x1a, 0x0e, 0x4f, 0x59,
0x7f, 0x5e, 0xed, 0x64, 0xe1, 0x88, 0xba, 0x39, 0xf3, 0x46, 0x69, 0x7f, 0x61, 0xc3, 0xda, 0xac,
0x21, 0x2d, 0x61, 0x5e, 0xe4, 0x9e, 0x50, 0x9a, 0xf7, 0x17, 0x39, 0xcd, 0xe9, 0x43, 0xef, 0x21,
0x65, 0x9a, 0x7c, 0xf9, 0x13, 0xfa, 0xf5, 0x98, 0xe6, 0xcc, 0xf9, 0x08, 0x88, 0x46, 0xbe, 0x4f,
0x99, 0x17, 0x46, 0x39, 0xd9, 0x04, 0x9b, 0x69, 0x9b, 0xfb, 0xd6, 0x46, 0x6d, 0xb3, 0xb5, 0x4d,
0x6e, 0xa3, 0x25, 0x6e, 0x6b, 0x07, 0x9c, 0x5f, 0x5a, 0xd0, 0x3a, 0xa4, 0x71, 0x20, 0xf9, 0x11,
0x1b, 0xea, 0x01, 0xcd, 0x19, 0x2a, 0x6d, 0x93, 0x15, 0x68, 0xf1, 0x5f, 0x6e, 0xce, 0xb2, 0x30,
0x1e, 0xa2, 0xe6, 0x4d, 0xd2, 0x82, 0x9a, 0x37, 0x62, 0xa8, 0x6b, 0x8d, 0xeb, 0x95, 0x7a, 0x93,
0x11, 0x8d, 0x59, 0xa9, 0xad, 0x4d, 0xae, 0xc0, 0x8a, 0x4e, 0x55, 0xe7, 0xe7, 0xf1, 0xfc, 0x3a,
0x74, 0xd4, 0x62, 0x26, 0x6e, 0x45, 0xcd, 0x9b, 0xce, 0x27, 0x60, 0x0b, 0x51, 0xf2, 0x34, 0x89,
0x73, 0x4a, 0xfa, 0xd0, 0x55, 0x1b, 0xd3, 0x8c, 0x86, 0x23, 0x6f, 0x48, 0xa5, 0x5c, 0x6f, 0x40,
0xbb, 0x60, 0x91, 0x8c, 0x19, 0x45, 0xc9, 0x5a, 0xdb, 0xb6, 0x54, 0xf0, 0x09, 0xa7, 0x39, 0x47,
0x60, 0xdf, 0x3b, 0xf5, 0xe2, 0x98, 0x46, 0x07, 0x49, 0x18, 0x33, 0x2e, 0xea, 0xc9, 0x38, 0x0e,
0xc2, 0x78, 0xe8, 0xb2, 0x17, 0x61, 0x20, 0x59, 0xf5, 0xa1, 0xab, 0x53, 0xb9, 0xa8, 0x52, 0xcf,
0x55, 0xb0, 0x93, 0x31, 0x4b, 0xc7, 0xcc, 0x0d, 0xe3, 0x80, 0xbe, 0x40, 0x85, 0xdb, 0xce, 0x1d,
0xe8, 0xee, 0xf1, 0x17, 0x8c, 0xc3, 0x78, 0xb8, 0x13, 0x04, 0x19, 0xcd, 0x73, 0xee, 0x1b, 0xe9,
0xf8, 0xf8, 0x39, 0x9d, 0x48, 0x5f, 0xb1, 0xa1, 0x7e, 0x9a, 0xe4, 0xc2, 0x53, 0x9a, 0xce, 0x2f,
0x2c, 0xe8, 0x70, 0xbd, 0x3e, 0xf1, 0xe2, 0x89, 0x32, 0xf3, 0x47, 0x60, 0xf3, 0xc3, 0x47, 0xc9,
0x8e, 0xf0, 0x29, 0xf1, 0x40, 0x9b, 0x52, 0xfe, 0xca, 0xee, 0xdb, 0xfa, 0xd6, 0x07, 0x31, 0xcb,
0x26, 0x83, 0x77, 0x61, 0x79, 0x8a, 0xc8, 0x1f, 0xa6, 0x94, 0xa1, 0x0d, 0xf3, 0x67, 0x5e, 0x34,
0x16, 0xa6, 0xa9, 0xbd, 0x3f, 0xf7, 0x9e, 0xe5, 0x6c, 0x40, 0xb7, 0xe4, 0x2c, 0x6d, 0x6c, 0x43,
0xbd, 0x30, 0x46, 0x93, 0x2b, 0xc7, 0x77, 0xdc, 0x4b, 0xc2, 0xc2, 0xc3, 0xf8, 0x0e, 0x2f, 0x08,
0xb2, 0x99, 0x61, 0x50, 0x73, 0xae, 0xc3, 0xb2, 0x76, 0x62, 0x26, 0xd3, 0x5f, 0x5b, 0xb0, 0xbc,
0x4f, 0xcf, 0xa5, 0xb1, 0x14, 0xdb, 0x6d, 0xa8, 0xb3, 0x49, 0x2a, 0x1e, 0x74, 0x69, 0xfb, 0x86,
0xd4, 0x7c, 0x6a, 0xdf, 0x6d, 0xf9, 0xf3, 0x68, 0x92, 0x52, 0xe7, 0x31, 0xb4, 0xb4, 0x9f, 0x64,
0x1d, 0x56, 0x9e, 0x3d, 0x3a, 0xda, 0x7f, 0x70, 0x78, 0xe8, 0x1e, 0x3c, 0xfd, 0xf8, 0x87, 0x0f,
0x7e, 0xec, 0xee, 0xee, 0x1c, 0xee, 0x76, 0x2f, 0x91, 0x1e, 0x90, 0xfd, 0x07, 0x87, 0x47, 0x0f,
0xee, 0x1b, 0x74, 0x8b, 0x74, 0xa0, 0xa5, 0x13, 0xe6, 0x9c, 0x01, 0xf4, 0xf7, 0xe9, 0xf9, 0xb3,
0x90, 0xc5, 0x34, 0xcf, 0xcd, 0x8b, 0x9d, 0x37, 0x81, 0xe8, 0xd2, 0x48, 0xd5, 0x3a, 0xb0, 0xe8,
0x09, 0x92, 0xd4, 0xee, 0x11, 0x90, 0x7b, 0x49, 0x1c, 0x53, 0x9f, 0x1d, 0x50, 0x9a, 0x29, 0xed,
0xde, 0xd4, 0x8c, 0xd6, 0xda, 0x5e, 0x97, 0xda, 0x4d, 0x39, 0x8e, 0x0d, 0xf5, 0x94, 0x66, 0x23,
0xb4, 0x65, 0xc3, 0x79, 0x0b, 0x56, 0x0c, 0x56, 0xe5, 0x95, 0x29, 0xa5, 0x99, 0x2b, 0x0d, 0x3a,
0xef, 0xa4, 0x50, 0xdf, 0x3d, 0xda, 0xbb, 0x47, 0xba, 0xd0, 0x08, 0x63, 0x3f, 0x19, 0xf1, 0xd0,
0xe2, 0x2b, 0x8d, 0xea, 0xeb, 0x90, 0x65, 0x68, 0x62, 0xfc, 0xf1, 0xcc, 0x83, 0xfe, 0x6b, 0xf3,
0xbc, 0x45, 0x5f, 0xa4, 0x61, 0x86, 0x19, 0x4b, 0x65, 0x23, 0x1e, 0xb5, 0x6d, 0x1e, 0x0a, 0x19,
0x3d, 0x4b, 0x7c, 0xb1, 0x14, 0xd0, 0xc8, 0x9b, 0x60, 0xc8, 0xb6, 0x9d, 0xdf, 0xcf, 0x41, 0x7b,
0xc7, 0x67, 0xe1, 0x19, 0x95, 0x11, 0x45, 0xd6, 0xa0, 0x9d, 0xd1, 0x51, 0xc2, 0xa8, 0x6b, 0x78,
0xfe, 0x1a, 0xb4, 0x7d, 0xb1, 0xc3, 0x4d, 0x79, 0xd0, 0xc9, 0x50, 0xea, 0xc0, 0x22, 0x27, 0x73,
0x15, 0xb8, 0x14, 0x75, 0x2e, 0xba, 0xef, 0xa5, 0x9e, 0x1f, 0xb2, 0x09, 0x5e, 0x5e, 0xe3, 0x27,
0xa3, 0xc4, 0xf7, 0x22, 0xf7, 0xd8, 0x8b, 0xbc, 0xd8, 0xa7, 0x78, 0x73, 0x8d, 0xf4, 0x60, 0x49,
0xde, 0xa3, 0xe8, 0x22, 0x4b, 0x5e, 0x86, 0xe5, 0x71, 0x9c, 0x53, 0xc6, 0x22, 0x1a, 0x14, 0x4b,
0x98, 0x2c, 0x79, 0xf2, 0x11, 0x09, 0x34, 0xf7, 0x58, 0x92, 0x9f, 0x86, 0xb9, 0x9b, 0xd3, 0x98,
0xf5, 0x1b, 0xb8, 0x78, 0x0d, 0xd6, 0x2b, 0x8b, 0x19, 0xf5, 0x69, 0x78, 0x46, 0x83, 0x7e, 0x13,
0x37, 0xac, 0x40, 0x8b, 0xe7, 0xf5, 0x71, 0x1a, 0x78, 0x8c, 0xe6, 0x7d, 0x40, 0x71, 0x1d, 0x68,
0xa7, 0x54, 0x24, 0x89, 0x53, 0x16, 0xf9, 0x79, 0xbf, 0x85, 0xf1, 0xda, 0x92, 0xef, 0xca, 0x5f,
0xc3, 0x59, 0x83, 0x95, 0xbd, 0x30, 0x67, 0xd2, 0x40, 0x5a, 0x82, 0x5e, 0x35, 0xc9, 0xf2, 0x55,
0xdf, 0x82, 0x86, 0xb4, 0x94, 0xe2, 0xb6, 0x2a, 0xb9, 0x19, 0x86, 0x76, 0xfe, 0x60, 0x41, 0x9d,
0xbb, 0x03, 0xba, 0xc1, 0xf8, 0xd8, 0x2d, 0x6d, 0xad, 0xf9, 0xc5, 0x1c, 0x56, 0x13, 0xcd, 0x37,
0x6b, 0xb8, 0x83, 0x17, 0xa2, 0x09, 0xa3, 0xd2, 0x00, 0x75, 0x54, 0xa5, 0xa0, 0x65, 0xd4, 0x3f,
0x43, 0x23, 0xe3, 0x6b, 0xe4, 0x1e, 0x13, 0xbb, 0x84, 0x79, 0x25, 0x05, 0xf7, 0x08, 0xab, 0x76,
0x60, 0x31, 0x8c, 0x8f, 0x93, 0x71, 0x1c, 0xa0, 0x25, 0x1b, 0xdc, 0xb7, 0x52, 0xcc, 0x9a, 0xe1,
0x88, 0x0a, 0xdb, 0x39, 0x84, 0xe7, 0xc6, 0x1c, 0xbd, 0xb7, 0xd0, 0x7f, 0x0b, 0x96, 0x35, 0x9a,
0x54, 0x7e, 0x00, 0xf3, 0x5c, 0x74, 0x55, 0x98, 0x94, 0x1d, 0xf9, 0x26, 0xa7, 0x0b, 0x4b, 0x0f,
0x29, 0x7b, 0x14, 0x9f, 0x24, 0x8a, 0xc5, 0x3f, 0x2c, 0xe8, 0x14, 0x24, 0xc9, 0x61, 0x1d, 0x3a,
0x61, 0x40, 0x63, 0x16, 0xb2, 0x89, 0xe9, 0x81, 0x6d, 0x98, 0xf7, 0xa2, 0xd0, 0xcb, 0xa5, 0xe7,
0x5d, 0x85, 0x55, 0xfe, 0x9c, 0xea, 0xf5, 0x0a, 0x93, 0x63, 0x32, 0xe7, 0xae, 0xc2, 0x57, 0x3d,
0xb4, 0x78, 0xb9, 0x28, 0xc2, 0x61, 0x19, 0x9a, 0xe2, 0x28, 0x17, 0x14, 0xe3, 0x60, 0xaa, 0x8a,
0x2f, 0x20, 0xd5, 0xac, 0xf7, 0x0d, 0x55, 0xe4, 0xf2, 0x49, 0xec, 0xd3, 0xc0, 0x65, 0x09, 0x67,
0x1c, 0xc6, 0x68, 0xa3, 0x06, 0x02, 0x0b, 0x9a, 0xb3, 0x98, 0x32, 0xf4, 0xad, 0x86, 0xf3, 0x14,
0x13, 0x48, 0x01, 0x22, 0x9e, 0xa2, 0xe3, 0xf1, 0xcb, 0x05, 0xcf, 0xfc, 0xd4, 0x93, 0x95, 0xaa,
0x7a, 0xb9, 0x78, 0xf4, 0x1e, 0x2c, 0x29, 0x1c, 0x92, 0xbb, 0x11, 0x3d, 0x61, 0xb2, 0x4e, 0x7d,
0x1f, 0x96, 0xa5, 0x0b, 0x3d, 0x4e, 0xa9, 0xe2, 0x7a, 0xb3, 0x1a, 0x9e, 0x22, 0x3f, 0xad, 0x48,
0xfb, 0xeb, 0xe5, 0xd2, 0xf9, 0x00, 0x88, 0xfc, 0x7d, 0x2f, 0x4a, 0x72, 0x2a, 0x39, 0xac, 0x82,
0xed, 0x47, 0x49, 0x5e, 0x29, 0xa2, 0x1d, 0x58, 0xcc, 0xc7, 0xbe, 0xcf, 0x3d, 0x4f, 0xa4, 0xb2,
0x00, 0x56, 0xf0, 0x94, 0xe4, 0xa0, 0xd2, 0xe2, 0xb7, 0xb8, 0xbf, 0xc0, 0x46, 0x51, 0x38, 0x0a,
0x55, 0x3e, 0x6b, 0xc3, 0xfc, 0x49, 0x92, 0xf9, 0x14, 0x75, 0x6c, 0x38, 0x7f, 0xb6, 0x60, 0x19,
0xaf, 0x39, 0x64, 0x1e, 0x1b, 0xe7, 0x52, 0xc4, 0x77, 0xa0, 0xcd, 0x45, 0xa4, 0xea, 0xd1, 0xe5,
0x25, 0xab, 0x85, 0x93, 0x21, 0x55, 0x6c, 0xde, 0xbd, 0x44, 0xee, 0x82, 0xad, 0x83, 0x38, 0x09,
0x25, 0x2e, 0x2b, 0x91, 0xa6, 0x9e, 0x66, 0xf7, 0x12, 0xd9, 0x02, 0xc0, 0x74, 0x86, 0xd7, 0xa0,
0x2c, 0xda, 0x81, 0x29, 0x9b, 0xed, 0x5e, 0xfa, 0xb8, 0x01, 0x0b, 0x22, 0xa1, 0x38, 0xaf, 0x41,
0xdb, 0x10, 0xc0, 0xa8, 0x95, 0xb6, 0xf3, 0x3b, 0x0b, 0x08, 0x7f, 0xaf, 0x8a, 0xdd, 0x7a, 0xb0,
0xc4, 0xbc, 0x6c, 0x48, 0x99, 0x6b, 0x54, 0x02, 0x4c, 0x56, 0x49, 0x50, 0xe4, 0xe0, 0x39, 0x7c,
0x8c, 0x01, 0x10, 0x8d, 0xa8, 0xb0, 0x57, 0x4d, 0x85, 0x83, 0xc8, 0xb2, 0x0a, 0xf3, 0xc8, 0x72,
0x51, 0x57, 0x51, 0x9f, 0x8e, 0x39, 0x5c, 0xf3, 0x98, 0x4c, 0xbf, 0x32, 0x06, 0xd0, 0xbb, 0x84,
0xb7, 0x3b, 0x7f, 0xb4, 0xa0, 0xcb, 0x45, 0x34, 0x6c, 0x7e, 0x0b, 0x6c, 0xb4, 0xc8, 0xff, 0xcd,
0xe4, 0xef, 0x40, 0x13, 0x2f, 0x48, 0x52, 0x1a, 0x4b, 0x8b, 0xf7, 0x4d, 0x8b, 0x97, 0x6e, 0x6e,
0x18, 0xfc, 0x43, 0x58, 0x93, 0xd7, 0x57, 0x6c, 0x7a, 0x03, 0x16, 0x72, 0x54, 0x41, 0x42, 0x90,
0x55, 0x93, 0x9d, 0x50, 0xcf, 0xf9, 0xd3, 0x1c, 0xf4, 0xaa, 0xe7, 0x65, 0x0a, 0xfa, 0x01, 0x74,
0xa7, 0xd2, 0x8a, 0xc8, 0x67, 0xb7, 0x4c, 0xbd, 0x2b, 0x07, 0x2b, 0xe4, 0xc1, 0x5f, 0x2d, 0x58,
0x32, 0x49, 0x53, 0x25, 0x9f, 0x87, 0x5d, 0x91, 0xee, 0xd4, 0x4b, 0xcf, 0xa8, 0xb6, 0xe2, 0x91,
0xff, 0xe7, 0xe2, 0x5a, 0x0d, 0xf2, 0x45, 0x64, 0x5b, 0x1a, 0xac, 0xf1, 0x0d, 0x06, 0xbb, 0x05,
0xab, 0xcf, 0xbc, 0x28, 0xa2, 0xec, 0x63, 0xc1, 0x52, 0x99, 0x7b, 0x15, 0xec, 0x73, 0x81, 0xb3,
0xdc, 0x24, 0x8e, 0x44, 0xb6, 0x6e, 0x38, 0x9b, 0xb0, 0x56, 0xd9, 0x5d, 0x82, 0x1e, 0x25, 0x13,
0xdf, 0x69, 0x39, 0xeb, 0xb0, 0x26, 0x2f, 0x32, 0x19, 0x3b, 0x6f, 0x43, 0xaf, 0xba, 0x30, 0x9b,
0x47, 0xcd, 0xb9, 0x05, 0x36, 0xb6, 0x06, 0x4a, 0xa6, 0xa9, 0x92, 0x2a, 0x5b, 0x1b, 0x01, 0x6d,
0x9f, 0x40, 0x6d, 0x37, 0x49, 0x75, 0xec, 0x62, 0x61, 0xb5, 0x94, 0x56, 0x77, 0x0b, 0x1b, 0xcf,
0x29, 0x63, 0x7a, 0x23, 0xc6, 0xd3, 0xfd, 0x49, 0x92, 0x9d, 0x7b, 0x59, 0x20, 0x3b, 0xa4, 0x16,
0xd4, 0x4e, 0x28, 0x15, 0x0f, 0xe1, 0x78, 0x30, 0x8f, 0x12, 0xf0, 0xfa, 0x20, 0x70, 0x88, 0xc8,
0x71, 0x1c, 0x9f, 0x59, 0xaa, 0x98, 0x68, 0xed, 0x5f, 0x01, 0xe3, 0x04, 0xad, 0xec, 0xbb, 0xfa,
0xbc, 0xc5, 0x48, 0x79, 0xa9, 0xe2, 0x0e, 0x07, 0x0a, 0x88, 0x24, 0xa9, 0xe3, 0x40, 0x67, 0x3f,
0x09, 0xa8, 0x56, 0x40, 0xa7, 0xf4, 0x74, 0x7e, 0x02, 0x0d, 0xb5, 0x87, 0x38, 0x50, 0xe7, 0xe9,
0xa2, 0x12, 0xb2, 0x05, 0x54, 0xe5, 0xfb, 0xf8, 0xe3, 0x61, 0x1a, 0x50, 0x6e, 0x3e, 0x87, 0xa2,
0xf2, 0xac, 0x84, 0x62, 0x15, 0x96, 0x40, 0xd9, 0x9c, 0xa7, 0xd0, 0x36, 0x8f, 0xaf, 0x40, 0x2b,
0xf2, 0x72, 0x26, 0x41, 0x95, 0x54, 0x54, 0x13, 0xaa, 0x00, 0x89, 0x26, 0x7c, 0x29, 0x4a, 0x39,
0xb6, 0xd0, 0x4e, 0x0c, 0x6d, 0x6e, 0xbb, 0x30, 0x1e, 0x1e, 0x24, 0x51, 0xe8, 0x4f, 0xd0, 0x86,
0xca, 0x7a, 0x1c, 0xae, 0x32, 0x4f, 0xb2, 0xee, 0x42, 0x63, 0x14, 0xc6, 0x08, 0xd5, 0xa4, 0x05,
0xd7, 0xa0, 0x7d, 0x42, 0xb9, 0x9b, 0xe7, 0xd4, 0x1d, 0xf1, 0xf4, 0x56, 0x53, 0x50, 0x91, 0x93,
0x33, 0x8f, 0x51, 0x77, 0x14, 0x46, 0x51, 0x28, 0x16, 0xc5, 0x5b, 0xfd, 0xdd, 0x82, 0x96, 0xf4,
0xac, 0x07, 0xc1, 0x90, 0xf2, 0x97, 0x51, 0xd1, 0x56, 0xf8, 0x82, 0xa4, 0x19, 0x60, 0xb7, 0xa2,
0x6d, 0xad, 0x00, 0x13, 0x49, 0x40, 0xef, 0xf2, 0xac, 0x2c, 0x47, 0x02, 0x92, 0xb4, 0x8d, 0xa4,
0xf9, 0xa9, 0xc8, 0x15, 0xa1, 0x78, 0x13, 0x6c, 0x79, 0x0e, 0x75, 0xc6, 0x50, 0x2c, 0x5f, 0xc9,
0xb4, 0x87, 0xdc, 0xbb, 0xad, 0xf6, 0x36, 0x5e, 0xbd, 0x97, 0xa3, 0x55, 0xa9, 0xdb, 0xc3, 0xcc,
0x4b, 0x4f, 0x55, 0x30, 0x7d, 0x56, 0xf4, 0xcc, 0x48, 0x26, 0x6f, 0xc0, 0x3c, 0x67, 0xa9, 0x12,
0xdb, 0x6c, 0xef, 0xb8, 0x0e, 0xf3, 0x34, 0x18, 0xa2, 0xb7, 0xea, 0x63, 0x06, 0xcd, 0x76, 0xdc,
0x29, 0xf9, 0xcf, 0x8a, 0x53, 0x1a, 0x71, 0xe5, 0xac, 0xf2, 0x86, 0x8b, 0x9d, 0x27, 0xd9, 0x73,
0x1d, 0xfc, 0xfd, 0xdb, 0x82, 0x96, 0x46, 0xe6, 0x4e, 0x37, 0xe4, 0xa2, 0xb9, 0x41, 0xe8, 0x8d,
0x28, 0xa3, 0x99, 0x7c, 0x73, 0x1e, 0x7e, 0x67, 0x43, 0x37, 0x19, 0x33, 0x37, 0xa0, 0xc3, 0x8c,
0x52, 0x39, 0xa7, 0xe9, 0xc1, 0xd2, 0xc8, 0x7b, 0xa1, 0xd3, 0x6b, 0x3a, 0xba, 0x13, 0xda, 0xd5,
0x15, 0xba, 0x33, 0xbc, 0x5c, 0x60, 0xbe, 0xd7, 0xa1, 0x27, 0xbc, 0x3c, 0x16, 0x52, 0xb8, 0x95,
0x17, 0xea, 0x43, 0x97, 0x5f, 0xac, 0x5c, 0x23, 0x0f, 0x7f, 0x26, 0x1a, 0x11, 0x8b, 0xaf, 0x70,
0x37, 0x34, 0x56, 0x1a, 0xea, 0x0c, 0x17, 0xca, 0x58, 0x11, 0x10, 0xfa, 0x06, 0x74, 0x0e, 0x29,
0xdb, 0xe1, 0x6e, 0xaf, 0x0c, 0xc5, 0x25, 0xa5, 0xe7, 0xae, 0x08, 0x05, 0x11, 0xbf, 0x84, 0xf7,
0xe9, 0x6a, 0x97, 0xc8, 0x76, 0xce, 0x5f, 0x2c, 0x58, 0x7c, 0x14, 0x9f, 0x25, 0xa1, 0x8f, 0xa0,
0x62, 0x44, 0x47, 0x49, 0xd9, 0x28, 0x60, 0x93, 0x93, 0x32, 0x89, 0x10, 0x08, 0x40, 0x56, 0x8e,
0x54, 0x44, 0x5f, 0xb8, 0x04, 0x0b, 0x99, 0x3e, 0xc2, 0x29, 0xe6, 0x07, 0xf3, 0x0a, 0xfe, 0xcb,
0x6e, 0x0b, 0xd5, 0x6e, 0x60, 0x16, 0xcc, 0xa8, 0x6c, 0x15, 0xb9, 0x9f, 0x2f, 0xaa, 0xf6, 0x49,
0xec, 0x13, 0x44, 0xa1, 0xee, 0x8c, 0x89, 0x4f, 0x13, 0xf5, 0xf8, 0x10, 0xc8, 0x4e, 0x10, 0x48,
0xa9, 0x8b, 0xbc, 0x5d, 0x8a, 0x22, 0xd0, 0xe5, 0x8c, 0xe3, 0x62, 0xb2, 0x72, 0x17, 0x5a, 0x07,
0x62, 0x61, 0xd7, 0xcb, 0x4f, 0x85, 0x5a, 0x6a, 0xde, 0x54, 0xce, 0x2b, 0x24, 0x2f, 0x54, 0xdd,
0xb9, 0x09, 0x84, 0xb7, 0x23, 0xc5, 0x95, 0x45, 0x71, 0x52, 0xa5, 0x5c, 0x2b, 0x4e, 0xdf, 0x13,
0x1d, 0x5d, 0x55, 0xbc, 0x0d, 0xde, 0x76, 0x23, 0x49, 0x85, 0xc5, 0x92, 0xf4, 0x78, 0xb9, 0x93,
0x07, 0x97, 0xfc, 0xf3, 0x70, 0x7c, 0x9c, 0xfb, 0x59, 0x98, 0xe2, 0xac, 0xed, 0x4b, 0x58, 0x94,
0xe2, 0x4e, 0x8d, 0xcd, 0x66, 0xcd, 0x6c, 0xa6, 0x4d, 0x2c, 0x92, 0x96, 0x0d, 0xf5, 0xd4, 0x63,
0xa7, 0x98, 0xfa, 0x9b, 0xaa, 0xbc, 0xe0, 0x2b, 0xa9, 0x1e, 0x54, 0xde, 0x52, 0xf4, 0x60, 0xef,
0x89, 0x1e, 0xb4, 0x24, 0x97, 0x9a, 0x48, 0x29, 0xaa, 0x9a, 0xc8, 0xad, 0xce, 0x00, 0xfa, 0xf7,
0x69, 0x44, 0x19, 0xdd, 0x89, 0xa2, 0x2a, 0xd7, 0x2b, 0x70, 0x79, 0xc6, 0x9a, 0xf4, 0xc6, 0xef,
0xc2, 0xf2, 0x7d, 0x7a, 0x3c, 0x1e, 0xee, 0xd1, 0xb3, 0x12, 0x72, 0xd9, 0x50, 0xcf, 0x4f, 0x93,
0x73, 0x39, 0xac, 0x20, 0x00, 0x11, 0x5f, 0x75, 0xf3, 0x94, 0xfa, 0xf2, 0x45, 0xdf, 0x06, 0xa2,
0x1f, 0x93, 0x72, 0x72, 0xa7, 0x1a, 0x1f, 0xbb, 0xf9, 0x24, 0x67, 0x74, 0xa4, 0x62, 0xe0, 0x1a,
0xd8, 0x07, 0xde, 0xe4, 0x09, 0xfd, 0xfa, 0x10, 0x01, 0x2e, 0xd6, 0x13, 0x6f, 0xc2, 0x3d, 0xa4,
0x98, 0xcc, 0x2c, 0x88, 0x0d, 0x6a, 0x8c, 0x19, 0xc6, 0x02, 0x6e, 0x5a, 0x6a, 0xbc, 0x67, 0x3c,
0x41, 0x31, 0xf4, 0xe3, 0x39, 0x40, 0x4d, 0x07, 0x84, 0xc9, 0x6f, 0x6e, 0x43, 0xdb, 0x40, 0x39,
0x64, 0x11, 0x6a, 0x3b, 0x7b, 0x7b, 0xdd, 0x4b, 0xa4, 0x05, 0x8b, 0x8f, 0x0f, 0x1e, 0xec, 0x3f,
0xda, 0x7f, 0xd8, 0xb5, 0xf8, 0x8f, 0x7b, 0x7b, 0x8f, 0x0f, 0xf9, 0x8f, 0xb9, 0xed, 0x7f, 0xf6,
0xa0, 0x59, 0xe4, 0x49, 0xf2, 0x15, 0xb4, 0x0d, 0xa0, 0x43, 0xae, 0x48, 0x4b, 0xcf, 0x02, 0x4b,
0x83, 0xab, 0xb3, 0x17, 0xa5, 0x6d, 0x5f, 0xff, 0xf9, 0xdf, 0xfe, 0xf5, 0xab, 0xb9, 0x3e, 0xe9,
0x6d, 0x9d, 0xdd, 0xdd, 0x92, 0x08, 0x67, 0x0b, 0x5b, 0x43, 0x6c, 0x34, 0xc9, 0x73, 0x58, 0x32,
0x11, 0x11, 0xb9, 0x6a, 0xa6, 0xe4, 0xca, 0x6d, 0xaf, 0xbd, 0x62, 0x55, 0x5e, 0x77, 0x15, 0xaf,
0xeb, 0x91, 0x55, 0xfd, 0x3a, 0x95, 0x24, 0x09, 0xc5, 0xde, 0x5c, 0x1f, 0x4d, 0x13, 0xc5, 0x6f,
0xf6, 0xc8, 0x7a, 0x70, 0x79, 0x7a, 0x0c, 0x2d, 0xe7, 0xd6, 0x4e, 0x1f, 0xaf, 0x22, 0xa4, 0xcb,
0xaf, 0xd2, 0x27, 0xd8, 0xe4, 0x0b, 0x68, 0x16, 0x73, 0x46, 0xb2, 0xae, 0xcd, 0x49, 0xf5, 0x59,
0xe5, 0xa0, 0x3f, 0xbd, 0x20, 0x95, 0xb8, 0x82, 0x9c, 0xd7, 0x9c, 0x29, 0xce, 0xef, 0x5b, 0x37,
0xc9, 0x1e, 0xac, 0xc9, 0x40, 0x3d, 0xa6, 0xdf, 0x46, 0x93, 0x19, 0x03, 0xf5, 0x3b, 0x16, 0xf9,
0x00, 0x1a, 0x6a, 0xcc, 0x4a, 0x7a, 0xb3, 0x27, 0xba, 0x83, 0xf5, 0x29, 0xba, 0x74, 0xf5, 0x1d,
0x80, 0x72, 0xea, 0x48, 0xfa, 0xaf, 0x1a, 0x8b, 0x16, 0x46, 0x9c, 0x31, 0xa2, 0x1c, 0xe2, 0xb8,
0xd5, 0x1c, 0x6a, 0x92, 0x6b, 0xe5, 0xfe, 0x99, 0xe3, 0xce, 0x6f, 0x60, 0xe8, 0xf4, 0xd0, 0x76,
0x5d, 0xb2, 0xc4, 0x6d, 0x17, 0xd3, 0x73, 0x89, 0xd2, 0xc8, 0xe7, 0xd0, 0xd2, 0xe6, 0x95, 0x44,
0xeb, 0xdf, 0x2a, 0xe3, 0xd0, 0xc1, 0x60, 0xd6, 0x92, 0xe4, 0xbe, 0x8a, 0xdc, 0x97, 0x9c, 0x26,
0xe7, 0x8e, 0xc3, 0x16, 0xfe, 0x24, 0x9f, 0xf2, 0xe0, 0x91, 0x63, 0x23, 0x52, 0xce, 0x4f, 0xcd,
0xe1, 0x52, 0xf1, 0xde, 0x53, 0x13, 0x26, 0x67, 0x19, 0xb9, 0xb6, 0x48, 0xc9, 0x95, 0x7c, 0x02,
0x8b, 0x72, 0x8a, 0x44, 0xd6, 0xca, 0x77, 0xd5, 0xb0, 0xc6, 0xa0, 0x57, 0x25, 0x4b, 0x66, 0x2b,
0xc8, 0xac, 0x4d, 0x5a, 0x9c, 0xd9, 0x90, 0xb2, 0x90, 0xf3, 0x88, 0xa0, 0x63, 0x76, 0x6d, 0x79,
0x11, 0x66, 0x33, 0x1b, 0xce, 0x22, 0xcc, 0x66, 0x77, 0x85, 0x66, 0x98, 0xa9, 0xf0, 0xda, 0x92,
0x65, 0x89, 0xfc, 0x14, 0x6c, 0x7d, 0x8c, 0x48, 0x06, 0x9a, 0xe6, 0x95, 0x91, 0xe3, 0xe0, 0xca,
0xcc, 0x35, 0xd3, 0xdc, 0xc4, 0xd6, 0xaf, 0x21, 0x9f, 0x43, 0x47, 0x1b, 0x3b, 0x1c, 0x4e, 0x62,
0xbf, 0x78, 0xce, 0xe9, 0x71, 0xc4, 0x60, 0xe6, 0xbc, 0x68, 0x1d, 0x19, 0x2f, 0x3b, 0x06, 0x63,
0xfe, 0x94, 0xf7, 0xa0, 0xa5, 0xf1, 0xf8, 0x26, 0xbe, 0xeb, 0xda, 0x92, 0x3e, 0x5e, 0xb8, 0x63,
0x91, 0xdf, 0x5a, 0x60, 0xeb, 0x13, 0xa5, 0xc2, 0x00, 0x33, 0xc6, 0x4c, 0x85, 0x5b, 0x4c, 0xcd,
0x86, 0x9c, 0xcf, 0x50, 0xc8, 0x83, 0x9b, 0xfb, 0x86, 0x91, 0x5f, 0x1a, 0x5d, 0xf4, 0x6d, 0xfd,
0x7b, 0xd0, 0x45, 0x75, 0x51, 0xff, 0x24, 0x74, 0xb1, 0xf5, 0x12, 0xc7, 0x51, 0x17, 0x77, 0x2c,
0xf2, 0xbe, 0xf8, 0x8e, 0xa6, 0x0a, 0x3c, 0xd1, 0x02, 0xbc, 0x6a, 0x36, 0xfd, 0x23, 0xd7, 0xa6,
0x75, 0xc7, 0x22, 0x5f, 0x8a, 0x0f, 0x44, 0xf2, 0x2c, 0x5a, 0xff, 0xbf, 0x3d, 0xef, 0xdc, 0x40,
0x8d, 0x5e, 0x77, 0x2e, 0x1b, 0x1a, 0x55, 0x33, 0xdc, 0x01, 0x40, 0x09, 0xb4, 0x48, 0x05, 0xaf,
0x14, 0xb1, 0x3f, 0x8d, 0xc5, 0xcc, 0x57, 0x55, 0xb0, 0x87, 0x73, 0xfc, 0x4a, 0x38, 0xa4, 0xdc,
0x9f, 0x17, 0xcf, 0x3a, 0x8d, 0xae, 0x06, 0x83, 0x59, 0x4b, 0x92, 0xff, 0x1b, 0xc8, 0xff, 0x35,
0x72, 0x45, 0xe7, 0xbf, 0xf5, 0x52, 0x47, 0x63, 0x17, 0xe4, 0x33, 0x68, 0xef, 0x25, 0xc9, 0xf3,
0x71, 0xaa, 0x14, 0x20, 0x26, 0x4c, 0xe1, 0xe8, 0x6f, 0x50, 0x05, 0x61, 0xd7, 0x91, 0xf3, 0x15,
0x72, 0xd9, 0xe4, 0x5c, 0x22, 0xc4, 0x0b, 0xe2, 0xc1, 0x72, 0x91, 0xf7, 0x0b, 0x45, 0x06, 0x26,
0x1f, 0x1d, 0xc1, 0x4d, 0xdd, 0x61, 0x54, 0xe2, 0xe2, 0x8e, 0x5c, 0xf1, 0xbc, 0x63, 0x91, 0x03,
0xb0, 0xef, 0x53, 0x3f, 0x09, 0xa8, 0x82, 0x22, 0xa5, 0xe4, 0x05, 0x74, 0x19, 0xb4, 0x0d, 0xa2,
0x99, 0x09, 0x52, 0x6f, 0x92, 0xd1, 0xaf, 0xb7, 0x5e, 0x4a, 0x6c, 0x73, 0xa1, 0x32, 0x81, 0x42,
0x5c, 0x46, 0x26, 0xa8, 0x40, 0x34, 0x23, 0x13, 0x4c, 0x41, 0x34, 0x23, 0x13, 0x28, 0x1c, 0x48,
0x22, 0x0e, 0xdc, 0x2a, 0xa8, 0xae, 0xa8, 0x1e, 0xaf, 0xc2, 0x82, 0x83, 0x8d, 0x57, 0x6f, 0x30,
0x6f, 0xbb, 0x69, 0xde, 0x76, 0x08, 0xed, 0xfb, 0x54, 0x18, 0x4b, 0x34, 0x9c, 0x03, 0x33, 0xb5,
0xe8, 0xcd, 0x69, 0x35, 0xed, 0xe0, 0x9a, 0x99, 0xe8, 0xb1, 0x33, 0x24, 0x5f, 0x40, 0xeb, 0x21,
0x65, 0xaa, 0xdf, 0x2c, 0x6a, 0x70, 0xa5, 0x01, 0x1d, 0xcc, 0xea, 0x53, 0x37, 0x90, 0xdb, 0x80,
0xf4, 0x0b, 0x6e, 0x5b, 0xbc, 0xb5, 0x15, 0x49, 0xc0, 0x0d, 0x83, 0x0b, 0xf2, 0x23, 0x64, 0x5e,
0x4c, 0x4f, 0x14, 0xf3, 0xca, 0xc8, 0x65, 0xd0, 0xa9, 0xd0, 0x67, 0x71, 0xe6, 0xbd, 0xe7, 0xd6,
0x4b, 0x39, 0x04, 0xe1, 0x9c, 0xe1, 0xd3, 0x31, 0xcd, 0x26, 0x62, 0x40, 0xb4, 0xa2, 0x7f, 0xcb,
0x56, 0x5c, 0xcd, 0x0f, 0xdc, 0xdf, 0x41, 0x96, 0xd7, 0xc9, 0xb5, 0x92, 0x25, 0x7e, 0x0d, 0x2f,
0x79, 0x6e, 0xbd, 0xf4, 0x46, 0xec, 0x82, 0x3c, 0xc3, 0x4f, 0x2a, 0x7a, 0x17, 0x5d, 0x56, 0xfb,
0x6a, 0xc3, 0x5d, 0x98, 0x45, 0x5b, 0x32, 0x11, 0x80, 0xb8, 0x09, 0x6b, 0x20, 0x42, 0x1d, 0xd1,
0x87, 0x6a, 0x50, 0xc7, 0x68, 0x5f, 0x35, 0xa8, 0x63, 0x36, 0xac, 0x1c, 0xea, 0x94, 0x58, 0xbf,
0x80, 0x3a, 0x53, 0x5d, 0x43, 0x91, 0x9d, 0xa6, 0x1b, 0x83, 0xe3, 0x05, 0xfc, 0xe7, 0x8d, 0x77,
0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x71, 0x82, 0xe3, 0x1a, 0xee, 0x21, 0x00, 0x00,
// 3856 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x5a, 0x4b, 0x73, 0x1b, 0x49,
0x72, 0x56, 0xe3, 0x41, 0x00, 0x09, 0x80, 0x04, 0x8b, 0x2f, 0x08, 0xd2, 0xcc, 0x48, 0x3d, 0xda,
0x15, 0x57, 0x33, 0x26, 0x39, 0xb4, 0x3d, 0xaf, 0x8d, 0xf0, 0x06, 0x45, 0x4a, 0xa2, 0x62, 0x28,
0x8a, 0xd3, 0xe0, 0xac, 0xec, 0xdd, 0x70, 0xc0, 0x4d, 0xa0, 0x08, 0xf6, 0x0a, 0xe8, 0xee, 0xe9,
0x2e, 0x90, 0xc4, 0x28, 0xb4, 0x07, 0x87, 0x7d, 0xb2, 0x7d, 0x70, 0xf8, 0xbe, 0xe1, 0x8b, 0xcf,
0xbe, 0xf8, 0x17, 0xf8, 0x17, 0xd8, 0xb1, 0x07, 0x9f, 0x1d, 0xe1, 0x9b, 0x8f, 0xf6, 0xd5, 0x11,
0x8e, 0xcc, 0xaa, 0xea, 0xae, 0x6e, 0x80, 0x33, 0xb2, 0x63, 0x4f, 0xe8, 0xca, 0xca, 0xca, 0xaa,
0xca, 0xac, 0xcc, 0xfc, 0x2a, 0x0b, 0x50, 0x8b, 0xc2, 0xfe, 0x56, 0x18, 0x05, 0x22, 0x60, 0xe5,
0x91, 0x1f, 0x85, 0xfd, 0xce, 0xdd, 0x61, 0x10, 0x0c, 0x47, 0x7c, 0xdb, 0x0d, 0xbd, 0x6d, 0xd7,
0xf7, 0x03, 0xe1, 0x0a, 0x2f, 0xf0, 0x63, 0xc9, 0x64, 0xff, 0xa7, 0x05, 0xf5, 0xd3, 0xc8, 0xf5,
0x63, 0xb7, 0x8f, 0x64, 0xb6, 0x01, 0x15, 0x71, 0xdd, 0xbb, 0x70, 0xe3, 0x8b, 0xb6, 0x75, 0xcf,
0xda, 0xac, 0x39, 0x0b, 0xe2, 0xfa, 0xd0, 0x8d, 0x2f, 0xd8, 0x3a, 0x2c, 0xb8, 0xe3, 0x60, 0xe2,
0x8b, 0x76, 0xe1, 0x9e, 0xb5, 0x69, 0x39, 0xaa, 0xc5, 0x3e, 0x82, 0x65, 0x7f, 0x32, 0xee, 0xf5,
0x03, 0xff, 0xdc, 0x8b, 0xc6, 0x52, 0x76, 0xbb, 0x78, 0xcf, 0xda, 0x2c, 0x3b, 0x2d, 0x7f, 0x32,
0xde, 0x37, 0xe9, 0xec, 0x3d, 0x80, 0xb3, 0x51, 0xd0, 0x7f, 0x2d, 0x27, 0x28, 0xd1, 0x04, 0x35,
0xa2, 0xd0, 0x1c, 0xf7, 0xa1, 0xa1, 0xba, 0xb9, 0x37, 0xbc, 0x10, 0xed, 0x32, 0x89, 0xa9, 0x4b,
0x06, 0x22, 0xa1, 0x04, 0xe1, 0x8d, 0x79, 0x2f, 0x16, 0xee, 0x38, 0x6c, 0x2f, 0xdc, 0xb3, 0x36,
0x8b, 0x4e, 0x0d, 0x29, 0x5d, 0x24, 0x50, 0x77, 0x20, 0xdc, 0x51, 0xef, 0x9c, 0xf3, 0xb8, 0x5d,
0x51, 0xdd, 0x48, 0x79, 0xca, 0x79, 0x6c, 0xb7, 0x61, 0xfd, 0x19, 0x17, 0xc6, 0x7e, 0x63, 0x87,
0x7f, 0x3b, 0xe1, 0xb1, 0xb0, 0x8f, 0x80, 0x19, 0xe4, 0x03, 0x2e, 0x5c, 0x6f, 0x14, 0xb3, 0x4f,
0xa1, 0x21, 0x0c, 0xe6, 0xb6, 0x75, 0xaf, 0xb8, 0x59, 0xdf, 0x65, 0x5b, 0xa4, 0xd9, 0x2d, 0x63,
0x80, 0x93, 0xe1, 0xb3, 0xff, 0xc5, 0x82, 0x7a, 0x97, 0xfb, 0x03, 0x25, 0x9d, 0x31, 0x28, 0x0d,
0x78, 0x2c, 0x48, 0xa5, 0x0d, 0x87, 0xbe, 0xd9, 0x07, 0x50, 0xc7, 0xdf, 0x5e, 0x2c, 0x22, 0xcf,
0x1f, 0x92, 0x56, 0x6b, 0x0e, 0x20, 0xa9, 0x4b, 0x14, 0xd6, 0x82, 0xa2, 0x3b, 0x16, 0xa4, 0xcb,
0xa2, 0x83, 0x9f, 0xa8, 0x9f, 0xd0, 0x9d, 0x8e, 0xb9, 0x2f, 0x52, 0x05, 0x36, 0x9c, 0xba, 0xa2,
0x91, 0x0a, 0xb7, 0x60, 0xc5, 0x64, 0xd1, 0xd2, 0xcb, 0x24, 0x7d, 0xd9, 0xe0, 0x54, 0x93, 0x3c,
0x84, 0x25, 0xcd, 0x1f, 0xc9, 0xc5, 0x92, 0x52, 0x6b, 0xce, 0xa2, 0x22, 0x6b, 0x05, 0x8d, 0xa0,
0x21, 0x77, 0x14, 0x87, 0x81, 0x1f, 0x73, 0xf6, 0x13, 0x68, 0xe9, 0x81, 0x61, 0xc4, 0xbd, 0xb1,
0x3b, 0xe4, 0x6a, 0x7b, 0x5a, 0xe0, 0x89, 0x22, 0xb3, 0x4f, 0xa0, 0x99, 0xcc, 0x11, 0x4c, 0x04,
0xa7, 0xbd, 0xd6, 0x77, 0x1b, 0x4a, 0x8d, 0x0e, 0xd2, 0x1c, 0xbd, 0x33, 0x6a, 0xd9, 0xbf, 0x86,
0xc6, 0xfe, 0x85, 0xeb, 0xfb, 0x7c, 0x74, 0x12, 0x78, 0x3e, 0xed, 0xfc, 0x7c, 0xe2, 0x0f, 0x3c,
0x7f, 0xd8, 0x13, 0xd7, 0xde, 0x40, 0xcd, 0x54, 0x57, 0xb4, 0xd3, 0x6b, 0x6f, 0xc0, 0x36, 0xa1,
0x65, 0xb2, 0xe0, 0xce, 0x95, 0x52, 0x17, 0x0d, 0xb6, 0xae, 0x88, 0x50, 0x58, 0x30, 0x11, 0xe1,
0x44, 0xf4, 0x3c, 0x7f, 0xc0, 0xaf, 0x49, 0xc3, 0x4d, 0xa7, 0x2e, 0x69, 0xcf, 0x91, 0x64, 0xff,
0x11, 0xb4, 0x8e, 0xf0, 0xbc, 0xf9, 0x9e, 0x3f, 0xdc, 0x1b, 0x0c, 0x22, 0x1e, 0xc7, 0xe8, 0x01,
0xe1, 0xe4, 0xec, 0x35, 0x9f, 0x6a, 0xcf, 0x90, 0x2d, 0x34, 0xee, 0x45, 0x10, 0x0b, 0x35, 0x19,
0x7d, 0xdb, 0x7f, 0x6f, 0xc1, 0x12, 0xaa, 0xeb, 0x85, 0xeb, 0x4f, 0xf5, 0x21, 0x38, 0x82, 0x06,
0x8a, 0x3a, 0x0d, 0xf6, 0xa4, 0x1f, 0xc9, 0xc3, 0xb4, 0xa9, 0xb4, 0x90, 0xe3, 0xde, 0x32, 0x59,
0x9f, 0xf8, 0x22, 0x9a, 0x3a, 0x0d, 0xd7, 0x20, 0x75, 0x7e, 0x06, 0xcb, 0x33, 0x2c, 0x78, 0x64,
0xd2, 0xf5, 0xe1, 0x27, 0x5b, 0x85, 0xf2, 0xa5, 0x3b, 0x9a, 0x48, 0x9d, 0x17, 0x1d, 0xd9, 0xf8,
0xb2, 0xf0, 0xb9, 0x65, 0xff, 0x18, 0x5a, 0xe9, 0x9c, 0xca, 0xa8, 0x0c, 0x4a, 0x89, 0x7a, 0x6b,
0x0e, 0x7d, 0xa3, 0x2a, 0x90, 0x6f, 0x3f, 0xf0, 0x12, 0x6f, 0x41, 0x3e, 0x5c, 0x8c, 0xe6, 0xc3,
0xef, 0x5c, 0x80, 0x28, 0xea, 0x00, 0x61, 0x3f, 0x84, 0x65, 0x63, 0xfc, 0xf7, 0x4c, 0xf4, 0x1b,
0x0b, 0x96, 0x8f, 0xf9, 0x95, 0x52, 0xb7, 0x9e, 0xea, 0x73, 0x28, 0x89, 0x69, 0x28, 0xcf, 0xd6,
0xe2, 0xee, 0x03, 0xa5, 0xad, 0x19, 0xbe, 0x2d, 0xd5, 0x3c, 0x9d, 0x86, 0xdc, 0xa1, 0x11, 0xf6,
0x4b, 0xa8, 0x1b, 0x44, 0xb6, 0x01, 0x2b, 0xaf, 0x9e, 0x9f, 0x1e, 0x3f, 0xe9, 0x76, 0x7b, 0x27,
0xdf, 0x3c, 0xfe, 0xea, 0xc9, 0x9f, 0xf4, 0x0e, 0xf7, 0xba, 0x87, 0xad, 0x5b, 0x6c, 0x1d, 0xd8,
0xf1, 0x93, 0xee, 0xe9, 0x93, 0x83, 0x0c, 0xdd, 0x62, 0x4b, 0x50, 0x37, 0x09, 0x05, 0xbb, 0x03,
0xed, 0x63, 0x7e, 0xf5, 0xca, 0x13, 0x3e, 0x8f, 0xe3, 0xec, 0xf4, 0xf6, 0x16, 0x30, 0x73, 0x4d,
0x6a, 0x9b, 0x6d, 0xa8, 0xb8, 0x92, 0xa4, 0x76, 0xaa, 0x9b, 0xf6, 0x37, 0xc0, 0xf6, 0x03, 0xdf,
0xe7, 0x7d, 0x71, 0xc2, 0x79, 0xa4, 0x37, 0xfb, 0x91, 0xa1, 0xd7, 0xfa, 0xee, 0x86, 0xda, 0x6c,
0xfe, 0x24, 0x2a, 0x85, 0x33, 0x28, 0x85, 0x3c, 0x1a, 0x93, 0xba, 0xab, 0x0e, 0x7d, 0xdb, 0x5b,
0xb0, 0x92, 0x11, 0xab, 0xd6, 0xb1, 0x01, 0x95, 0x90, 0xf3, 0xa8, 0xa7, 0x34, 0x5e, 0x76, 0x16,
0xb0, 0xf9, 0x7c, 0x60, 0xff, 0xa3, 0x05, 0xa5, 0xc3, 0xd3, 0xa3, 0x7d, 0xd6, 0x81, 0xaa, 0xe7,
0xf7, 0x83, 0x31, 0x06, 0x0b, 0x8b, 0x04, 0x26, 0xed, 0x9b, 0x2c, 0xcb, 0xee, 0x40, 0x8d, 0x62,
0x0c, 0x86, 0x67, 0x72, 0xa2, 0x86, 0x53, 0x45, 0xc2, 0x51, 0xd0, 0x7f, 0x8d, 0x79, 0x81, 0x5f,
0x87, 0x5e, 0x44, 0x91, 0x5f, 0x07, 0xf4, 0x12, 0x79, 0x5a, 0x2b, 0xed, 0x50, 0x51, 0xfd, 0x27,
0xd0, 0x8a, 0xf8, 0x65, 0xd0, 0x97, 0xcc, 0x03, 0x3e, 0x72, 0xa7, 0x14, 0xb2, 0x9a, 0xce, 0x52,
0x4a, 0x3f, 0x40, 0xb2, 0xfd, 0xcf, 0x45, 0x68, 0xee, 0xf5, 0x85, 0x77, 0xc9, 0x55, 0x80, 0x60,
0x1f, 0x42, 0x33, 0xe2, 0xe3, 0x40, 0xf0, 0x5e, 0xc6, 0x3d, 0x1b, 0x92, 0x78, 0x22, 0x9d, 0xf4,
0x43, 0x68, 0xf6, 0x25, 0x7f, 0x2f, 0xc4, 0x88, 0xa2, 0xbc, 0xb5, 0xd1, 0x37, 0xa3, 0xcc, 0x06,
0x54, 0xb0, 0x8d, 0x6a, 0xc2, 0xed, 0x94, 0x9c, 0x05, 0x6c, 0x3e, 0x1f, 0xa0, 0x76, 0xfa, 0x6e,
0xe8, 0xf6, 0x3d, 0x31, 0xa5, 0x3d, 0x14, 0x9d, 0xa4, 0x8d, 0x92, 0x47, 0x41, 0xdf, 0x1d, 0xf5,
0xce, 0xdc, 0x91, 0xeb, 0xf7, 0x39, 0x2d, 0xbc, 0xe8, 0x34, 0x88, 0xf8, 0x58, 0xd2, 0xd8, 0x8f,
0x60, 0x51, 0xad, 0x51, 0x73, 0xc9, 0xd4, 0xa5, 0x56, 0xae, 0xd9, 0x3e, 0x82, 0xe5, 0x89, 0x1f,
0x73, 0x21, 0x46, 0x7c, 0x90, 0x70, 0xca, 0x2c, 0xd6, 0x4a, 0x3a, 0x34, 0xf3, 0x16, 0xac, 0xc8,
0x5c, 0x17, 0xbb, 0x22, 0x88, 0x2f, 0xbc, 0xb8, 0x17, 0x73, 0x5f, 0xb4, 0xab, 0xc4, 0xbe, 0x4c,
0x5d, 0x5d, 0xd5, 0xd3, 0xe5, 0xbe, 0x60, 0x9f, 0xc2, 0x46, 0x8e, 0x3f, 0xe2, 0x7d, 0xee, 0x5d,
0xf2, 0x41, 0xbb, 0x46, 0x63, 0xd6, 0x32, 0x63, 0x1c, 0xd5, 0x89, 0x89, 0x0a, 0x33, 0xfc, 0x24,
0x1c, 0xb8, 0x82, 0xc7, 0x6d, 0x20, 0xcd, 0x80, 0x3f, 0x19, 0x7f, 0x23, 0x29, 0x6c, 0x07, 0x9a,
0x21, 0x97, 0x91, 0xf7, 0x42, 0x8c, 0xfa, 0x71, 0xbb, 0x4e, 0x91, 0xad, 0xae, 0x8e, 0x2f, 0x9e,
0x2f, 0xa7, 0xa1, 0x38, 0x0e, 0x91, 0xc1, 0x5e, 0x83, 0x95, 0x23, 0x2f, 0x16, 0xca, 0x82, 0x89,
0x13, 0x1d, 0xc2, 0x6a, 0x96, 0xac, 0x8e, 0xef, 0x0e, 0x54, 0x95, 0x9d, 0xb4, 0xec, 0x55, 0x25,
0x3b, 0x73, 0x12, 0x9c, 0x84, 0xcb, 0xfe, 0x1f, 0x0b, 0x4a, 0xe8, 0x01, 0x74, 0xf2, 0x27, 0x67,
0xbd, 0x6c, 0xd4, 0xfe, 0x8a, 0x4f, 0x4d, 0x97, 0x28, 0x98, 0x2e, 0x61, 0xfa, 0x6c, 0x31, 0xe3,
0xb3, 0x84, 0x5e, 0xa6, 0x82, 0x2b, 0x3d, 0x97, 0x48, 0x0f, 0x35, 0xa2, 0x90, 0x7e, 0x93, 0xee,
0x88, 0xf7, 0x2f, 0xe9, 0x14, 0xe8, 0x6e, 0x87, 0xf7, 0x2f, 0xd9, 0x6d, 0xa8, 0xc6, 0xae, 0x90,
0x63, 0xa5, 0xf1, 0x2b, 0xb1, 0x2b, 0x68, 0xa4, 0xea, 0xa2, 0x71, 0x95, 0xa4, 0x8b, 0x46, 0xb5,
0xa1, 0xe2, 0xf9, 0x67, 0xc1, 0xc4, 0x1f, 0x90, 0x61, 0xab, 0x8e, 0x6e, 0xa2, 0xf7, 0x85, 0x94,
0xec, 0xbc, 0x31, 0x57, 0x06, 0xac, 0x22, 0xe1, 0xd4, 0x1b, 0x73, 0x9b, 0x61, 0xfe, 0x8a, 0x29,
0x08, 0x24, 0xda, 0xfd, 0x14, 0x96, 0x0d, 0x9a, 0x52, 0xed, 0x7d, 0x28, 0xe3, 0xbe, 0x35, 0xb4,
0xd1, 0x36, 0xa3, 0xe8, 0x21, 0x7b, 0xec, 0x16, 0x2c, 0x3e, 0xe3, 0xe2, 0xb9, 0x7f, 0x1e, 0x68,
0x49, 0xbf, 0x2d, 0xc0, 0x52, 0x42, 0x52, 0x82, 0x1e, 0xc2, 0x92, 0x37, 0xe0, 0xbe, 0xf0, 0xc4,
0x34, 0xeb, 0x87, 0x8b, 0x9a, 0xac, 0x3c, 0x71, 0x15, 0xca, 0xee, 0xc8, 0x73, 0x63, 0xe5, 0x81,
0xb2, 0xc1, 0x76, 0x60, 0x15, 0x0f, 0x99, 0x3e, 0x47, 0x89, 0xb9, 0x65, 0x6e, 0x66, 0xfe, 0x64,
0x7c, 0x22, 0xbb, 0xf4, 0xe1, 0xc0, 0xe3, 0x8f, 0x23, 0x5c, 0x3a, 0x01, 0xe9, 0x00, 0x19, 0x62,
0x10, 0x93, 0x66, 0xce, 0x46, 0x8c, 0xfa, 0x92, 0x33, 0xe0, 0x6e, 0x65, 0x70, 0xa9, 0x92, 0x58,
0x1e, 0xc5, 0x33, 0xc8, 0x73, 0x41, 0x42, 0x82, 0x1c, 0xf2, 0x34, 0xb0, 0x6b, 0x35, 0x8f, 0x5d,
0x7f, 0x0c, 0x4b, 0xf1, 0xd4, 0xef, 0xf3, 0x41, 0x4f, 0x04, 0xb8, 0x1a, 0xcf, 0x27, 0xa3, 0x54,
0x9d, 0xa6, 0x24, 0x9f, 0x06, 0xfb, 0x48, 0x44, 0x83, 0x0a, 0x1e, 0x0b, 0x9f, 0x0b, 0xf2, 0xa4,
0xaa, 0xa3, 0x9b, 0xf6, 0x77, 0x94, 0x12, 0x12, 0xb4, 0x2c, 0xbd, 0x0b, 0x97, 0x2d, 0xa7, 0x8d,
0x2f, 0x5c, 0x05, 0x7b, 0xaa, 0x44, 0xe8, 0x5e, 0xb8, 0x33, 0xcb, 0x2e, 0xcc, 0x02, 0xe6, 0x07,
0xb0, 0xa8, 0xf1, 0x79, 0xdc, 0x1b, 0xf1, 0x73, 0xa1, 0x54, 0xda, 0x50, 0xe0, 0x3c, 0x3e, 0xe2,
0xe7, 0xc2, 0x7e, 0x01, 0xcb, 0x4a, 0x51, 0x2f, 0x43, 0xae, 0xa7, 0xfe, 0x3c, 0x1f, 0x33, 0x65,
0x5a, 0x5a, 0x51, 0x67, 0xc4, 0x04, 0x68, 0xd9, 0x40, 0x6a, 0x7f, 0x0d, 0x4c, 0xf5, 0xee, 0x8f,
0x82, 0x98, 0x2b, 0x79, 0xf7, 0xa1, 0xd1, 0x1f, 0x05, 0x71, 0x1e, 0xc4, 0x29, 0x1a, 0x81, 0xb8,
0x36, 0x54, 0xe2, 0x49, 0xbf, 0x8f, 0xce, 0x27, 0xd3, 0x9a, 0x6e, 0xda, 0x7f, 0x61, 0xc1, 0x0a,
0x09, 0xd3, 0xce, 0x9e, 0xe0, 0x83, 0xff, 0xe7, 0x22, 0x93, 0xab, 0xc4, 0xc8, 0x1b, 0x7b, 0x3a,
0xb5, 0xd1, 0x55, 0xe2, 0x08, 0x09, 0x78, 0x4e, 0xcf, 0x83, 0xa8, 0xcf, 0x49, 0x5f, 0x55, 0x47,
0x36, 0xec, 0x7f, 0xb3, 0x60, 0x99, 0x96, 0xd1, 0x15, 0xae, 0x98, 0xc4, 0x6a, 0x67, 0x3f, 0x85,
0x26, 0xee, 0x82, 0xeb, 0xf3, 0xab, 0x16, 0xb1, 0x9a, 0x78, 0x13, 0x51, 0x25, 0xf3, 0xe1, 0x2d,
0x87, 0xd4, 0xc0, 0x15, 0x95, 0xfd, 0x0c, 0x1a, 0xe6, 0xed, 0x49, 0xa1, 0xe3, 0xdb, 0x7a, 0x03,
0x33, 0x47, 0x82, 0x04, 0x18, 0x54, 0xf6, 0x25, 0x00, 0xa5, 0x2d, 0x92, 0x4a, 0xcb, 0x35, 0x86,
0xcf, 0x98, 0xe1, 0xf0, 0x96, 0x53, 0x43, 0x76, 0x22, 0x3d, 0xae, 0xc2, 0x82, 0x0c, 0xec, 0xf6,
0x87, 0xd0, 0xcc, 0xac, 0x33, 0x83, 0xd1, 0x1a, 0x0a, 0xa3, 0xfd, 0x97, 0x05, 0x0c, 0x4f, 0x48,
0xce, 0x08, 0x0f, 0x60, 0x51, 0xb8, 0xd1, 0x90, 0x8b, 0x5e, 0x16, 0x66, 0x34, 0x24, 0xf5, 0x44,
0x46, 0x56, 0x4c, 0x24, 0xc1, 0x20, 0x49, 0xd3, 0x05, 0x92, 0x0b, 0x48, 0x52, 0xa1, 0xe1, 0x63,
0x60, 0x06, 0x83, 0xbe, 0xbb, 0xc8, 0x28, 0xdc, 0x4a, 0xf9, 0xd4, 0xd5, 0x65, 0x07, 0x56, 0x65,
0xe2, 0xd5, 0xb0, 0x5f, 0x81, 0x14, 0x99, 0xa0, 0x19, 0xf5, 0x3d, 0x95, 0x5d, 0x12, 0x23, 0x63,
0x9c, 0x0d, 0x27, 0x78, 0x29, 0x72, 0x85, 0xca, 0xd2, 0x15, 0x6c, 0x77, 0x5d, 0xa1, 0xa3, 0x03,
0xb9, 0x89, 0xf2, 0xfe, 0xaa, 0xf6, 0x10, 0xfb, 0x5f, 0x2d, 0x68, 0xe1, 0xae, 0x33, 0x36, 0xff,
0x02, 0xe8, 0x38, 0xbd, 0xa3, 0xc9, 0xeb, 0xc8, 0xfb, 0x3b, 0xb3, 0xf8, 0x67, 0x40, 0x26, 0xec,
0x05, 0x21, 0xf7, 0x95, 0xc1, 0xdb, 0x59, 0x83, 0xa7, 0x6e, 0x7c, 0x78, 0x4b, 0xe6, 0x45, 0xa4,
0x18, 0xe6, 0x7e, 0x02, 0x6b, 0xd9, 0x88, 0xaa, 0x6d, 0xf9, 0x31, 0x2c, 0xc4, 0xb4, 0x4f, 0x05,
0xb9, 0x57, 0xb3, 0x82, 0xa5, 0x0e, 0x1c, 0xc5, 0x63, 0xff, 0x65, 0x11, 0xd6, 0xf3, 0x72, 0x54,
0x46, 0x78, 0x05, 0xad, 0x99, 0x70, 0x2e, 0xb3, 0xcc, 0xc7, 0x59, 0x25, 0xe5, 0x06, 0xe6, 0xc9,
0x4b, 0x61, 0x36, 0xf2, 0x77, 0xfe, 0xb6, 0x00, 0x8b, 0x59, 0x1e, 0x0c, 0x2d, 0x49, 0xf6, 0x49,
0x53, 0x4f, 0x5d, 0xd3, 0xbe, 0x7a, 0x57, 0x04, 0x68, 0x02, 0xbd, 0xe2, 0x0f, 0x01, 0xbd, 0xd2,
0x3b, 0x01, 0xbd, 0xf2, 0x3c, 0xa0, 0x97, 0x0f, 0x85, 0xf2, 0xce, 0x9d, 0x09, 0x85, 0xa9, 0x1d,
0x2a, 0xef, 0x60, 0x87, 0x2f, 0x60, 0xf5, 0x95, 0x3b, 0x1a, 0x71, 0xa1, 0x66, 0xd0, 0xd6, 0xbc,
0x0f, 0x8d, 0x2b, 0x79, 0x61, 0xe9, 0x05, 0xfe, 0x68, 0xaa, 0xb0, 0x7d, 0x5d, 0xd1, 0x5e, 0xfa,
0xa3, 0xa9, 0xfd, 0x09, 0xac, 0xe5, 0x86, 0xa6, 0xb7, 0x17, 0xbd, 0x09, 0x8b, 0x6a, 0x3e, 0xba,
0x69, 0x6f, 0xc0, 0x9a, 0x5a, 0x46, 0x76, 0x3a, 0x7b, 0x17, 0xd6, 0xf3, 0x1d, 0xf3, 0x85, 0x15,
0x53, 0x61, 0x5f, 0x40, 0x43, 0x96, 0x00, 0xd4, 0x92, 0x6f, 0x84, 0x6c, 0xaa, 0x20, 0x52, 0x48,
0x0a, 0x22, 0xf6, 0x1b, 0x28, 0x1e, 0x06, 0xa1, 0x89, 0xdb, 0xad, 0x0c, 0x6e, 0x57, 0x36, 0xef,
0x25, 0x36, 0x95, 0x63, 0xc9, 0xe6, 0xfb, 0xda, 0xae, 0x0f, 0x60, 0xd1, 0x1d, 0x0b, 0x4c, 0xdb,
0xe7, 0x41, 0x74, 0xe5, 0x46, 0x03, 0x65, 0xf9, 0x86, 0x3b, 0x16, 0xa7, 0xc1, 0x53, 0x49, 0xc3,
0xc9, 0xcf, 0xb9, 0xb6, 0x39, 0x7e, 0xda, 0x7f, 0x65, 0x41, 0x99, 0x16, 0x8e, 0xb9, 0x5f, 0x22,
0x6b, 0x99, 0x4f, 0xf0, 0x3a, 0x64, 0x51, 0x08, 0x69, 0x12, 0x19, 0x11, 0x19, 0xdd, 0x89, 0xb2,
0xd5, 0xa9, 0x42, 0xae, 0x3a, 0x85, 0x31, 0x48, 0x76, 0xa7, 0x65, 0x9f, 0x2a, 0x11, 0xf6, 0xc6,
0x82, 0xbd, 0x0f, 0xa5, 0x8b, 0x20, 0x44, 0x7c, 0x83, 0x1e, 0x04, 0x1a, 0x5b, 0x07, 0xa1, 0x43,
0x74, 0xfb, 0x11, 0x2c, 0x1d, 0x07, 0x03, 0x6e, 0xc0, 0xb4, 0x1b, 0x15, 0x69, 0xff, 0x1a, 0xaa,
0x9a, 0x97, 0x6d, 0x42, 0x09, 0x23, 0x6b, 0x2e, 0x7c, 0x25, 0x57, 0x4e, 0xe4, 0x73, 0x88, 0x03,
0x8f, 0x12, 0x85, 0x48, 0xed, 0xcb, 0x05, 0x89, 0x91, 0x30, 0x4a, 0x6a, 0x8c, 0xf5, 0x23, 0x58,
0x94, 0x3b, 0xc8, 0x39, 0x91, 0xd4, 0x83, 0xd6, 0xb8, 0x3d, 0x85, 0x66, 0x66, 0x02, 0xcc, 0x0c,
0x23, 0x37, 0x16, 0xea, 0x8e, 0xa1, 0x94, 0x07, 0x48, 0x52, 0xc1, 0xd6, 0xd8, 0x4a, 0x21, 0x73,
0x26, 0x6e, 0x46, 0xeb, 0x09, 0xce, 0x2c, 0x19, 0x38, 0xd3, 0xfe, 0x07, 0x0b, 0x9a, 0x68, 0x34,
0xcf, 0x1f, 0x9e, 0x04, 0x23, 0xaf, 0x3f, 0x25, 0xe3, 0x69, 0xb3, 0xe1, 0xd5, 0x53, 0xb8, 0x89,
0xf1, 0x94, 0xdd, 0x0e, 0x90, 0x88, 0xc9, 0x63, 0xec, 0xf9, 0x74, 0xc3, 0x51, 0xa6, 0xab, 0x8c,
0x3d, 0x1f, 0xef, 0x33, 0xcc, 0x86, 0xe6, 0x39, 0x47, 0x8f, 0x8f, 0x79, 0x6f, 0x8c, 0xc9, 0x45,
0xee, 0xba, 0x7e, 0xce, 0xf9, 0x63, 0x37, 0xe6, 0x2f, 0x62, 0x57, 0xb0, 0xdf, 0x83, 0x15, 0xe4,
0x89, 0x5c, 0xc1, 0x7b, 0x63, 0x6f, 0x34, 0xf2, 0x24, 0xa7, 0x3c, 0x4f, 0xad, 0x73, 0xce, 0x1d,
0x57, 0xf0, 0x17, 0xd8, 0x81, 0xec, 0xf6, 0x3f, 0x15, 0xa0, 0xae, 0xd4, 0xfa, 0x64, 0x30, 0xe4,
0x78, 0x74, 0x74, 0xf4, 0x4a, 0x4e, 0x79, 0x4d, 0x51, 0x9e, 0x0f, 0x74, 0x77, 0x26, 0xb2, 0x51,
0xb7, 0x0c, 0x6b, 0x39, 0xfd, 0x16, 0x67, 0xf4, 0x8b, 0xe9, 0x2f, 0x18, 0xf0, 0x4f, 0x30, 0xf5,
0x2a, 0x85, 0x55, 0x89, 0x70, 0x32, 0x39, 0xd3, 0x9d, 0xbb, 0xd4, 0x59, 0x4e, 0x3b, 0x77, 0xb1,
0xd3, 0x8c, 0x98, 0x0b, 0xb9, 0x88, 0xf9, 0x19, 0x34, 0x94, 0x54, 0x52, 0x35, 0x05, 0xb2, 0xf4,
0x8c, 0x65, 0xcc, 0xe0, 0xd4, 0xe5, 0x74, 0xd2, 0x26, 0x6a, 0xe0, 0xae, 0x1e, 0x58, 0xfd, 0xa1,
0x81, 0xbb, 0xb2, 0x81, 0x17, 0x4b, 0xa5, 0xb5, 0x67, 0x91, 0x1b, 0x5e, 0xe8, 0xb0, 0x34, 0x48,
0xca, 0x89, 0x44, 0x66, 0x8f, 0xa0, 0x8c, 0xa3, 0x74, 0x3e, 0x9a, 0x7f, 0xea, 0x25, 0x0b, 0xdb,
0x84, 0x32, 0x1f, 0x0c, 0xc9, 0x5f, 0xcd, 0xe2, 0xaf, 0x61, 0x1c, 0x47, 0x32, 0xa0, 0x0b, 0x22,
0x35, 0xe7, 0x82, 0x73, 0x23, 0x93, 0xbd, 0x0a, 0xec, 0x98, 0x8b, 0xab, 0x20, 0x7a, 0x6d, 0x5e,
0xac, 0xfe, 0xbb, 0x00, 0x75, 0x83, 0x8c, 0xfe, 0x34, 0xc4, 0x05, 0xf7, 0x06, 0x9e, 0x3b, 0xe6,
0x82, 0x47, 0xfa, 0x68, 0x12, 0xf5, 0x40, 0x11, 0x29, 0x82, 0x5d, 0x0e, 0x7b, 0xc1, 0x44, 0xf4,
0x06, 0x7c, 0x18, 0x71, 0xae, 0x6a, 0xf4, 0x0d, 0xf7, 0x72, 0xf8, 0x72, 0x22, 0x0e, 0x88, 0x86,
0x5c, 0x63, 0xf7, 0xda, 0xe4, 0x52, 0x37, 0x81, 0xb1, 0x7b, 0x9d, 0x72, 0x29, 0x20, 0x24, 0xd5,
0x53, 0x4a, 0x80, 0xd0, 0x31, 0xe9, 0x22, 0x1f, 0x02, 0xca, 0xb3, 0x21, 0xe0, 0x0f, 0x60, 0x5d,
0x86, 0x00, 0x5f, 0xee, 0xa3, 0x97, 0x3b, 0x1d, 0xab, 0xd4, 0xab, 0x36, 0x99, 0xc4, 0xe0, 0x4d,
0x68, 0xe1, 0x0e, 0xf4, 0x11, 0x8f, 0xbd, 0xef, 0x64, 0xdd, 0xc3, 0x72, 0x70, 0x67, 0x3a, 0xe5,
0x79, 0xdf, 0x71, 0xe4, 0x44, 0x37, 0xcc, 0x70, 0xca, 0x92, 0xc7, 0xe2, 0xd8, 0xf3, 0xf3, 0x9c,
0xee, 0x75, 0x96, 0xb3, 0xa6, 0x38, 0xdd, 0x6b, 0x83, 0xd3, 0xde, 0x82, 0xa5, 0x2e, 0x17, 0x7b,
0x18, 0x20, 0xb4, 0xe1, 0x50, 0x0d, 0xfc, 0xaa, 0x27, 0x23, 0x88, 0xa5, 0xce, 0x3c, 0xbf, 0x22,
0x1e, 0xbc, 0x5d, 0xa7, 0xfc, 0x32, 0xbf, 0xd9, 0x7f, 0x5d, 0x80, 0xca, 0x73, 0xff, 0x32, 0xf0,
0xfa, 0x84, 0x9c, 0xc7, 0x7c, 0x1c, 0xe8, 0xea, 0x26, 0x7e, 0x63, 0xa0, 0xa2, 0x72, 0x4b, 0x28,
0x14, 0xf0, 0xd5, 0x4d, 0xf4, 0xdd, 0x28, 0xad, 0xa1, 0xcb, 0x3a, 0x5a, 0x2d, 0x4a, 0xaa, 0xe7,
0x6b, 0xb0, 0x10, 0x99, 0xe5, 0xfe, 0x72, 0x44, 0xf7, 0xcd, 0xa4, 0xb0, 0x5b, 0x36, 0x0a, 0xbb,
0x74, 0x7f, 0x92, 0x55, 0x22, 0x52, 0x37, 0xde, 0x9f, 0x64, 0x93, 0x52, 0x61, 0xc4, 0x55, 0x81,
0x0d, 0x83, 0x40, 0x45, 0xa5, 0x42, 0x45, 0x3c, 0xc0, 0x30, 0xf0, 0x01, 0xd4, 0x25, 0xbf, 0x64,
0x91, 0x7a, 0x05, 0x49, 0x22, 0x86, 0x39, 0xcf, 0x05, 0xb5, 0xb9, 0xcf, 0x05, 0xa7, 0xc0, 0xf6,
0x06, 0x03, 0xa5, 0x90, 0x04, 0x04, 0xa4, 0x7b, 0xb1, 0xcc, 0xbd, 0xcc, 0x91, 0x5a, 0x98, 0x2b,
0xf5, 0x31, 0xd4, 0x4f, 0x8c, 0xc7, 0x8e, 0xbb, 0xa8, 0x39, 0xfd, 0xcc, 0xa1, 0xad, 0x14, 0xa9,
0xd7, 0x0d, 0x63, 0xb2, 0x82, 0x31, 0x99, 0xfd, 0x19, 0xb0, 0x23, 0x2f, 0x16, 0xc9, 0xd2, 0x12,
0x9c, 0xa4, 0xc1, 0xaa, 0x89, 0x93, 0x14, 0x8d, 0x70, 0xd2, 0x9e, 0x2c, 0x5a, 0xe5, 0xf7, 0xf4,
0x08, 0xaa, 0x9e, 0x24, 0xe9, 0x70, 0xb2, 0xa8, 0x42, 0x84, 0xe6, 0x4c, 0xfa, 0x31, 0x3c, 0x29,
0x62, 0x77, 0x72, 0x16, 0xf7, 0x23, 0x2f, 0x44, 0xd5, 0xdb, 0x7f, 0x63, 0x41, 0x45, 0xed, 0x6b,
0xe6, 0x8d, 0x47, 0x21, 0x59, 0xf3, 0x8d, 0x67, 0x6e, 0x4d, 0x7f, 0xd6, 0xc0, 0xc5, 0x39, 0x06,
0x66, 0x50, 0x0a, 0x5d, 0x71, 0x41, 0x28, 0xa2, 0xe6, 0xd0, 0xb7, 0x46, 0x36, 0xe5, 0x14, 0xd9,
0xa8, 0xf2, 0x9c, 0x5a, 0x52, 0x9c, 0x6a, 0x7f, 0x35, 0x4b, 0x4e, 0x35, 0xa0, 0x96, 0x97, 0xd7,
0x80, 0x62, 0x75, 0x92, 0x7e, 0xbb, 0x03, 0xed, 0x03, 0x3e, 0xe2, 0x82, 0xef, 0x8d, 0x46, 0x79,
0xf9, 0x77, 0xe0, 0xf6, 0x9c, 0x3e, 0xe5, 0x5f, 0x4f, 0x61, 0xf9, 0x80, 0x9f, 0x4d, 0x86, 0x47,
0xfc, 0x32, 0xbd, 0xab, 0x30, 0x28, 0xc5, 0x17, 0xc1, 0x95, 0xb2, 0x16, 0x7d, 0xa3, 0x3b, 0x8d,
0x90, 0xa7, 0x17, 0x87, 0xbc, 0xaf, 0x53, 0x21, 0x51, 0xba, 0x21, 0xef, 0xdb, 0x7f, 0x08, 0xcc,
0x94, 0xa3, 0xb6, 0x80, 0x07, 0x7f, 0x72, 0xd6, 0x8b, 0xa7, 0xb1, 0xe0, 0x63, 0xed, 0xf0, 0x10,
0x4f, 0xce, 0xba, 0x92, 0x62, 0x3f, 0x84, 0xc6, 0x89, 0x3b, 0x75, 0xf8, 0xb7, 0xea, 0xf2, 0x89,
0x80, 0xc4, 0x9d, 0xe2, 0x71, 0x4d, 0xb0, 0x15, 0x75, 0xdb, 0x21, 0x2c, 0x48, 0x46, 0x76, 0x4f,
0x3e, 0xf0, 0x79, 0xbe, 0xbc, 0xe4, 0x29, 0x43, 0x1a, 0xa4, 0x19, 0x5b, 0x17, 0x66, 0x6d, 0xad,
0x22, 0xae, 0x2e, 0xd9, 0x6a, 0x64, 0xe1, 0x4f, 0xc6, 0xba, 0x4e, 0xfb, 0x68, 0x17, 0x9a, 0x99,
0x3b, 0x01, 0xab, 0x40, 0x71, 0xef, 0xe8, 0xa8, 0x75, 0x8b, 0xd5, 0xa1, 0xf2, 0xf2, 0xe4, 0xc9,
0xf1, 0xf3, 0xe3, 0x67, 0x2d, 0x0b, 0x1b, 0xfb, 0x47, 0x2f, 0xbb, 0xd8, 0x28, 0xec, 0xfe, 0xfb,
0x3a, 0xd4, 0x92, 0x6c, 0xc7, 0x7e, 0x05, 0xcd, 0xcc, 0x0d, 0x80, 0xdd, 0x51, 0xf6, 0x9b, 0x77,
0xa5, 0xe8, 0xdc, 0x9d, 0xdf, 0xa9, 0xec, 0xf4, 0xfe, 0x9f, 0xff, 0xf6, 0x3f, 0xfe, 0xae, 0xd0,
0x66, 0xeb, 0xdb, 0x97, 0x9f, 0x6c, 0x2b, 0x88, 0xbf, 0x4d, 0x05, 0x29, 0x2a, 0x8a, 0xb1, 0xd7,
0xb0, 0x98, 0xbd, 0x21, 0xb0, 0xbb, 0xd9, 0x8c, 0x9a, 0x9b, 0xed, 0xbd, 0x1b, 0x7a, 0xd5, 0x74,
0x77, 0x69, 0xba, 0x75, 0xb6, 0x6a, 0x4e, 0xa7, 0xf3, 0x13, 0xe3, 0x54, 0xa7, 0x34, 0xdf, 0x7b,
0x99, 0x96, 0x37, 0xff, 0x1d, 0xb8, 0x73, 0x7b, 0xf6, 0x6d, 0x57, 0x3d, 0x06, 0xdb, 0x6d, 0x9a,
0x8a, 0xb1, 0x16, 0x4e, 0x65, 0x3e, 0xf7, 0xb2, 0x5f, 0x42, 0x2d, 0x79, 0xe2, 0x62, 0x1b, 0xc6,
0x83, 0x9e, 0xf9, 0x68, 0xd6, 0x69, 0xcf, 0x76, 0xa8, 0x4d, 0xdc, 0x21, 0xc9, 0x6b, 0xf6, 0x8c,
0xe4, 0x2f, 0xad, 0x47, 0xec, 0x08, 0xd6, 0x54, 0xb0, 0x38, 0xe3, 0xff, 0x97, 0x9d, 0xcc, 0x79,
0xa5, 0xde, 0xb1, 0xd8, 0x4f, 0xa1, 0xaa, 0x5f, 0xfd, 0xd8, 0xfa, 0xfc, 0xa7, 0xc7, 0xce, 0xc6,
0x0c, 0x5d, 0x79, 0xc9, 0x1e, 0x40, 0xfa, 0xc8, 0xc5, 0xda, 0x37, 0xbd, 0xc5, 0x25, 0x4a, 0x9c,
0xf3, 0x22, 0x36, 0xa4, 0x37, 0xbe, 0xec, 0x1b, 0x1a, 0xfb, 0x20, 0xe5, 0x9f, 0xfb, 0xba, 0xf6,
0x3d, 0x02, 0xed, 0x75, 0xd2, 0x5d, 0x8b, 0x2d, 0xa2, 0xee, 0x7c, 0x7e, 0xa5, 0xe1, 0xff, 0x2f,
0xa0, 0x6e, 0xbc, 0x84, 0x31, 0xa3, 0xb8, 0x92, 0x7b, 0x74, 0xeb, 0x74, 0xe6, 0x75, 0x29, 0xe9,
0xab, 0x24, 0x7d, 0xd1, 0xae, 0xa1, 0x74, 0x2a, 0x1d, 0xa3, 0x49, 0xbe, 0x46, 0xe7, 0x51, 0x95,
0x74, 0x96, 0xbe, 0xd2, 0x65, 0xeb, 0xed, 0x89, 0xbd, 0x67, 0x8a, 0xee, 0xf6, 0x32, 0x49, 0xad,
0xb3, 0x54, 0x2a, 0x7b, 0x01, 0x15, 0x55, 0x51, 0x67, 0x6b, 0xa9, 0x5d, 0x0d, 0x6c, 0xd8, 0x59,
0xcf, 0x93, 0x95, 0xb0, 0x15, 0x12, 0xd6, 0x64, 0x75, 0x14, 0x36, 0xe4, 0xc2, 0x43, 0x19, 0x23,
0x58, 0xca, 0xd7, 0xcb, 0xef, 0xde, 0x50, 0x74, 0xc9, 0xba, 0xd9, 0xfc, 0x92, 0x4c, 0xd6, 0xcd,
0xb4, 0x7b, 0x6d, 0xab, 0xec, 0xc8, 0xfe, 0x14, 0x1a, 0xe6, 0xbb, 0x0d, 0xeb, 0x18, 0x3b, 0xcf,
0xbd, 0xf1, 0x74, 0xee, 0xcc, 0xed, 0xcb, 0xaa, 0x9b, 0x35, 0xcc, 0x69, 0xd8, 0x2f, 0x60, 0xc9,
0xa8, 0x39, 0x76, 0xa7, 0x7e, 0x3f, 0x31, 0xe7, 0x6c, 0x2d, 0xb2, 0x33, 0xaf, 0xf2, 0x6b, 0x6f,
0x90, 0xe0, 0x65, 0x3b, 0x23, 0x18, 0x4d, 0xb9, 0x0f, 0x75, 0x43, 0xc6, 0xf7, 0xc9, 0xdd, 0x30,
0xba, 0xcc, 0x42, 0xe0, 0x8e, 0xc5, 0x7e, 0x63, 0x41, 0xc3, 0xac, 0x4d, 0x27, 0x0a, 0x98, 0x53,
0xb0, 0x4e, 0x8e, 0xc5, 0x4c, 0x15, 0xd9, 0xfe, 0x39, 0x2d, 0xf2, 0xe4, 0xd1, 0x71, 0x46, 0xc9,
0x6f, 0x32, 0x55, 0xab, 0x2d, 0xf3, 0x3f, 0x0e, 0x6f, 0xf3, 0x9d, 0xe6, 0xdf, 0x1a, 0xde, 0x6e,
0xbf, 0xa1, 0x92, 0xf5, 0xdb, 0x1d, 0x8b, 0x7d, 0x29, 0xff, 0x8e, 0xa2, 0x31, 0x06, 0x33, 0x1c,
0x3c, 0xaf, 0x36, 0xf3, 0x4f, 0x1e, 0x9b, 0xd6, 0x8e, 0xc5, 0xfe, 0x4c, 0xfe, 0x93, 0x41, 0x8d,
0x25, 0xed, 0xbf, 0xeb, 0x78, 0xfb, 0x01, 0xed, 0xe8, 0x7d, 0xfb, 0x76, 0x66, 0x47, 0xf9, 0x08,
0x77, 0x02, 0x90, 0x62, 0x45, 0x96, 0x43, 0x4f, 0x89, 0xef, 0xcf, 0xc2, 0xc9, 0xac, 0x55, 0x35,
0xc8, 0x42, 0x89, 0xbf, 0x92, 0x07, 0x52, 0xf1, 0xc7, 0x89, 0x59, 0x67, 0x81, 0x5f, 0xa7, 0x33,
0xaf, 0x4b, 0xc9, 0xff, 0x90, 0xe4, 0xbf, 0xc7, 0xee, 0x98, 0xf2, 0xb7, 0xdf, 0x98, 0x40, 0xf1,
0x2d, 0xfb, 0x39, 0x34, 0x8f, 0x82, 0xe0, 0xf5, 0x24, 0x4c, 0xd0, 0x7f, 0x16, 0xfc, 0x60, 0x1a,
0xef, 0xe4, 0x36, 0x65, 0xdf, 0x27, 0xc9, 0x77, 0xd8, 0xed, 0xac, 0xe4, 0x14, 0xcd, 0xbe, 0x65,
0x2e, 0x2c, 0x27, 0x71, 0x3f, 0xd9, 0x48, 0x27, 0x2b, 0xc7, 0x44, 0x91, 0x33, 0x73, 0x64, 0x32,
0x71, 0x32, 0x47, 0xac, 0x65, 0xee, 0x58, 0xec, 0x04, 0x1a, 0x07, 0xbc, 0x1f, 0x0c, 0xb8, 0x42,
0x2c, 0x2b, 0xe9, 0xca, 0x13, 0xa4, 0xd3, 0x69, 0x66, 0x88, 0xd9, 0x48, 0x10, 0xba, 0xd3, 0x88,
0x7f, 0xbb, 0xfd, 0x46, 0x41, 0xa1, 0xb7, 0x3a, 0x12, 0x68, 0xf4, 0x96, 0x89, 0x04, 0x39, 0xb8,
0x97, 0x89, 0x04, 0x33, 0x70, 0x2f, 0x13, 0x09, 0x34, 0x7a, 0x64, 0x23, 0x04, 0x81, 0x39, 0x84,
0x98, 0x64, 0x8f, 0x9b, 0x70, 0x65, 0xe7, 0xde, 0xcd, 0x0c, 0xd9, 0xd9, 0x1e, 0x65, 0x67, 0xeb,
0x42, 0xf3, 0x80, 0x4b, 0x65, 0xc9, 0xb2, 0x41, 0x27, 0x1b, 0x5a, 0xcc, 0x12, 0x43, 0x3e, 0xec,
0x50, 0x5f, 0x36, 0xd0, 0xd3, 0x9d, 0x9d, 0xfd, 0x12, 0xea, 0xcf, 0xb8, 0xd0, 0x75, 0x82, 0x24,
0x07, 0xe7, 0x0a, 0x07, 0x9d, 0x39, 0x65, 0x06, 0xfb, 0x1e, 0x49, 0xeb, 0xb0, 0x76, 0x22, 0x6d,
0x9b, 0x0f, 0x86, 0x5c, 0x06, 0x81, 0x9e, 0x37, 0x78, 0xcb, 0xfe, 0x98, 0x84, 0x27, 0xb5, 0x3d,
0x2d, 0x3c, 0x57, 0x18, 0xec, 0x2c, 0xe5, 0xe8, 0xf3, 0x24, 0xfb, 0xc1, 0x80, 0x6f, 0xbf, 0x51,
0x45, 0x37, 0x94, 0x0c, 0x5f, 0x4f, 0x78, 0x34, 0x95, 0x05, 0xcf, 0x95, 0xcc, 0x5f, 0xb7, 0x94,
0xd4, 0xcc, 0xff, 0xb9, 0xec, 0x87, 0x24, 0xf2, 0x3e, 0xfb, 0x20, 0x15, 0x49, 0x7f, 0xfe, 0x4a,
0x65, 0x6e, 0xbf, 0x71, 0xc7, 0xe2, 0x2d, 0x7b, 0x45, 0xcf, 0xcb, 0x66, 0xd5, 0x23, 0xcd, 0xf6,
0xf9, 0x02, 0x49, 0xa2, 0x16, 0xa3, 0x2b, 0x8b, 0x00, 0xe4, 0x4c, 0x94, 0x03, 0x09, 0xea, 0xc8,
0x5b, 0xba, 0x01, 0x75, 0x32, 0xd7, 0x7c, 0x03, 0xea, 0x64, 0xaf, 0xf3, 0x08, 0x75, 0xd2, 0x6b,
0x42, 0x02, 0x75, 0x66, 0x6e, 0x20, 0x49, 0x74, 0x9a, 0xbd, 0x53, 0x9c, 0x2d, 0xd0, 0x3f, 0x2c,
0x7f, 0xff, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x73, 0x71, 0xf9, 0x93, 0x29, 0x00, 0x00,
}

View File

@ -372,18 +372,16 @@ message PendingChannelRequest {
}
message PendingChannelResponse {
message PendingChannel {
int32 peer_id = 1;
string identity_key = 1;
string channel_point = 2;
string identity_key = 2;
string channel_point = 3;
int64 capacity = 3;
int64 local_balance = 4;
int64 remote_balance = 5;
int64 capacity = 4;
int64 local_balance = 5;
int64 remote_balance = 6;
string closing_txid = 6;
string closing_txid = 7;
ChannelStatus status = 8;
ChannelStatus status = 7;
}
repeated PendingChannel pending_channels = 1;

View File

@ -89,6 +89,7 @@
},
"/v1/channels/pending": {
"get": {
"summary": "TODO(roasbeef): merge with below with bool?",
"operationId": "PendingChannels",
"responses": {
"200": {
@ -131,7 +132,6 @@
},
"/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}/{force}": {
"delete": {
"summary": "TODO(roasbeef): merge with below with bool?",
"operationId": "CloseChannel",
"responses": {
"200": {
@ -544,37 +544,42 @@
}
},
"definitions": {
"NewAddressRequestAddressType": {
"type": "string",
"enum": [
"WITNESS_PUBKEY_HASH",
"NESTED_PUBKEY_HASH",
"PUBKEY_HASH"
],
"default": "WITNESS_PUBKEY_HASH"
},
"PendingChannelResponsePendingChannel": {
"type": "object",
"properties": {
"capacity": {
"identity_key": {
"type": "string",
"format": "int64"
"format": "string"
},
"channel_point": {
"type": "string",
"format": "string"
},
"closing_txid": {
"capacity": {
"type": "string",
"format": "string"
},
"identity_key": {
"type": "string",
"format": "string"
"format": "int64"
},
"local_balance": {
"type": "string",
"format": "int64"
},
"peer_id": {
"type": "integer",
"format": "int32"
},
"remote_balance": {
"type": "string",
"format": "int64"
},
"closing_txid": {
"type": "string",
"format": "string"
},
"status": {
"$ref": "#/definitions/lnrpcChannelStatus"
}
@ -583,22 +588,42 @@
"lnrpcActiveChannel": {
"type": "object",
"properties": {
"capacity": {
"remote_pubkey": {
"type": "string",
"format": "int64"
},
"chan_id": {
"type": "string",
"format": "uint64"
"format": "string"
},
"channel_point": {
"type": "string",
"format": "string"
},
"chan_id": {
"type": "string",
"format": "uint64"
},
"capacity": {
"type": "string",
"format": "int64"
},
"local_balance": {
"type": "string",
"format": "int64"
},
"remote_balance": {
"type": "string",
"format": "int64"
},
"unsettled_balance": {
"type": "string",
"format": "int64"
},
"total_satoshis_sent": {
"type": "string",
"format": "int64"
},
"total_satoshis_received": {
"type": "string",
"format": "int64"
},
"num_updates": {
"type": "string",
"format": "uint64"
@ -608,39 +633,19 @@
"items": {
"$ref": "#/definitions/lnrpcHTLC"
}
},
"remote_balance": {
"type": "string",
"format": "int64"
},
"remote_pubkey": {
"type": "string",
"format": "string"
},
"total_satoshis_received": {
"type": "string",
"format": "int64"
},
"total_satoshis_sent": {
"type": "string",
"format": "int64"
},
"unsettled_balance": {
"type": "string",
"format": "int64"
}
}
},
"lnrpcAddInvoiceResponse": {
"type": "object",
"properties": {
"payment_request": {
"type": "string",
"format": "string"
},
"r_hash": {
"type": "string",
"format": "byte"
},
"payment_request": {
"type": "string",
"format": "string"
}
}
},
@ -681,58 +686,66 @@
"lnrpcChannelEdge": {
"type": "object",
"properties": {
"capacity": {
"channel_id": {
"type": "string",
"format": "int64"
"format": "uint64"
},
"chan_point": {
"type": "string",
"format": "string"
},
"channel_id": {
"type": "string",
"format": "uint64"
},
"last_update": {
"type": "integer",
"format": "int64"
},
"node1_policy": {
"$ref": "#/definitions/lnrpcRoutingPolicy"
},
"node1_pub": {
"type": "string",
"format": "string"
},
"node2_policy": {
"$ref": "#/definitions/lnrpcRoutingPolicy"
},
"node2_pub": {
"type": "string",
"format": "string"
},
"capacity": {
"type": "string",
"format": "int64"
},
"node1_policy": {
"$ref": "#/definitions/lnrpcRoutingPolicy"
},
"node2_policy": {
"$ref": "#/definitions/lnrpcRoutingPolicy"
}
}
},
"lnrpcChannelGraph": {
"type": "object",
"properties": {
"edges": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcChannelEdge"
}
},
"nodes": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcLightningNode"
}
},
"edges": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcChannelEdge"
}
}
}
},
"lnrpcChannelGraphRequest": {
"type": "object"
},
"lnrpcChannelOpenUpdate": {
"type": "object",
"properties": {
"channel_point": {
"$ref": "#/definitions/lnrpcChannelPoint"
}
}
},
"lnrpcChannelPoint": {
"type": "object",
"properties": {
@ -765,41 +778,41 @@
"channel_point": {
"$ref": "#/definitions/lnrpcChannelPoint"
},
"force": {
"type": "boolean",
"format": "boolean"
},
"time_limit": {
"type": "string",
"format": "int64"
},
"force": {
"type": "boolean",
"format": "boolean"
}
}
},
"lnrpcCloseStatusUpdate": {
"type": "object",
"properties": {
"chan_close": {
"$ref": "#/definitions/lnrpcChannelCloseUpdate"
},
"close_pending": {
"$ref": "#/definitions/lnrpcPendingUpdate"
},
"confirmation": {
"$ref": "#/definitions/lnrpcConfirmationUpdate"
},
"chan_close": {
"$ref": "#/definitions/lnrpcChannelCloseUpdate"
}
}
},
"lnrpcConfirmationUpdate": {
"type": "object",
"properties": {
"block_height": {
"type": "integer",
"format": "int32"
},
"block_sha": {
"type": "string",
"format": "byte"
},
"block_height": {
"type": "integer",
"format": "int32"
},
"num_confs_left": {
"type": "integer",
"format": "int64"
@ -827,6 +840,28 @@
}
}
},
"lnrpcDebugLevelRequest": {
"type": "object",
"properties": {
"show": {
"type": "boolean",
"format": "boolean"
},
"level_spec": {
"type": "string",
"format": "string"
}
}
},
"lnrpcDebugLevelResponse": {
"type": "object",
"properties": {
"sub_systems": {
"type": "string",
"format": "string"
}
}
},
"lnrpcDeleteAllPaymentsRequest": {
"type": "object"
},
@ -839,22 +874,18 @@
"lnrpcGetInfoResponse": {
"type": "object",
"properties": {
"identity_pubkey": {
"type": "string",
"format": "string"
},
"alias": {
"type": "string",
"format": "string"
},
"block_hash": {
"type": "string",
"format": "string"
},
"block_height": {
"num_pending_channels": {
"type": "integer",
"format": "int64"
},
"identity_pubkey": {
"type": "string",
"format": "string"
},
"num_active_channels": {
"type": "integer",
"format": "int64"
@ -863,10 +894,14 @@
"type": "integer",
"format": "int64"
},
"num_pending_channels": {
"block_height": {
"type": "integer",
"format": "int64"
},
"block_hash": {
"type": "string",
"format": "string"
},
"synced_to_chain": {
"type": "boolean",
"format": "boolean"
@ -883,21 +918,21 @@
"lnrpcHTLC": {
"type": "object",
"properties": {
"incoming": {
"type": "boolean",
"format": "boolean"
},
"amount": {
"type": "string",
"format": "int64"
},
"expiration_height": {
"type": "integer",
"format": "int64"
},
"hash_lock": {
"type": "string",
"format": "byte"
},
"incoming": {
"type": "boolean",
"format": "boolean"
"expiration_height": {
"type": "integer",
"format": "int64"
},
"revocation_delay": {
"type": "integer",
@ -908,17 +943,17 @@
"lnrpcHop": {
"type": "object",
"properties": {
"amt_to_forward": {
"chan_id": {
"type": "string",
"format": "int64"
"format": "uint64"
},
"chan_capacity": {
"type": "string",
"format": "int64"
},
"chan_id": {
"amt_to_forward": {
"type": "string",
"format": "uint64"
"format": "int64"
},
"fee": {
"type": "string",
@ -929,19 +964,11 @@
"lnrpcInvoice": {
"type": "object",
"properties": {
"creation_date": {
"type": "string",
"format": "int64"
},
"memo": {
"type": "string",
"format": "string"
},
"payment_request": {
"type": "string",
"format": "string"
},
"r_hash": {
"receipt": {
"type": "string",
"format": "byte"
},
@ -949,11 +976,11 @@
"type": "string",
"format": "byte"
},
"receipt": {
"r_hash": {
"type": "string",
"format": "byte"
},
"settle_date": {
"value": {
"type": "string",
"format": "int64"
},
@ -961,9 +988,17 @@
"type": "boolean",
"format": "boolean"
},
"value": {
"creation_date": {
"type": "string",
"format": "int64"
},
"settle_date": {
"type": "string",
"format": "int64"
},
"payment_request": {
"type": "string",
"format": "string"
}
}
},
@ -973,11 +1008,11 @@
"lnrpcLightningAddress": {
"type": "object",
"properties": {
"host": {
"pubkey": {
"type": "string",
"format": "string"
},
"pubkey": {
"host": {
"type": "string",
"format": "string"
}
@ -986,14 +1021,6 @@
"lnrpcLightningNode": {
"type": "object",
"properties": {
"address": {
"type": "string",
"format": "string"
},
"alias": {
"type": "string",
"format": "string"
},
"last_update": {
"type": "integer",
"format": "int64"
@ -1001,6 +1028,14 @@
"pub_key": {
"type": "string",
"format": "string"
},
"address": {
"type": "string",
"format": "string"
},
"alias": {
"type": "string",
"format": "string"
}
}
},
@ -1069,47 +1104,55 @@
"lnrpcNetworkInfo": {
"type": "object",
"properties": {
"avg_channel_size": {
"type": "number",
"format": "double"
"graph_diameter": {
"type": "integer",
"format": "int64"
},
"avg_out_degree": {
"type": "number",
"format": "double"
},
"graph_diameter": {
"type": "integer",
"format": "int64"
},
"max_channel_size": {
"type": "string",
"format": "int64"
},
"max_out_degree": {
"type": "integer",
"format": "int64"
},
"min_channel_size": {
"type": "string",
"format": "int64"
},
"num_channels": {
"type": "integer",
"format": "int64"
},
"num_nodes": {
"type": "integer",
"format": "int64"
},
"num_channels": {
"type": "integer",
"format": "int64"
},
"total_network_capacity": {
"type": "string",
"format": "int64"
},
"avg_channel_size": {
"type": "number",
"format": "double"
},
"min_channel_size": {
"type": "string",
"format": "int64"
},
"max_channel_size": {
"type": "string",
"format": "int64"
}
}
},
"lnrpcNetworkInfoRequest": {
"type": "object"
},
"lnrpcNewAddressRequest": {
"type": "object",
"properties": {
"type": {
"$ref": "#/definitions/NewAddressRequestAddressType"
}
}
},
"lnrpcNewAddressResponse": {
"type": "object",
"properties": {
@ -1150,9 +1193,9 @@
"lnrpcOpenChannelRequest": {
"type": "object",
"properties": {
"local_funding_amount": {
"type": "string",
"format": "int64"
"target_peer_id": {
"type": "integer",
"format": "int32"
},
"node_pubkey": {
"type": "string",
@ -1162,17 +1205,31 @@
"type": "string",
"format": "string"
},
"num_confs": {
"type": "integer",
"local_funding_amount": {
"type": "string",
"format": "int64"
},
"push_sat": {
"type": "string",
"format": "int64"
},
"target_peer_id": {
"num_confs": {
"type": "integer",
"format": "int32"
"format": "int64"
}
}
},
"lnrpcOpenStatusUpdate": {
"type": "object",
"properties": {
"chan_pending": {
"$ref": "#/definitions/lnrpcPendingUpdate"
},
"confirmation": {
"$ref": "#/definitions/lnrpcConfirmationUpdate"
},
"chan_open": {
"$ref": "#/definitions/lnrpcChannelOpenUpdate"
}
}
},
@ -1183,13 +1240,13 @@
"type": "string",
"format": "string"
},
"num_satoshis": {
"type": "string",
"format": "int64"
},
"payment_hash": {
"type": "string",
"format": "string"
},
"num_satoshis": {
"type": "string",
"format": "int64"
}
}
},
@ -1205,11 +1262,15 @@
"lnrpcPayment": {
"type": "object",
"properties": {
"creation_date": {
"payment_hash": {
"type": "string",
"format": "string"
},
"value": {
"type": "string",
"format": "int64"
},
"fee": {
"creation_date": {
"type": "string",
"format": "int64"
},
@ -1220,11 +1281,7 @@
"format": "string"
}
},
"payment_hash": {
"type": "string",
"format": "string"
},
"value": {
"fee": {
"type": "string",
"format": "int64"
}
@ -1233,52 +1290,52 @@
"lnrpcPaymentHash": {
"type": "object",
"properties": {
"r_hash": {
"type": "string",
"format": "byte"
},
"r_hash_str": {
"type": "string",
"format": "string"
},
"r_hash": {
"type": "string",
"format": "byte"
}
}
},
"lnrpcPeer": {
"type": "object",
"properties": {
"address": {
"pub_key": {
"type": "string",
"format": "string"
},
"bytes_recv": {
"type": "string",
"format": "uint64"
},
"bytes_sent": {
"type": "string",
"format": "uint64"
},
"inbound": {
"type": "boolean",
"format": "boolean"
},
"peer_id": {
"type": "integer",
"format": "int32"
},
"ping_time": {
"type": "string",
"format": "int64"
},
"pub_key": {
"address": {
"type": "string",
"format": "string"
},
"bytes_sent": {
"type": "string",
"format": "uint64"
},
"bytes_recv": {
"type": "string",
"format": "uint64"
},
"sat_sent": {
"type": "string",
"format": "int64"
},
"sat_recv": {
"type": "string",
"format": "int64"
},
"sat_sent": {
"inbound": {
"type": "boolean",
"format": "boolean"
},
"ping_time": {
"type": "string",
"format": "int64"
}
@ -1315,56 +1372,56 @@
"lnrpcRoute": {
"type": "object",
"properties": {
"hops": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcHop"
}
},
"total_amt": {
"type": "string",
"total_time_lock": {
"type": "integer",
"format": "int64"
},
"total_fees": {
"type": "string",
"format": "int64"
},
"total_time_lock": {
"type": "integer",
"total_amt": {
"type": "string",
"format": "int64"
},
"hops": {
"type": "array",
"items": {
"$ref": "#/definitions/lnrpcHop"
}
}
}
},
"lnrpcRouteRequest": {
"type": "object",
"properties": {
"amt": {
"type": "string",
"format": "int64"
},
"pub_key": {
"type": "string",
"format": "string"
},
"amt": {
"type": "string",
"format": "int64"
}
}
},
"lnrpcRoutingPolicy": {
"type": "object",
"properties": {
"fee_base_msat": {
"type": "string",
"format": "int64"
},
"fee_rate_milli_msat": {
"type": "string",
"time_lock_delta": {
"type": "integer",
"format": "int64"
},
"min_htlc": {
"type": "string",
"format": "int64"
},
"time_lock_delta": {
"type": "integer",
"fee_base_msat": {
"type": "string",
"format": "int64"
},
"fee_rate_milli_msat": {
"type": "string",
"format": "int64"
}
}
@ -1391,13 +1448,30 @@
}
}
},
"lnrpcSendManyRequest": {
"type": "object",
"properties": {
"AddrToAmount": {
"type": "object",
"additionalProperties": {
"type": "string",
"format": "int64"
}
}
}
},
"lnrpcSendManyResponse": {
"type": "object",
"properties": {
"txid": {
"type": "string",
"format": "string"
}
}
},
"lnrpcSendRequest": {
"type": "object",
"properties": {
"amt": {
"type": "string",
"format": "int64"
},
"dest": {
"type": "string",
"format": "byte"
@ -1406,6 +1480,10 @@
"type": "string",
"format": "string"
},
"amt": {
"type": "string",
"format": "int64"
},
"payment_hash": {
"type": "string",
"format": "byte"
@ -1432,13 +1510,33 @@
}
}
},
"lnrpcSetAliasRequest": {
"type": "object",
"properties": {
"new_alias": {
"type": "string",
"format": "string"
}
}
},
"lnrpcSetAliasResponse": {
"type": "object"
},
"lnrpcTransaction": {
"type": "object",
"properties": {
"tx_hash": {
"type": "string",
"format": "string"
},
"amount": {
"type": "number",
"format": "double"
},
"num_confirmations": {
"type": "integer",
"format": "int32"
},
"block_hash": {
"type": "string",
"format": "string"
@ -1447,10 +1545,6 @@
"type": "integer",
"format": "int32"
},
"num_confirmations": {
"type": "integer",
"format": "int32"
},
"time_stamp": {
"type": "string",
"format": "int64"
@ -1458,10 +1552,6 @@
"total_fees": {
"type": "string",
"format": "int64"
},
"tx_hash": {
"type": "string",
"format": "string"
}
}
},

23
peer.go
View File

@ -440,20 +440,20 @@ out:
p.queueMsg(lnwire.NewPong(msg.Nonce), nil)
case *lnwire.SingleFundingRequest:
p.server.fundingMgr.processFundingRequest(msg, p)
p.server.fundingMgr.processFundingRequest(msg, p.addr)
case *lnwire.SingleFundingResponse:
p.server.fundingMgr.processFundingResponse(msg, p)
p.server.fundingMgr.processFundingResponse(msg, p.addr)
case *lnwire.SingleFundingComplete:
p.server.fundingMgr.processFundingComplete(msg, p)
p.server.fundingMgr.processFundingComplete(msg, p.addr)
case *lnwire.SingleFundingSignComplete:
p.server.fundingMgr.processFundingSignComplete(msg, p)
p.server.fundingMgr.processFundingSignComplete(msg, p.addr)
case *lnwire.SingleFundingOpenProof:
p.server.fundingMgr.processFundingOpenProof(msg, p)
p.server.fundingMgr.processFundingOpenProof(msg, p.addr)
case *lnwire.CloseRequest:
p.remoteCloseChanReqs <- msg
case *lnwire.ErrorGeneric:
p.server.fundingMgr.processErrorGeneric(msg, p)
p.server.fundingMgr.processErrorGeneric(msg, p.addr)
// TODO(roasbeef): create ChanUpdater interface for the below
case *lnwire.UpdateAddHTLC:
@ -1766,6 +1766,17 @@ func (p *peer) updateCommitTx(state *commitmentState, reply bool) error {
return nil
}
// fetchNextPendingChanID provides unique IDs for each channel opened between
// two peers
func (p *peer) fetchNextPendingChanID() uint64 {
p.pendingChannelMtx.Lock()
defer p.pendingChannelMtx.Unlock()
chanID := p.nextPendingChannelID
p.nextPendingChannelID++
return chanID
}
// logEntryToHtlcPkt converts a particular Lightning Commitment Protocol (LCP)
// log entry the corresponding htlcPacket with src/dest set along with the
// proper wire message. This helper method is provided in order to aid an

View File

@ -770,7 +770,6 @@ func (r *rpcServer) PendingChannels(ctx context.Context,
// TODO(roasbeef): add confirmation progress
pub := pendingOpen.identityPub.SerializeCompressed()
pendingChan := &lnrpc.PendingChannelResponse_PendingChannel{
PeerId: pendingOpen.peerId,
IdentityKey: hex.EncodeToString(pub),
ChannelPoint: channelPointStr,
Capacity: int64(pendingOpen.capacity),

View File

@ -196,7 +196,16 @@ func newServer(listenAddrs []string, notifier chainntnfs.ChainNotifier,
s.rpcServer = newRpcServer(s)
s.breachArbiter = newBreachArbiter(wallet, chanDB, notifier, s.htlcSwitch)
s.fundingMgr = newFundingManager(wallet, s.breachArbiter)
s.fundingMgr, err = newFundingManager(FundingConfig{
Wallet: wallet,
ArbiterChan: s.breachArbiter.newContracts,
SendToPeer: s.sendToPeer,
FindPeer: s.findPeer,
})
if err != nil {
return nil, err
}
// TODO(roasbeef): introduce closure and config system to decouple the
// initialization above ^
@ -398,6 +407,24 @@ func (s *server) sendToPeer(target *btcec.PublicKey, msgs ...lnwire.Message) err
}
}
// findPeer will return the peer that corresponds to the passed in public key.
// This function is used by the funding manager, allowing it to update the
// daemon's local representation of the remote peer.
func (s *server) findPeer(peerKey *btcec.PublicKey) (*peer, error) {
serializedIDKey := string(peerKey.SerializeCompressed())
s.peersMtx.RLock()
peer := s.peersByPub[serializedIDKey]
s.peersMtx.RUnlock()
if peer == nil {
return nil, errors.New("Peer not found. Pubkey: " +
string(peerKey.SerializeCompressed()))
}
return peer, nil
}
// peerConnected is a function that handles initialization a newly connected
// peer by adding it to the server's global list of all active peers, and
// starting all the goroutines the peer needs to function properly.
@ -801,7 +828,7 @@ func (s *server) handleOpenChanReq(req *openChanReq) {
// of blocking on this request which is exported as a synchronous
// request to the outside world.
// TODO(roasbeef): server semaphore to restrict num goroutines
go s.fundingMgr.initFundingWorkflow(targetPeer, req)
go s.fundingMgr.initFundingWorkflow(targetPeer.addr, req)
}
// ConnectToPeer requests that the server connect to a Lightning Network peer