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