From b21bd351e8d985ba43445f78efd528190a577157 Mon Sep 17 00:00:00 2001 From: bryanvu Date: Thu, 12 Jan 2017 19:40:38 -0800 Subject: [PATCH] fundingmanager: change funding messages to use server.sendToPeer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- fundingmanager.go | 333 ++++++++++++-------- lnrpc/rpc.pb.go | 691 ++++++++++++++++++++++------------------- lnrpc/rpc.proto | 16 +- lnrpc/rpc.swagger.json | 508 +++++++++++++++++------------- peer.go | 23 +- rpcserver.go | 1 - server.go | 31 +- 7 files changed, 923 insertions(+), 680 deletions(-) diff --git a/fundingmanager.go b/fundingmanager.go index b6ca947e..160103b4 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -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 +} diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index acbc10cd..e84b7f7a 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -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, } diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 6e18ea4a..d3e4008a 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -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; diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 5af455db..2268476f 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -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" } } }, diff --git a/peer.go b/peer.go index 516ad089..c1ec84b5 100644 --- a/peer.go +++ b/peer.go @@ -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 diff --git a/rpcserver.go b/rpcserver.go index 8fd1da6b..1f4d4266 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -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), diff --git a/server.go b/server.go index a0a7a7d7..af378bed 100644 --- a/server.go +++ b/server.go @@ -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