fundingmanager: change funding messages to use server.sendToPeer
Previously, during the channel funding process, peers sent wire messages using peer.queueMsg. By switching to server.sendToPeer, the fundingManager is more resilient to network connection issues or system restarts during the funding process. With server.sendToPeer, if a peer gets disconnected, the daemon can attempt to reconnect and continue the process using the peer’s public key ID.
This commit is contained in:
parent
69faebfcae
commit
b21bd351e8
@ -35,7 +35,7 @@ const (
|
|||||||
// * deadlines, etc.
|
// * deadlines, etc.
|
||||||
type reservationWithCtx struct {
|
type reservationWithCtx struct {
|
||||||
reservation *lnwallet.ChannelReservation
|
reservation *lnwallet.ChannelReservation
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
|
|
||||||
updates chan *lnrpc.OpenStatusUpdate
|
updates chan *lnrpc.OpenStatusUpdate
|
||||||
err chan error
|
err chan error
|
||||||
@ -47,7 +47,7 @@ type reservationWithCtx struct {
|
|||||||
// embedded within this message giving the funding manager full context w.r.t
|
// embedded within this message giving the funding manager full context w.r.t
|
||||||
// the workflow.
|
// the workflow.
|
||||||
type initFundingMsg struct {
|
type initFundingMsg struct {
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
*openChanReq
|
*openChanReq
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ type initFundingMsg struct {
|
|||||||
// response directly to the peer, progressing the funding workflow.
|
// response directly to the peer, progressing the funding workflow.
|
||||||
type fundingRequestMsg struct {
|
type fundingRequestMsg struct {
|
||||||
msg *lnwire.SingleFundingRequest
|
msg *lnwire.SingleFundingRequest
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// fundingResponseMsg couples an lnwire.SingleFundingResponse message with the
|
// fundingResponseMsg couples an lnwire.SingleFundingResponse message with the
|
||||||
@ -64,7 +64,7 @@ type fundingRequestMsg struct {
|
|||||||
// response directly to the peer, progressing the funding workflow.
|
// response directly to the peer, progressing the funding workflow.
|
||||||
type fundingResponseMsg struct {
|
type fundingResponseMsg struct {
|
||||||
msg *lnwire.SingleFundingResponse
|
msg *lnwire.SingleFundingResponse
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// fundingCompleteMsg couples an lnwire.SingleFundingComplete message with the
|
// fundingCompleteMsg couples an lnwire.SingleFundingComplete message with the
|
||||||
@ -72,7 +72,7 @@ type fundingResponseMsg struct {
|
|||||||
// response directly to the peer, progressing the funding workflow.
|
// response directly to the peer, progressing the funding workflow.
|
||||||
type fundingCompleteMsg struct {
|
type fundingCompleteMsg struct {
|
||||||
msg *lnwire.SingleFundingComplete
|
msg *lnwire.SingleFundingComplete
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// fundingSignCompleteMsg couples an lnwire.SingleFundingSignComplete message
|
// fundingSignCompleteMsg couples an lnwire.SingleFundingSignComplete message
|
||||||
@ -80,7 +80,7 @@ type fundingCompleteMsg struct {
|
|||||||
// queue a response directly to the peer, progressing the funding workflow.
|
// queue a response directly to the peer, progressing the funding workflow.
|
||||||
type fundingSignCompleteMsg struct {
|
type fundingSignCompleteMsg struct {
|
||||||
msg *lnwire.SingleFundingSignComplete
|
msg *lnwire.SingleFundingSignComplete
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// fundingOpenMsg couples an lnwire.SingleFundingOpenProof message
|
// fundingOpenMsg couples an lnwire.SingleFundingOpenProof message
|
||||||
@ -88,7 +88,7 @@ type fundingSignCompleteMsg struct {
|
|||||||
// queue a response directly to the peer, progressing the funding workflow.
|
// queue a response directly to the peer, progressing the funding workflow.
|
||||||
type fundingOpenMsg struct {
|
type fundingOpenMsg struct {
|
||||||
msg *lnwire.SingleFundingOpenProof
|
msg *lnwire.SingleFundingOpenProof
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// fundingErrorMsg couples an lnwire.ErrorGeneric message
|
// fundingErrorMsg couples an lnwire.ErrorGeneric message
|
||||||
@ -96,13 +96,43 @@ type fundingOpenMsg struct {
|
|||||||
// manager to properly process the error.
|
// manager to properly process the error.
|
||||||
type fundingErrorMsg struct {
|
type fundingErrorMsg struct {
|
||||||
err *lnwire.ErrorGeneric
|
err *lnwire.ErrorGeneric
|
||||||
peer *peer
|
peerAddress *lnwire.NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// pendingChannels is a map instantiated per-peer which tracks all active
|
// pendingChannels is a map instantiated per-peer which tracks all active
|
||||||
// pending single funded channels indexed by their pending channel identifier.
|
// pending single funded channels indexed by their pending channel identifier.
|
||||||
type pendingChannels map[uint64]*reservationWithCtx
|
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
|
// fundingManager acts as an orchestrator/bridge between the wallet's
|
||||||
// 'ChannelReservation' workflow, and the wire protocol's funding initiation
|
// 'ChannelReservation' workflow, and the wire protocol's funding initiation
|
||||||
// messages. Any requests to initiate the funding workflow for a channel,
|
// messages. Any requests to initiate the funding workflow for a channel,
|
||||||
@ -117,15 +147,14 @@ type fundingManager struct {
|
|||||||
started int32
|
started int32
|
||||||
stopped 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
|
// channelReservations is a map which houses the state of all pending
|
||||||
// funding workflows.
|
// funding workflows.
|
||||||
resMtx sync.RWMutex
|
resMtx sync.RWMutex
|
||||||
activeReservations map[int32]pendingChannels
|
activeReservations map[serializedPubKey]pendingChannels
|
||||||
|
|
||||||
// wallet is the daemon's internal Lightning enabled wallet.
|
|
||||||
wallet *lnwallet.LightningWallet
|
|
||||||
|
|
||||||
breachAribter *breachArbiter
|
|
||||||
|
|
||||||
// fundingMsgs is a channel which receives wrapped wire messages
|
// fundingMsgs is a channel which receives wrapped wire messages
|
||||||
// related to funding workflow from outside peers.
|
// related to funding workflow from outside peers.
|
||||||
@ -147,7 +176,7 @@ type fundingManager struct {
|
|||||||
|
|
||||||
// newFundingManager creates and initializes a new instance of the
|
// newFundingManager creates and initializes a new instance of the
|
||||||
// fundingManager.
|
// 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
|
// TODO(roasbeef): remove once we actually sign the funding_locked
|
||||||
// stuffs
|
// stuffs
|
||||||
s := "30450221008ce2bc69281ce27da07e6683571319d18e949ddfa2965fb6caa" +
|
s := "30450221008ce2bc69281ce27da07e6683571319d18e949ddfa2965fb6caa" +
|
||||||
@ -157,20 +186,19 @@ func newFundingManager(w *lnwallet.LightningWallet, b *breachArbiter) *fundingMa
|
|||||||
fakeSig, _ := btcec.ParseSignature(fakeSigHex, btcec.S256())
|
fakeSig, _ := btcec.ParseSignature(fakeSigHex, btcec.S256())
|
||||||
|
|
||||||
return &fundingManager{
|
return &fundingManager{
|
||||||
wallet: w,
|
cfg: &cfg,
|
||||||
breachAribter: b,
|
|
||||||
|
|
||||||
fakeProof: &channelProof{
|
fakeProof: &channelProof{
|
||||||
nodeSig: fakeSig,
|
nodeSig: fakeSig,
|
||||||
bitcoinSig: fakeSig,
|
bitcoinSig: fakeSig,
|
||||||
},
|
},
|
||||||
|
|
||||||
activeReservations: make(map[int32]pendingChannels),
|
activeReservations: make(map[serializedPubKey]pendingChannels),
|
||||||
fundingMsgs: make(chan interface{}, msgBufferSize),
|
fundingMsgs: make(chan interface{}, msgBufferSize),
|
||||||
fundingRequests: make(chan *initFundingMsg, msgBufferSize),
|
fundingRequests: make(chan *initFundingMsg, msgBufferSize),
|
||||||
queries: make(chan interface{}, 1),
|
queries: make(chan interface{}, 1),
|
||||||
quit: make(chan struct{}),
|
quit: make(chan struct{}),
|
||||||
}
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start launches all helper goroutines required for handling requests sent
|
// Start launches all helper goroutines required for handling requests sent
|
||||||
@ -219,7 +247,6 @@ func (f *fundingManager) NumPendingChannels() uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type pendingChannel struct {
|
type pendingChannel struct {
|
||||||
peerId int32
|
|
||||||
identityPub *btcec.PublicKey
|
identityPub *btcec.PublicKey
|
||||||
channelPoint *wire.OutPoint
|
channelPoint *wire.OutPoint
|
||||||
capacity btcutil.Amount
|
capacity btcutil.Amount
|
||||||
@ -295,16 +322,14 @@ func (f *fundingManager) handleNumPending(msg *numPendingReq) {
|
|||||||
// workflow (funding txn confirmation).
|
// workflow (funding txn confirmation).
|
||||||
func (f *fundingManager) handlePendingChannels(msg *pendingChansReq) {
|
func (f *fundingManager) handlePendingChannels(msg *pendingChansReq) {
|
||||||
var pendingChannels []*pendingChannel
|
var pendingChannels []*pendingChannel
|
||||||
for peerID, peerChannels := range f.activeReservations {
|
for _, peerChannels := range f.activeReservations {
|
||||||
for _, pendingChan := range peerChannels {
|
for _, pendingChan := range peerChannels {
|
||||||
peer := pendingChan.peer
|
|
||||||
res := pendingChan.reservation
|
res := pendingChan.reservation
|
||||||
localFund := res.OurContribution().FundingAmount
|
localFund := res.OurContribution().FundingAmount
|
||||||
remoteFund := res.TheirContribution().FundingAmount
|
remoteFund := res.TheirContribution().FundingAmount
|
||||||
|
|
||||||
pendingChan := &pendingChannel{
|
pendingChan := &pendingChannel{
|
||||||
peerId: peerID,
|
identityPub: pendingChan.peerAddress.IdentityKey,
|
||||||
identityPub: peer.addr.IdentityKey,
|
|
||||||
channelPoint: res.FundingOutpoint(),
|
channelPoint: res.FundingOutpoint(),
|
||||||
capacity: localFund + remoteFund,
|
capacity: localFund + remoteFund,
|
||||||
localBalance: localFund,
|
localBalance: localFund,
|
||||||
@ -318,8 +343,9 @@ func (f *fundingManager) handlePendingChannels(msg *pendingChansReq) {
|
|||||||
|
|
||||||
// processFundingRequest sends a message to the fundingManager allowing it to
|
// processFundingRequest sends a message to the fundingManager allowing it to
|
||||||
// initiate the new funding workflow with the source peer.
|
// initiate the new funding workflow with the source peer.
|
||||||
func (f *fundingManager) processFundingRequest(msg *lnwire.SingleFundingRequest, peer *peer) {
|
func (f *fundingManager) processFundingRequest(msg *lnwire.SingleFundingRequest,
|
||||||
f.fundingMsgs <- &fundingRequestMsg{msg, peer}
|
peerAddress *lnwire.NetAddress) {
|
||||||
|
f.fundingMsgs <- &fundingRequestMsg{msg, peerAddress}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleFundingRequest creates an initial 'ChannelReservation' within
|
// handleFundingRequest creates an initial 'ChannelReservation' within
|
||||||
@ -330,7 +356,9 @@ func (f *fundingManager) processFundingRequest(msg *lnwire.SingleFundingRequest,
|
|||||||
func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
||||||
// Check number of pending channels to be smaller than maximum allowed
|
// Check number of pending channels to be smaller than maximum allowed
|
||||||
// number and send ErrorGeneric to remote peer if condition is violated.
|
// 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{
|
errMsg := &lnwire.ErrorGeneric{
|
||||||
ChannelPoint: wire.OutPoint{
|
ChannelPoint: wire.OutPoint{
|
||||||
Hash: chainhash.Hash{},
|
Hash: chainhash.Hash{},
|
||||||
@ -340,14 +368,16 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
|||||||
Code: lnwire.ErrMaxPendingChannels,
|
Code: lnwire.ErrMaxPendingChannels,
|
||||||
PendingChannelID: fmsg.msg.ChannelID,
|
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 max pending channels message to peer", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// We'll also reject any requests to create channels until we're fully
|
// 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
|
// synced to the network as we won't be able to properly validate the
|
||||||
// confirmation of the funding transaction.
|
// confirmation of the funding transaction.
|
||||||
isSynced, err := f.wallet.IsSynced()
|
isSynced, err := f.cfg.Wallet.IsSynced()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fndgLog.Errorf("unable to query wallet: %v", err)
|
fndgLog.Errorf("unable to query wallet: %v", err)
|
||||||
return
|
return
|
||||||
@ -362,7 +392,10 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
|||||||
Code: lnwire.ErrSynchronizingChain,
|
Code: lnwire.ErrSynchronizingChain,
|
||||||
PendingChannelID: fmsg.msg.ChannelID,
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,9 +404,9 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
|||||||
delay := msg.CsvDelay
|
delay := msg.CsvDelay
|
||||||
|
|
||||||
// TODO(roasbeef): error if funding flow already ongoing
|
// TODO(roasbeef): error if funding flow already ongoing
|
||||||
fndgLog.Infof("Recv'd fundingRequest(amt=%v, push=%v, delay=%v, pendingId=%v) "+
|
fndgLog.Infof("Recv'd fundingRequest(amt=%v, delay=%v, pendingId=%v) "+
|
||||||
"from peerID(%v)", amt, msg.PushSatoshis, delay, msg.ChannelID,
|
"from peer(%v)", amt, msg.PushSatoshis, delay, msg.ChannelID,
|
||||||
fmsg.peer.id)
|
fmsg.peerAddress.IdentityKey.SerializeCompressed())
|
||||||
|
|
||||||
ourDustLimit := lnwallet.DefaultDustLimit()
|
ourDustLimit := lnwallet.DefaultDustLimit()
|
||||||
theirDustlimit := msg.DustLimit
|
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): passing num confs 1 is irrelevant here, make signed?
|
||||||
// TODO(roasbeef): assuming this was an inbound connection, replace
|
// TODO(roasbeef): assuming this was an inbound connection, replace
|
||||||
// port with default advertised port
|
// port with default advertised port
|
||||||
reservation, err := f.wallet.InitChannelReservation(amt, 0,
|
reservation, err := f.cfg.Wallet.InitChannelReservation(amt, 0,
|
||||||
fmsg.peer.addr.IdentityKey, fmsg.peer.addr.Address, 1, delay,
|
fmsg.peerAddress.IdentityKey, fmsg.peerAddress.Address, 1, delay,
|
||||||
ourDustLimit, msg.PushSatoshis)
|
ourDustLimit, msg.PushSatoshis)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO(roasbeef): push ErrorGeneric message
|
// TODO(roasbeef): push ErrorGeneric message
|
||||||
fndgLog.Errorf("Unable to initialize reservation: %v", err)
|
fndgLog.Errorf("Unable to initialize reservation: %v", err)
|
||||||
fmsg.peer.Disconnect()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,12 +434,12 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
|||||||
// peers map of pending reservations to track this particular reservation
|
// peers map of pending reservations to track this particular reservation
|
||||||
// until either abort or completion.
|
// until either abort or completion.
|
||||||
f.resMtx.Lock()
|
f.resMtx.Lock()
|
||||||
if _, ok := f.activeReservations[fmsg.peer.id]; !ok {
|
if _, ok := f.activeReservations[peerIDKey]; !ok {
|
||||||
f.activeReservations[fmsg.peer.id] = make(pendingChannels)
|
f.activeReservations[peerIDKey] = make(pendingChannels)
|
||||||
}
|
}
|
||||||
f.activeReservations[fmsg.peer.id][msg.ChannelID] = &reservationWithCtx{
|
f.activeReservations[peerIDKey][msg.ChannelID] = &reservationWithCtx{
|
||||||
reservation: reservation,
|
reservation: reservation,
|
||||||
peer: fmsg.peer,
|
peerAddress: fmsg.peerAddress,
|
||||||
}
|
}
|
||||||
f.resMtx.Unlock()
|
f.resMtx.Unlock()
|
||||||
|
|
||||||
@ -427,7 +459,6 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
|||||||
}
|
}
|
||||||
if err := reservation.ProcessSingleContribution(contribution); err != nil {
|
if err := reservation.ProcessSingleContribution(contribution); err != nil {
|
||||||
fndgLog.Errorf("unable to add contribution reservation: %v", err)
|
fndgLog.Errorf("unable to add contribution reservation: %v", err)
|
||||||
fmsg.peer.Disconnect()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,13 +477,17 @@ func (f *fundingManager) handleFundingRequest(fmsg *fundingRequestMsg) {
|
|||||||
ourContribution.MultiSigKey, ourContribution.CsvDelay,
|
ourContribution.MultiSigKey, ourContribution.CsvDelay,
|
||||||
deliveryScript, ourDustLimit)
|
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
|
// processFundingRequest sends a message to the fundingManager allowing it to
|
||||||
// continue the second phase of a funding workflow with the target peer.
|
// continue the second phase of a funding workflow with the target peer.
|
||||||
func (f *fundingManager) processFundingResponse(msg *lnwire.SingleFundingResponse, peer *peer) {
|
func (f *fundingManager) processFundingResponse(msg *lnwire.SingleFundingResponse,
|
||||||
f.fundingMsgs <- &fundingResponseMsg{msg, peer}
|
peerAddress *lnwire.NetAddress) {
|
||||||
|
f.fundingMsgs <- &fundingResponseMsg{msg, peerAddress}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleFundingResponse processes a response to the workflow initiation sent
|
// 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.
|
// outpoint, and a commitment signature to the remote peer.
|
||||||
func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
|
func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
|
||||||
msg := fmsg.msg
|
msg := fmsg.msg
|
||||||
peerID := fmsg.peer.id
|
|
||||||
chanID := fmsg.msg.ChannelID
|
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 {
|
if err != nil {
|
||||||
fndgLog.Warnf("Can't find reservation (peerID:%v, chanID:%v)",
|
fndgLog.Warnf("Can't find reservation (peerKey:%v, chanID:%v)",
|
||||||
peerID, chanID)
|
peerKey, chanID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -496,8 +530,7 @@ func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
|
|||||||
}
|
}
|
||||||
if err := resCtx.reservation.ProcessContribution(contribution); err != nil {
|
if err := resCtx.reservation.ProcessContribution(contribution); err != nil {
|
||||||
fndgLog.Errorf("Unable to process contribution from %v: %v",
|
fndgLog.Errorf("Unable to process contribution from %v: %v",
|
||||||
sourcePeer, err)
|
fmsg.peerAddress.IdentityKey, err)
|
||||||
fmsg.peer.Disconnect()
|
|
||||||
resCtx.err <- err
|
resCtx.err <- err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -516,7 +549,12 @@ func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
|
|||||||
|
|
||||||
// Register a new barrier for this channel to properly synchronize with
|
// Register a new barrier for this channel to properly synchronize with
|
||||||
// the peer's readHandler once the channel is open.
|
// 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,
|
fndgLog.Infof("Generated ChannelPoint(%v) for pendingID(%v)", outPoint,
|
||||||
chanID)
|
chanID)
|
||||||
@ -526,13 +564,19 @@ func (f *fundingManager) handleFundingResponse(fmsg *fundingResponseMsg) {
|
|||||||
|
|
||||||
fundingComplete := lnwire.NewSingleFundingComplete(chanID, *outPoint,
|
fundingComplete := lnwire.NewSingleFundingComplete(chanID, *outPoint,
|
||||||
commitSig, revocationKey, obsfucator)
|
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
|
// processFundingComplete queues a funding complete message coupled with the
|
||||||
// source peer to the fundingManager.
|
// source peer to the fundingManager.
|
||||||
func (f *fundingManager) processFundingComplete(msg *lnwire.SingleFundingComplete, peer *peer) {
|
func (f *fundingManager) processFundingComplete(msg *lnwire.SingleFundingComplete,
|
||||||
f.fundingMsgs <- &fundingCompleteMsg{msg, peer}
|
peerAddress *lnwire.NetAddress) {
|
||||||
|
f.fundingMsgs <- &fundingCompleteMsg{msg, peerAddress}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleFundingComplete progresses the funding workflow when the daemon is on
|
// 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
|
// processed, a signature is sent to the remote peer allowing it to broadcast
|
||||||
// the funding transaction, progressing the workflow into the final stage.
|
// the funding transaction, progressing the workflow into the final stage.
|
||||||
func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
|
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 {
|
if err != nil {
|
||||||
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
|
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
|
||||||
fmsg.peer.id, fmsg.msg.ChannelID)
|
peerKey, chanID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,7 +600,6 @@ func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
|
|||||||
// inititator's commitment transaction, then send our own if it's valid.
|
// inititator's commitment transaction, then send our own if it's valid.
|
||||||
// TODO(roasbeef): make case (p vs P) consistent throughout
|
// TODO(roasbeef): make case (p vs P) consistent throughout
|
||||||
fundingOut := fmsg.msg.FundingOutPoint
|
fundingOut := fmsg.msg.FundingOutPoint
|
||||||
chanID := fmsg.msg.ChannelID
|
|
||||||
fndgLog.Infof("completing pendingID(%v) with ChannelPoint(%v)",
|
fndgLog.Infof("completing pendingID(%v) with ChannelPoint(%v)",
|
||||||
chanID, fundingOut,
|
chanID, fundingOut,
|
||||||
)
|
)
|
||||||
@ -570,7 +616,6 @@ func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO(roasbeef): better error logging: peerID, channelID, etc.
|
// TODO(roasbeef): better error logging: peerID, channelID, etc.
|
||||||
fndgLog.Errorf("unable to complete single reservation: %v", err)
|
fndgLog.Errorf("unable to complete single reservation: %v", err)
|
||||||
fmsg.peer.Disconnect()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -587,19 +632,28 @@ func (f *fundingManager) handleFundingComplete(fmsg *fundingCompleteMsg) {
|
|||||||
|
|
||||||
// Register a new barrier for this channel to properly synchronize with
|
// Register a new barrier for this channel to properly synchronize with
|
||||||
// the peer's readHandler once the channel is open.
|
// 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)",
|
fndgLog.Infof("sending signComplete for pendingID(%v) over ChannelPoint(%v)",
|
||||||
fmsg.msg.ChannelID, fundingOut)
|
chanID, fundingOut)
|
||||||
|
|
||||||
signComplete := lnwire.NewSingleFundingSignComplete(chanID, ourCommitSig)
|
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
|
// processFundingSignComplete sends a single funding sign complete message
|
||||||
// along with the source peer to the funding manager.
|
// along with the source peer to the funding manager.
|
||||||
func (f *fundingManager) processFundingSignComplete(msg *lnwire.SingleFundingSignComplete, peer *peer) {
|
func (f *fundingManager) processFundingSignComplete(msg *lnwire.SingleFundingSignComplete,
|
||||||
f.fundingMsgs <- &fundingSignCompleteMsg{msg, peer}
|
peerAddress *lnwire.NetAddress) {
|
||||||
|
f.fundingMsgs <- &fundingSignCompleteMsg{msg, peerAddress}
|
||||||
}
|
}
|
||||||
|
|
||||||
// channelProof is one half of the proof necessary to create an authenticated
|
// 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.
|
// encoding of the location of the channel within the blockchain.
|
||||||
func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg) {
|
func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg) {
|
||||||
chanID := fmsg.msg.ChannelID
|
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 {
|
if err != nil {
|
||||||
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
|
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
|
||||||
peerID, chanID)
|
peerKey, chanID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,7 +776,6 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
|
|||||||
commitSig := fmsg.msg.CommitSignature.Serialize()
|
commitSig := fmsg.msg.CommitSignature.Serialize()
|
||||||
if err := resCtx.reservation.CompleteReservation(nil, commitSig); err != nil {
|
if err := resCtx.reservation.CompleteReservation(nil, commitSig); err != nil {
|
||||||
fndgLog.Errorf("unable to complete reservation sign complete: %v", err)
|
fndgLog.Errorf("unable to complete reservation sign complete: %v", err)
|
||||||
fmsg.peer.Disconnect()
|
|
||||||
resCtx.err <- err
|
resCtx.err <- err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -759,22 +812,27 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
|
|||||||
|
|
||||||
// This reservation is no longer pending as the funding
|
// This reservation is no longer pending as the funding
|
||||||
// transaction has been fully confirmed.
|
// transaction has been fully confirmed.
|
||||||
f.deleteReservationCtx(peerID, chanID)
|
f.deleteReservationCtx(peerKey, chanID)
|
||||||
|
|
||||||
fndgLog.Infof("ChannelPoint(%v) with peerID(%v) is now active",
|
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
|
// Now that the channel is open, we need to notify a number of
|
||||||
// parties of this event.
|
// parties of this event.
|
||||||
|
|
||||||
// First we send the newly opened channel to the source server
|
// First we send the newly opened channel to the source server
|
||||||
// peer.
|
// 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
|
// Afterwards we send the breach arbiter the new channel so it
|
||||||
// can watch for attempts to breach the channel's contract by
|
// can watch for attempts to breach the channel's contract by
|
||||||
// the remote party.
|
// the remote party.
|
||||||
f.breachAribter.newContracts <- openChanDetails.Channel
|
f.cfg.ArbiterChan <- openChanDetails.Channel
|
||||||
|
|
||||||
// With the block height and the transaction index known, we
|
// With the block height and the transaction index known, we
|
||||||
// can construct the compact chainID which is used on the
|
// 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
|
// channel is open. We additionally provide the compact
|
||||||
// channelID so they can advertise the channel.
|
// channelID so they can advertise the channel.
|
||||||
fundingOpen := lnwire.NewSingleFundingOpenProof(chanID, chainID)
|
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
|
// Register the new link with the L3 routing manager so this
|
||||||
// new channel can be utilized during path
|
// new channel can be utilized during path
|
||||||
@ -797,8 +859,8 @@ func (f *fundingManager) handleFundingSignComplete(fmsg *fundingSignCompleteMsg)
|
|||||||
// TODO(roasbeef): should include sigs from funding
|
// TODO(roasbeef): should include sigs from funding
|
||||||
// locked
|
// locked
|
||||||
// * should be moved to after funding locked is recv'd
|
// * should be moved to after funding locked is recv'd
|
||||||
f.announceChannel(fmsg.peer.server, openChanDetails.Channel,
|
f.announceChannel(peer.server, openChanDetails.Channel, chainID, f.fakeProof,
|
||||||
chainID, f.fakeProof, f.fakeProof)
|
f.fakeProof)
|
||||||
|
|
||||||
// Finally give the caller a final update notifying them that
|
// Finally give the caller a final update notifying them that
|
||||||
// the channel is now open.
|
// the channel is now open.
|
||||||
@ -839,20 +901,21 @@ func (f *fundingManager) announceChannel(s *server,
|
|||||||
// processFundingOpenProof sends a message to the fundingManager allowing it
|
// processFundingOpenProof sends a message to the fundingManager allowing it
|
||||||
// to process the final message received when the daemon is on the responding
|
// to process the final message received when the daemon is on the responding
|
||||||
// side of a single funder channel workflow.
|
// side of a single funder channel workflow.
|
||||||
func (f *fundingManager) processFundingOpenProof(msg *lnwire.SingleFundingOpenProof, peer *peer) {
|
func (f *fundingManager) processFundingOpenProof(msg *lnwire.SingleFundingOpenProof,
|
||||||
f.fundingMsgs <- &fundingOpenMsg{msg, peer}
|
peerAddress *lnwire.NetAddress) {
|
||||||
|
f.fundingMsgs <- &fundingOpenMsg{msg, peerAddress}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleFundingOpen processes the final message when the daemon is the
|
// handleFundingOpen processes the final message when the daemon is the
|
||||||
// responder to a single funder channel workflow.
|
// responder to a single funder channel workflow.
|
||||||
func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
|
func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
|
||||||
chanID := fmsg.msg.ChannelID
|
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 {
|
if err != nil {
|
||||||
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
|
fndgLog.Warnf("can't find reservation (peerID:%v, chanID:%v)",
|
||||||
peerID, chanID)
|
peerKey, chanID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -867,40 +930,45 @@ func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
|
|||||||
openChan, err := resCtx.reservation.FinalizeReservation()
|
openChan, err := resCtx.reservation.FinalizeReservation()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fndgLog.Errorf("unable to finalize reservation: %v", err)
|
fndgLog.Errorf("unable to finalize reservation: %v", err)
|
||||||
fmsg.peer.Disconnect()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// The reservation has been completed, therefore we can stop tracking
|
// The reservation has been completed, therefore we can stop tracking
|
||||||
// it within our active reservations map.
|
// 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",
|
fndgLog.Infof("FundingOpen: ChannelPoint(%v) with peerKey(%v) is now open",
|
||||||
resCtx.reservation.FundingOutpoint(), peerID)
|
resCtx.reservation.FundingOutpoint(), peerKey)
|
||||||
|
|
||||||
// Notify the L3 routing manager of the newly active channel link.
|
// Notify the L3 routing manager of the newly active channel link.
|
||||||
// TODO(roasbeef): should have sigs, only after funding_locked is
|
// TODO(roasbeef): should have sigs, only after funding_locked is
|
||||||
// recv'd
|
// recv'd
|
||||||
// * also ensure fault tolerance, scan opened chan on start up check
|
// * also ensure fault tolerance, scan opened chan on start up check
|
||||||
// for graph existence
|
// 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)
|
f.fakeProof, f.fakeProof)
|
||||||
|
|
||||||
// Send the newly opened channel to the breach arbiter to it can watch
|
// Send the newly opened channel to the breach arbiter to it can watch
|
||||||
// for uncooperative channel breaches, potentially punishing the
|
// for uncooperative channel breaches, potentially punishing the
|
||||||
// counterparty for attempting to cheat us.
|
// counterparty for attempting to cheat us.
|
||||||
f.breachAribter.newContracts <- openChan
|
f.cfg.ArbiterChan <- openChan
|
||||||
|
|
||||||
// Finally, notify the target peer of the newly opened channel.
|
// Finally, notify the target peer of the newly open channel.
|
||||||
fmsg.peer.newChannels <- openChan
|
peer.newChannels <- openChan
|
||||||
}
|
}
|
||||||
|
|
||||||
// initFundingWorkflow sends a message to the funding manager instructing it
|
// initFundingWorkflow sends a message to the funding manager instructing it
|
||||||
// to initiate a single funder workflow with the source peer.
|
// to initiate a single funder workflow with the source peer.
|
||||||
// TODO(roasbeef): re-visit blocking nature..
|
// 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{
|
f.fundingRequests <- &initFundingMsg{
|
||||||
peer: targetPeer,
|
peerAddress: peerAddress,
|
||||||
openChanReq: req,
|
openChanReq: req,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -911,7 +979,7 @@ func (f *fundingManager) initFundingWorkflow(targetPeer *peer, req *openChanReq)
|
|||||||
func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
|
func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
|
||||||
var (
|
var (
|
||||||
// TODO(roasbeef): add delay
|
// TODO(roasbeef): add delay
|
||||||
nodeID = msg.peer.addr.IdentityKey
|
peerKey = msg.peerAddress.IdentityKey
|
||||||
localAmt = msg.localFundingAmt
|
localAmt = msg.localFundingAmt
|
||||||
remoteAmt = msg.remoteFundingAmt
|
remoteAmt = msg.remoteFundingAmt
|
||||||
capacity = localAmt + remoteAmt
|
capacity = localAmt + remoteAmt
|
||||||
@ -921,15 +989,13 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
|
|||||||
|
|
||||||
fndgLog.Infof("Initiating fundingRequest(localAmt=%v, remoteAmt=%v, "+
|
fndgLog.Infof("Initiating fundingRequest(localAmt=%v, remoteAmt=%v, "+
|
||||||
"capacity=%v, numConfs=%v, addr=%v, dustLimit=%v)", localAmt,
|
"capacity=%v, numConfs=%v, addr=%v, dustLimit=%v)", localAmt,
|
||||||
msg.pushAmt, capacity, numConfs, msg.peer.addr.Address,
|
msg.pushAmt, capacity, numConfs, msg.peerAddress.Address, ourDustLimit)
|
||||||
ourDustLimit)
|
|
||||||
|
|
||||||
// Initialize a funding reservation with the local wallet. If the
|
// Initialize a funding reservation with the local wallet. If the
|
||||||
// wallet doesn't have enough funds to commit to this channel, then
|
// wallet doesn't have enough funds to commit to this channel, then
|
||||||
// the request will fail, and be aborted.
|
// the request will fail, and be aborted.
|
||||||
reservation, err := f.wallet.InitChannelReservation(capacity, localAmt,
|
reservation, err := f.cfg.Wallet.InitChannelReservation(capacity, localAmt,
|
||||||
nodeID, msg.peer.addr.Address, uint16(numConfs), 4,
|
peerKey, msg.peerAddress.Address, uint16(numConfs), 4, ourDustLimit, msg.pushAmt)
|
||||||
ourDustLimit, msg.pushAmt)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg.err <- err
|
msg.err <- err
|
||||||
return
|
return
|
||||||
@ -937,22 +1003,27 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
|
|||||||
|
|
||||||
// Obtain a new pending channel ID which is used to track this
|
// Obtain a new pending channel ID which is used to track this
|
||||||
// reservation throughout its lifetime.
|
// reservation throughout its lifetime.
|
||||||
msg.peer.pendingChannelMtx.Lock()
|
peer, err := f.cfg.FindPeer(peerKey)
|
||||||
chanID := msg.peer.nextPendingChannelID
|
if err != nil {
|
||||||
msg.peer.nextPendingChannelID++
|
msg.err <- err
|
||||||
msg.peer.pendingChannelMtx.Unlock()
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(bvu): add comment
|
||||||
|
chanID := peer.fetchNextPendingChanID()
|
||||||
|
|
||||||
// If a pending channel map for this peer isn't already created, then
|
// If a pending channel map for this peer isn't already created, then
|
||||||
// we create one, ultimately allowing us to track this pending
|
// we create one, ultimately allowing us to track this pending
|
||||||
// reservation within the target peer.
|
// reservation within the target peer.
|
||||||
|
peerIDKey := newSerializedKey(peerKey)
|
||||||
f.resMtx.Lock()
|
f.resMtx.Lock()
|
||||||
if _, ok := f.activeReservations[msg.peer.id]; !ok {
|
if _, ok := f.activeReservations[peerIDKey]; !ok {
|
||||||
f.activeReservations[msg.peer.id] = make(pendingChannels)
|
f.activeReservations[peerIDKey] = make(pendingChannels)
|
||||||
}
|
}
|
||||||
|
|
||||||
f.activeReservations[msg.peer.id][chanID] = &reservationWithCtx{
|
f.activeReservations[peerIDKey][chanID] = &reservationWithCtx{
|
||||||
reservation: reservation,
|
reservation: reservation,
|
||||||
peer: msg.peer,
|
peerAddress: msg.peerAddress,
|
||||||
updates: msg.updates,
|
updates: msg.updates,
|
||||||
err: msg.err,
|
err: msg.err,
|
||||||
}
|
}
|
||||||
@ -985,15 +1056,19 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
|
|||||||
ourDustLimit,
|
ourDustLimit,
|
||||||
msg.pushAmt,
|
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
|
// processErrorGeneric sends a message to the fundingManager allowing it to
|
||||||
// process the occurred generic error.
|
// process the occurred generic error.
|
||||||
func (f *fundingManager) processErrorGeneric(err *lnwire.ErrorGeneric,
|
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,
|
// handleErrorGenericMsg process the error which was received from remote peer,
|
||||||
@ -1006,22 +1081,22 @@ func (f *fundingManager) handleErrorGenericMsg(fmsg *fundingErrorMsg) {
|
|||||||
case lnwire.ErrMaxPendingChannels:
|
case lnwire.ErrMaxPendingChannels:
|
||||||
fallthrough
|
fallthrough
|
||||||
case lnwire.ErrSynchronizingChain:
|
case lnwire.ErrSynchronizingChain:
|
||||||
peerID := fmsg.peer.id
|
peerKey := fmsg.peerAddress.IdentityKey
|
||||||
chanID := fmsg.err.PendingChannelID
|
chanID := fmsg.err.PendingChannelID
|
||||||
|
|
||||||
resCtx, err := f.cancelReservationCtx(peerID, chanID)
|
ctx, err := f.cancelReservationCtx(peerKey, chanID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fndgLog.Warnf("unable to delete reservation: %v", err)
|
fndgLog.Warnf("unable to delete reservation: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fndgLog.Errorf("Received funding error from %v: %v", fmsg.peer,
|
fndgLog.Errorf("Received funding error from %v: %v", peerKey.SerializeCompressed(),
|
||||||
newLogClosure(func() string {
|
newLogClosure(func() string {
|
||||||
return spew.Sdump(e)
|
return spew.Sdump(e)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
resCtx.err <- grpc.Errorf(e.Code.ToGrpcCode(), e.Problem)
|
ctx.err <- grpc.Errorf(e.Code.ToGrpcCode(), e.Problem)
|
||||||
return
|
return
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1031,10 +1106,10 @@ func (f *fundingManager) handleErrorGenericMsg(fmsg *fundingErrorMsg) {
|
|||||||
|
|
||||||
// cancelReservationCtx do all needed work in order to securely cancel the
|
// cancelReservationCtx do all needed work in order to securely cancel the
|
||||||
// reservation.
|
// reservation.
|
||||||
func (f *fundingManager) cancelReservationCtx(peerID int32,
|
func (f *fundingManager) cancelReservationCtx(peerKey *btcec.PublicKey,
|
||||||
chanID uint64) (*reservationWithCtx, error) {
|
chanID uint64) (*reservationWithCtx, error) {
|
||||||
|
|
||||||
ctx, err := f.getReservationCtx(peerID, chanID)
|
ctx, err := f.getReservationCtx(peerKey, chanID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Errorf("can't find reservation: %v",
|
return nil, errors.Errorf("can't find reservation: %v",
|
||||||
err)
|
err)
|
||||||
@ -1046,25 +1121,27 @@ func (f *fundingManager) cancelReservationCtx(peerID int32,
|
|||||||
err)
|
err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f.deleteReservationCtx(peerID, chanID)
|
f.deleteReservationCtx(peerKey, chanID)
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteReservationCtx is needed in order to securely delete the reservation.
|
// 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
|
// TODO(roasbeef): possibly cancel funding barrier in peer's
|
||||||
// channelManager?
|
// channelManager?
|
||||||
|
peerIDKey := newSerializedKey(peerKey)
|
||||||
f.resMtx.Lock()
|
f.resMtx.Lock()
|
||||||
delete(f.activeReservations[peerID], chanID)
|
delete(f.activeReservations[peerIDKey], chanID)
|
||||||
f.resMtx.Unlock()
|
f.resMtx.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// getReservationCtx returns the reservation context by peer id and channel id.
|
// 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) {
|
chanID uint64) (*reservationWithCtx, error) {
|
||||||
|
|
||||||
|
peerIDKey := newSerializedKey(peerKey)
|
||||||
f.resMtx.RLock()
|
f.resMtx.RLock()
|
||||||
resCtx, ok := f.activeReservations[peerID][chanID]
|
resCtx, ok := f.activeReservations[peerIDKey][chanID]
|
||||||
f.resMtx.RUnlock()
|
f.resMtx.RUnlock()
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -1081,3 +1158,9 @@ func copyPubKey(pub *btcec.PublicKey) *btcec.PublicKey {
|
|||||||
Y: pub.Y,
|
Y: pub.Y,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newSerializedKey(pubKey *btcec.PublicKey) serializedPubKey {
|
||||||
|
serializedKey := serializedPubKey{}
|
||||||
|
copy(serializedKey[:33], pubKey.SerializeCompressed()[:])
|
||||||
|
return serializedKey
|
||||||
|
}
|
||||||
|
691
lnrpc/rpc.pb.go
691
lnrpc/rpc.pb.go
@ -153,13 +153,13 @@ func (NewAddressRequest_AddressType) EnumDescriptor() ([]byte, []int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Transaction struct {
|
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"`
|
Amount float64 `protobuf:"fixed64,2,opt,name=amount" json:"amount,omitempty"`
|
||||||
NumConfirmations int32 `protobuf:"varint,3,opt,name=num_confirmations" json:"num_confirmations,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:"block_hash,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:"block_height,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:"time_stamp,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:"total_fees,omitempty"`
|
TotalFees int64 `protobuf:"varint,7,opt,name=total_fees,json=totalFees" json:"total_fees,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Transaction) Reset() { *m = Transaction{} }
|
func (m *Transaction) Reset() { *m = Transaction{} }
|
||||||
@ -242,11 +242,11 @@ func (m *TransactionDetails) GetTransactions() []*Transaction {
|
|||||||
|
|
||||||
type SendRequest struct {
|
type SendRequest struct {
|
||||||
Dest []byte `protobuf:"bytes,1,opt,name=dest,proto3" json:"dest,omitempty"`
|
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"`
|
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"`
|
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:"payment_hash_string,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:"payment_request,omitempty"`
|
PaymentRequest string `protobuf:"bytes,6,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *SendRequest) Reset() { *m = SendRequest{} }
|
func (m *SendRequest) Reset() { *m = SendRequest{} }
|
||||||
@ -297,8 +297,8 @@ func (m *SendRequest) GetPaymentRequest() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SendResponse struct {
|
type SendResponse struct {
|
||||||
PaymentPreimage []byte `protobuf:"bytes,1,opt,name=payment_preimage,proto3" json:"payment_preimage,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:"payment_route,omitempty"`
|
PaymentRoute *Route `protobuf:"bytes,2,opt,name=payment_route,json=paymentRoute" json:"payment_route,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *SendResponse) Reset() { *m = SendResponse{} }
|
func (m *SendResponse) Reset() { *m = SendResponse{} }
|
||||||
@ -321,9 +321,9 @@ func (m *SendResponse) GetPaymentRoute() *Route {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ChannelPoint struct {
|
type ChannelPoint struct {
|
||||||
FundingTxid []byte `protobuf:"bytes,1,opt,name=funding_txid,proto3" json:"funding_txid,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:"funding_txid_str,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:"output_index,omitempty"`
|
OutputIndex uint32 `protobuf:"varint,3,opt,name=output_index,json=outputIndex" json:"output_index,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ChannelPoint) Reset() { *m = ChannelPoint{} }
|
func (m *ChannelPoint) Reset() { *m = ChannelPoint{} }
|
||||||
@ -377,7 +377,7 @@ func (m *LightningAddress) GetHost() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SendManyRequest struct {
|
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{} }
|
func (m *SendManyRequest) Reset() { *m = SendManyRequest{} }
|
||||||
@ -513,7 +513,7 @@ func (m *ConnectPeerRequest) GetPerm() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ConnectPeerResponse struct {
|
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{} }
|
func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} }
|
||||||
@ -531,9 +531,9 @@ func (m *ConnectPeerResponse) GetPeerId() int32 {
|
|||||||
type HTLC struct {
|
type HTLC struct {
|
||||||
Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"`
|
Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"`
|
||||||
Amount int64 `protobuf:"varint,2,opt,name=amount" json:"amount,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"`
|
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:"expiration_height,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:"revocation_delay,omitempty"`
|
RevocationDelay uint32 `protobuf:"varint,5,opt,name=revocation_delay,json=revocationDelay" json:"revocation_delay,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *HTLC) Reset() { *m = HTLC{} }
|
func (m *HTLC) Reset() { *m = HTLC{} }
|
||||||
@ -577,17 +577,17 @@ func (m *HTLC) GetRevocationDelay() uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ActiveChannel struct {
|
type ActiveChannel struct {
|
||||||
RemotePubkey string `protobuf:"bytes,1,opt,name=remote_pubkey" json:"remote_pubkey,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:"channel_point,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:"chan_id,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"`
|
Capacity int64 `protobuf:"varint,4,opt,name=capacity" json:"capacity,omitempty"`
|
||||||
LocalBalance int64 `protobuf:"varint,5,opt,name=local_balance" json:"local_balance,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:"remote_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:"unsettled_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:"total_satoshis_sent,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:"total_satoshis_received,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:"num_updates,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:"pending_htlcs,omitempty"`
|
PendingHtlcs []*HTLC `protobuf:"bytes,11,rep,name=pending_htlcs,json=pendingHtlcs" json:"pending_htlcs,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ActiveChannel) Reset() { *m = ActiveChannel{} }
|
func (m *ActiveChannel) Reset() { *m = ActiveChannel{} }
|
||||||
@ -697,15 +697,15 @@ func (m *ListChannelsResponse) GetChannels() []*ActiveChannel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Peer struct {
|
type Peer 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"`
|
||||||
PeerId int32 `protobuf:"varint,2,opt,name=peer_id" json:"peer_id,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"`
|
Address string `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"`
|
||||||
BytesSent uint64 `protobuf:"varint,4,opt,name=bytes_sent" json:"bytes_sent,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:"bytes_recv,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:"sat_sent,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:"sat_recv,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"`
|
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{} }
|
func (m *Peer) Reset() { *m = Peer{} }
|
||||||
@ -809,14 +809,14 @@ func (*GetInfoRequest) ProtoMessage() {}
|
|||||||
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
|
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
|
||||||
|
|
||||||
type GetInfoResponse struct {
|
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"`
|
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"`
|
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:"num_active_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:"num_peers,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:"block_height,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:"block_hash,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:"synced_to_chain,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"`
|
Testnet bool `protobuf:"varint,10,opt,name=testnet" json:"testnet,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -889,9 +889,9 @@ func (m *GetInfoResponse) GetTestnet() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ConfirmationUpdate struct {
|
type ConfirmationUpdate struct {
|
||||||
BlockSha []byte `protobuf:"bytes,1,opt,name=block_sha,proto3" json:"block_sha,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:"block_height,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:"num_confs_left,omitempty"`
|
NumConfsLeft uint32 `protobuf:"varint,3,opt,name=num_confs_left,json=numConfsLeft" json:"num_confs_left,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
|
func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
|
||||||
@ -921,7 +921,7 @@ func (m *ConfirmationUpdate) GetNumConfsLeft() uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ChannelOpenUpdate struct {
|
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{} }
|
func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} }
|
||||||
@ -937,7 +937,7 @@ func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ChannelCloseUpdate struct {
|
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"`
|
Success bool `protobuf:"varint,2,opt,name=success" json:"success,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,8 +961,8 @@ func (m *ChannelCloseUpdate) GetSuccess() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CloseChannelRequest struct {
|
type CloseChannelRequest 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"`
|
||||||
TimeLimit int64 `protobuf:"varint,2,opt,name=time_limit" json:"time_limit,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"`
|
Force bool `protobuf:"varint,3,opt,name=force" json:"force,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1010,13 +1010,13 @@ type isCloseStatusUpdate_Update interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CloseStatusUpdate_ClosePending struct {
|
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 {
|
type CloseStatusUpdate_Confirmation struct {
|
||||||
Confirmation *ConfirmationUpdate `protobuf:"bytes,2,opt,name=confirmation,oneof"`
|
Confirmation *ConfirmationUpdate `protobuf:"bytes,2,opt,name=confirmation,oneof"`
|
||||||
}
|
}
|
||||||
type CloseStatusUpdate_ChanClose struct {
|
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() {}
|
func (*CloseStatusUpdate_ClosePending) isCloseStatusUpdate_Update() {}
|
||||||
@ -1161,12 +1161,12 @@ func (m *PendingUpdate) GetTxid() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type OpenChannelRequest struct {
|
type OpenChannelRequest struct {
|
||||||
TargetPeerId int32 `protobuf:"varint,1,opt,name=target_peer_id" json:"target_peer_id,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,proto3" json:"node_pubkey,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:"node_pubkey_string,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:"local_funding_amount,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:"push_sat,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:"num_confs,omitempty"`
|
NumConfs uint32 `protobuf:"varint,6,opt,name=num_confs,json=numConfs" json:"num_confs,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
|
func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
|
||||||
@ -1234,13 +1234,13 @@ type isOpenStatusUpdate_Update interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type OpenStatusUpdate_ChanPending struct {
|
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 {
|
type OpenStatusUpdate_Confirmation struct {
|
||||||
Confirmation *ConfirmationUpdate `protobuf:"bytes,2,opt,name=confirmation,oneof"`
|
Confirmation *ConfirmationUpdate `protobuf:"bytes,2,opt,name=confirmation,oneof"`
|
||||||
}
|
}
|
||||||
type OpenStatusUpdate_ChanOpen struct {
|
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() {}
|
func (*OpenStatusUpdate_ChanPending) isOpenStatusUpdate_Update() {}
|
||||||
@ -1385,7 +1385,7 @@ func (m *PendingChannelRequest) GetStatus() ChannelStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PendingChannelResponse struct {
|
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{} }
|
func (m *PendingChannelResponse) Reset() { *m = PendingChannelResponse{} }
|
||||||
@ -1401,14 +1401,13 @@ func (m *PendingChannelResponse) GetPendingChannels() []*PendingChannelResponse_
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PendingChannelResponse_PendingChannel struct {
|
type PendingChannelResponse_PendingChannel struct {
|
||||||
PeerId int32 `protobuf:"varint,1,opt,name=peer_id" json:"peer_id,omitempty"`
|
IdentityKey string `protobuf:"bytes,1,opt,name=identity_key,json=identityKey" json:"identity_key,omitempty"`
|
||||||
IdentityKey string `protobuf:"bytes,2,opt,name=identity_key" json:"identity_key,omitempty"`
|
ChannelPoint string `protobuf:"bytes,2,opt,name=channel_point,json=channelPoint" json:"channel_point,omitempty"`
|
||||||
ChannelPoint string `protobuf:"bytes,3,opt,name=channel_point" json:"channel_point,omitempty"`
|
Capacity int64 `protobuf:"varint,3,opt,name=capacity" json:"capacity,omitempty"`
|
||||||
Capacity int64 `protobuf:"varint,4,opt,name=capacity" json:"capacity,omitempty"`
|
LocalBalance int64 `protobuf:"varint,4,opt,name=local_balance,json=localBalance" json:"local_balance,omitempty"`
|
||||||
LocalBalance int64 `protobuf:"varint,5,opt,name=local_balance" json:"local_balance,omitempty"`
|
RemoteBalance int64 `protobuf:"varint,5,opt,name=remote_balance,json=remoteBalance" json:"remote_balance,omitempty"`
|
||||||
RemoteBalance int64 `protobuf:"varint,6,opt,name=remote_balance" json:"remote_balance,omitempty"`
|
ClosingTxid string `protobuf:"bytes,6,opt,name=closing_txid,json=closingTxid" json:"closing_txid,omitempty"`
|
||||||
ClosingTxid string `protobuf:"bytes,7,opt,name=closing_txid" json:"closing_txid,omitempty"`
|
Status ChannelStatus `protobuf:"varint,7,opt,name=status,enum=lnrpc.ChannelStatus" json:"status,omitempty"`
|
||||||
Status ChannelStatus `protobuf:"varint,8,opt,name=status,enum=lnrpc.ChannelStatus" json:"status,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PendingChannelResponse_PendingChannel) Reset() { *m = PendingChannelResponse_PendingChannel{} }
|
func (m *PendingChannelResponse_PendingChannel) Reset() { *m = PendingChannelResponse_PendingChannel{} }
|
||||||
@ -1418,13 +1417,6 @@ func (*PendingChannelResponse_PendingChannel) Descriptor() ([]byte, []int) {
|
|||||||
return fileDescriptor0, []int{34, 0}
|
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 {
|
func (m *PendingChannelResponse_PendingChannel) GetIdentityKey() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.IdentityKey
|
return m.IdentityKey
|
||||||
@ -1475,7 +1467,7 @@ func (m *PendingChannelResponse_PendingChannel) GetStatus() ChannelStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WalletBalanceRequest struct {
|
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{} }
|
func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} }
|
||||||
@ -1531,7 +1523,7 @@ func (m *ChannelBalanceResponse) GetBalance() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RouteRequest struct {
|
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"`
|
Amt int64 `protobuf:"varint,2,opt,name=amt" json:"amt,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1555,9 +1547,9 @@ func (m *RouteRequest) GetAmt() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Hop struct {
|
type Hop 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"`
|
||||||
ChanCapacity int64 `protobuf:"varint,2,opt,name=chan_capacity" json:"chan_capacity,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:"amt_to_forward,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"`
|
Fee int64 `protobuf:"varint,4,opt,name=fee" json:"fee,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1595,9 +1587,9 @@ func (m *Hop) GetFee() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Route struct {
|
type Route struct {
|
||||||
TotalTimeLock uint32 `protobuf:"varint,1,opt,name=total_time_lock" json:"total_time_lock,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:"total_fees,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:"total_amt,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"`
|
Hops []*Hop `protobuf:"bytes,4,rep,name=hops" json:"hops,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1635,7 +1627,7 @@ func (m *Route) GetHops() []*Hop {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type NodeInfoRequest struct {
|
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{} }
|
func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
|
||||||
@ -1652,8 +1644,8 @@ func (m *NodeInfoRequest) GetPubKey() string {
|
|||||||
|
|
||||||
type NodeInfo struct {
|
type NodeInfo struct {
|
||||||
Node *LightningNode `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"`
|
Node *LightningNode `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"`
|
||||||
NumChannels uint32 `protobuf:"varint,2,opt,name=num_channels" json:"num_channels,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:"total_capacity,omitempty"`
|
TotalCapacity int64 `protobuf:"varint,3,opt,name=total_capacity,json=totalCapacity" json:"total_capacity,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *NodeInfo) Reset() { *m = NodeInfo{} }
|
func (m *NodeInfo) Reset() { *m = NodeInfo{} }
|
||||||
@ -1683,8 +1675,8 @@ func (m *NodeInfo) GetTotalCapacity() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type LightningNode struct {
|
type LightningNode struct {
|
||||||
LastUpdate uint32 `protobuf:"varint,1,opt,name=last_update" json:"last_update,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:"pub_key,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"`
|
Address string `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"`
|
||||||
Alias string `protobuf:"bytes,4,opt,name=alias" json:"alias,omitempty"`
|
Alias string `protobuf:"bytes,4,opt,name=alias" json:"alias,omitempty"`
|
||||||
}
|
}
|
||||||
@ -1723,10 +1715,10 @@ func (m *LightningNode) GetAlias() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RoutingPolicy struct {
|
type RoutingPolicy struct {
|
||||||
TimeLockDelta uint32 `protobuf:"varint,1,opt,name=time_lock_delta" json:"time_lock_delta,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:"min_htlc,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:"fee_base_msat,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:"fee_rate_milli_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{} }
|
func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
|
||||||
@ -1763,14 +1755,14 @@ func (m *RoutingPolicy) GetFeeRateMilliMsat() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ChannelEdge struct {
|
type ChannelEdge struct {
|
||||||
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id" json:"channel_id,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:"chan_point,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:"last_update,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:"node1_pub,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:"node2_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"`
|
Capacity int64 `protobuf:"varint,6,opt,name=capacity" json:"capacity,omitempty"`
|
||||||
Node1Policy *RoutingPolicy `protobuf:"bytes,7,opt,name=node1_policy" json:"node1_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:"node2_policy,omitempty"`
|
Node2Policy *RoutingPolicy `protobuf:"bytes,8,opt,name=node2_policy,json=node2Policy" json:"node2_policy,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
|
func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
|
||||||
@ -1867,7 +1859,7 @@ func (m *ChannelGraph) GetEdges() []*ChannelEdge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ChanInfoRequest struct {
|
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{} }
|
func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
|
||||||
@ -1891,15 +1883,15 @@ func (*NetworkInfoRequest) ProtoMessage() {}
|
|||||||
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
|
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
|
||||||
|
|
||||||
type NetworkInfo struct {
|
type NetworkInfo struct {
|
||||||
GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter" json:"graph_diameter,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:"avg_out_degree,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:"max_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:"num_nodes,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:"num_channels,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:"total_network_capacity,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:"avg_channel_size,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:"min_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:"max_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{} }
|
func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
|
||||||
@ -1971,7 +1963,7 @@ func (m *NetworkInfo) GetMaxChannelSize() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SetAliasRequest struct {
|
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{} }
|
func (m *SetAliasRequest) Reset() { *m = SetAliasRequest{} }
|
||||||
@ -1997,13 +1989,13 @@ func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0,
|
|||||||
type Invoice struct {
|
type Invoice struct {
|
||||||
Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"`
|
Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"`
|
||||||
Receipt []byte `protobuf:"bytes,2,opt,name=receipt,proto3" json:"receipt,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"`
|
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,proto3" json:"r_hash,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"`
|
Value int64 `protobuf:"varint,5,opt,name=value" json:"value,omitempty"`
|
||||||
Settled bool `protobuf:"varint,6,opt,name=settled" json:"settled,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"`
|
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:"settle_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:"payment_request,omitempty"`
|
PaymentRequest string `protobuf:"bytes,9,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Invoice) Reset() { *m = Invoice{} }
|
func (m *Invoice) Reset() { *m = Invoice{} }
|
||||||
@ -2075,8 +2067,8 @@ func (m *Invoice) GetPaymentRequest() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AddInvoiceResponse struct {
|
type AddInvoiceResponse struct {
|
||||||
RHash []byte `protobuf:"bytes,1,opt,name=r_hash,proto3" json:"r_hash,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:"payment_request,omitempty"`
|
PaymentRequest string `protobuf:"bytes,2,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
|
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
|
||||||
@ -2099,8 +2091,8 @@ func (m *AddInvoiceResponse) GetPaymentRequest() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PaymentHash struct {
|
type PaymentHash struct {
|
||||||
RHashStr string `protobuf:"bytes,1,opt,name=r_hash_str" json:"r_hash_str,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,proto3" json:"r_hash,omitempty"`
|
RHash []byte `protobuf:"bytes,2,opt,name=r_hash,json=rHash,proto3" json:"r_hash,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PaymentHash) Reset() { *m = PaymentHash{} }
|
func (m *PaymentHash) Reset() { *m = PaymentHash{} }
|
||||||
@ -2123,7 +2115,7 @@ func (m *PaymentHash) GetRHash() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ListInvoiceRequest struct {
|
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{} }
|
func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
|
||||||
@ -2163,9 +2155,9 @@ func (*InvoiceSubscription) ProtoMessage() {}
|
|||||||
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
|
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
|
||||||
|
|
||||||
type Payment struct {
|
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"`
|
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"`
|
Path []string `protobuf:"bytes,4,rep,name=path" json:"path,omitempty"`
|
||||||
Fee int64 `protobuf:"varint,5,opt,name=fee" json:"fee,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 {
|
type DebugLevelRequest struct {
|
||||||
Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"`
|
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{} }
|
func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
|
||||||
@ -2275,7 +2267,7 @@ func (m *DebugLevelRequest) GetLevelSpec() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type DebugLevelResponse struct {
|
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{} }
|
func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
|
||||||
@ -2291,7 +2283,7 @@ func (m *DebugLevelResponse) GetSubSystems() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PayReqString struct {
|
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{} }
|
func (m *PayReqString) Reset() { *m = PayReqString{} }
|
||||||
@ -2308,8 +2300,8 @@ func (m *PayReqString) GetPayReq() string {
|
|||||||
|
|
||||||
type PayReq struct {
|
type PayReq struct {
|
||||||
Destination string `protobuf:"bytes,1,opt,name=destination" json:"destination,omitempty"`
|
Destination string `protobuf:"bytes,1,opt,name=destination" json:"destination,omitempty"`
|
||||||
PaymentHash string `protobuf:"bytes,2,opt,name=payment_hash" json:"payment_hash,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:"num_satoshis,omitempty"`
|
NumSatoshis int64 `protobuf:"varint,3,opt,name=num_satoshis,json=numSatoshis" json:"num_satoshis,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PayReq) Reset() { *m = PayReq{} }
|
func (m *PayReq) Reset() { *m = PayReq{} }
|
||||||
@ -3654,203 +3646,246 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
|
|||||||
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
|
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
|
||||||
|
|
||||||
var fileDescriptor0 = []byte{
|
var fileDescriptor0 = []byte{
|
||||||
// 3166 bytes of a gzipped FileDescriptorProto
|
// 3856 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5a, 0x4f, 0x6f, 0x1b, 0xc7,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x5a, 0x4b, 0x73, 0x1b, 0x49,
|
||||||
0x15, 0xf7, 0x8a, 0x94, 0x44, 0x3e, 0x2e, 0x45, 0x6a, 0x24, 0x51, 0x34, 0xed, 0xc4, 0xf2, 0xc6,
|
0x72, 0x56, 0xe3, 0x41, 0x00, 0x09, 0x80, 0x04, 0x8b, 0x2f, 0x08, 0xd2, 0xcc, 0x48, 0x3d, 0xda,
|
||||||
0x49, 0x15, 0xc3, 0xb1, 0x6c, 0x05, 0x45, 0x83, 0x04, 0x49, 0xa1, 0xd8, 0xae, 0x65, 0x54, 0x91,
|
0x15, 0x57, 0x33, 0x26, 0x39, 0xb4, 0x3d, 0xaf, 0x8d, 0xf0, 0x06, 0x45, 0x4a, 0xa2, 0x62, 0x28,
|
||||||
0x15, 0x4b, 0x8e, 0xdb, 0xa4, 0xc5, 0x66, 0xb5, 0x3b, 0xa2, 0x36, 0x5e, 0xee, 0x6e, 0x76, 0x87,
|
0x8a, 0xd3, 0xe0, 0xac, 0xec, 0xdd, 0x70, 0xc0, 0x4d, 0xa0, 0x08, 0xf6, 0x0a, 0xe8, 0xee, 0xe9,
|
||||||
0x92, 0x59, 0x43, 0x97, 0x1e, 0x0a, 0xf4, 0xdc, 0x4b, 0x81, 0x02, 0x45, 0x7b, 0x2c, 0x50, 0x14,
|
0x2e, 0x90, 0xc4, 0x28, 0xb4, 0x07, 0x87, 0x7d, 0xb2, 0x7d, 0x70, 0xf8, 0xbe, 0xe1, 0x8b, 0xcf,
|
||||||
0xed, 0xe7, 0xe8, 0xb1, 0xb7, 0xf6, 0x54, 0xa0, 0xc7, 0x7e, 0x88, 0x62, 0xde, 0xcc, 0xec, 0xce,
|
0xbe, 0xf8, 0x17, 0xf8, 0x17, 0xd8, 0xb1, 0x07, 0x9f, 0x1d, 0xe1, 0x9b, 0x8f, 0xf6, 0xd5, 0x11,
|
||||||
0x2c, 0xe9, 0xa0, 0x41, 0xd1, 0x9b, 0xf8, 0x66, 0xe6, 0xcd, 0x7b, 0x6f, 0xde, 0x9f, 0xdf, 0x7b,
|
0x8e, 0xcc, 0xaa, 0xea, 0xae, 0x6e, 0x80, 0x33, 0xb2, 0x63, 0x4f, 0xe8, 0xca, 0xca, 0xca, 0xaa,
|
||||||
0x2b, 0x68, 0x66, 0xa9, 0x7f, 0x3b, 0xcd, 0x12, 0x96, 0x90, 0xf9, 0x28, 0xce, 0x52, 0x7f, 0x70,
|
0xca, 0xac, 0xcc, 0xfc, 0x2a, 0x0b, 0x50, 0x8b, 0xc2, 0xfe, 0x56, 0x18, 0x05, 0x22, 0x60, 0xe5,
|
||||||
0x75, 0x98, 0x24, 0xc3, 0x88, 0x6e, 0x79, 0x69, 0xb8, 0xe5, 0xc5, 0x71, 0xc2, 0x3c, 0x16, 0x26,
|
0x91, 0x1f, 0x85, 0xfd, 0xce, 0xdd, 0x61, 0x10, 0x0c, 0x47, 0x7c, 0xdb, 0x0d, 0xbd, 0x6d, 0xd7,
|
||||||
0x71, 0x2e, 0x36, 0x39, 0xbf, 0xb1, 0xa0, 0x75, 0x94, 0x79, 0x71, 0xee, 0xf9, 0x9c, 0x4c, 0x3a,
|
0xf7, 0x03, 0xe1, 0x0a, 0x2f, 0xf0, 0x63, 0xc9, 0x64, 0xff, 0xa7, 0x05, 0xf5, 0xd3, 0xc8, 0xf5,
|
||||||
0xb0, 0xc8, 0x5e, 0xb8, 0xa7, 0x5e, 0x7e, 0xda, 0xb7, 0x36, 0xac, 0xcd, 0x26, 0x59, 0x82, 0x05,
|
0x63, 0xb7, 0x8f, 0x64, 0xb6, 0x01, 0x15, 0x71, 0xdd, 0xbb, 0x70, 0xe3, 0x8b, 0xb6, 0x75, 0xcf,
|
||||||
0x6f, 0x94, 0x8c, 0x63, 0xd6, 0x9f, 0xdb, 0xb0, 0x36, 0x2d, 0x72, 0x19, 0x96, 0xe3, 0xf1, 0xc8,
|
0xda, 0xac, 0x39, 0x0b, 0xe2, 0xfa, 0xd0, 0x8d, 0x2f, 0xd8, 0x3a, 0x2c, 0xb8, 0xe3, 0x60, 0xe2,
|
||||||
0xf5, 0x93, 0xf8, 0x24, 0xcc, 0x46, 0x82, 0x57, 0xbf, 0xb6, 0x61, 0x6d, 0xce, 0x13, 0x02, 0x70,
|
0x8b, 0x76, 0xe1, 0x9e, 0xb5, 0x69, 0x39, 0xaa, 0xc5, 0x3e, 0x82, 0x65, 0x7f, 0x32, 0xee, 0xf5,
|
||||||
0x1c, 0x25, 0xfe, 0x73, 0x71, 0xbc, 0x8e, 0xc7, 0x57, 0xc1, 0x96, 0x34, 0x1a, 0x0e, 0x4f, 0x59,
|
0x03, 0xff, 0xdc, 0x8b, 0xc6, 0x52, 0x76, 0xbb, 0x78, 0xcf, 0xda, 0x2c, 0x3b, 0x2d, 0x7f, 0x32,
|
||||||
0x7f, 0x5e, 0xed, 0x64, 0xe1, 0x88, 0xba, 0x39, 0xf3, 0x46, 0x69, 0x7f, 0x61, 0xc3, 0xda, 0xac,
|
0xde, 0x37, 0xe9, 0xec, 0x3d, 0x80, 0xb3, 0x51, 0xd0, 0x7f, 0x2d, 0x27, 0x28, 0xd1, 0x04, 0x35,
|
||||||
0x21, 0x2d, 0x61, 0x5e, 0xe4, 0x9e, 0x50, 0x9a, 0xf7, 0x17, 0x39, 0xcd, 0xe9, 0x43, 0xef, 0x21,
|
0xa2, 0xd0, 0x1c, 0xf7, 0xa1, 0xa1, 0xba, 0xb9, 0x37, 0xbc, 0x10, 0xed, 0x32, 0x89, 0xa9, 0x4b,
|
||||||
0x65, 0x9a, 0x7c, 0xf9, 0x13, 0xfa, 0xf5, 0x98, 0xe6, 0xcc, 0xf9, 0x08, 0x88, 0x46, 0xbe, 0x4f,
|
0x06, 0x22, 0xa1, 0x04, 0xe1, 0x8d, 0x79, 0x2f, 0x16, 0xee, 0x38, 0x6c, 0x2f, 0xdc, 0xb3, 0x36,
|
||||||
0x99, 0x17, 0x46, 0x39, 0xd9, 0x04, 0x9b, 0x69, 0x9b, 0xfb, 0xd6, 0x46, 0x6d, 0xb3, 0xb5, 0x4d,
|
0x8b, 0x4e, 0x0d, 0x29, 0x5d, 0x24, 0x50, 0x77, 0x20, 0xdc, 0x51, 0xef, 0x9c, 0xf3, 0xb8, 0x5d,
|
||||||
0x6e, 0xa3, 0x25, 0x6e, 0x6b, 0x07, 0x9c, 0x5f, 0x5a, 0xd0, 0x3a, 0xa4, 0x71, 0x20, 0xf9, 0x11,
|
0x51, 0xdd, 0x48, 0x79, 0xca, 0x79, 0x6c, 0xb7, 0x61, 0xfd, 0x19, 0x17, 0xc6, 0x7e, 0x63, 0x87,
|
||||||
0x1b, 0xea, 0x01, 0xcd, 0x19, 0x2a, 0x6d, 0x93, 0x15, 0x68, 0xf1, 0x5f, 0x6e, 0xce, 0xb2, 0x30,
|
0x7f, 0x3b, 0xe1, 0xb1, 0xb0, 0x8f, 0x80, 0x19, 0xe4, 0x03, 0x2e, 0x5c, 0x6f, 0x14, 0xb3, 0x4f,
|
||||||
0x1e, 0xa2, 0xe6, 0x4d, 0xd2, 0x82, 0x9a, 0x37, 0x62, 0xa8, 0x6b, 0x8d, 0xeb, 0x95, 0x7a, 0x93,
|
0xa1, 0x21, 0x0c, 0xe6, 0xb6, 0x75, 0xaf, 0xb8, 0x59, 0xdf, 0x65, 0x5b, 0xa4, 0xd9, 0x2d, 0x63,
|
||||||
0x11, 0x8d, 0x59, 0xa9, 0xad, 0x4d, 0xae, 0xc0, 0x8a, 0x4e, 0x55, 0xe7, 0xe7, 0xf1, 0xfc, 0x3a,
|
0x80, 0x93, 0xe1, 0xb3, 0xff, 0xc5, 0x82, 0x7a, 0x97, 0xfb, 0x03, 0x25, 0x9d, 0x31, 0x28, 0x0d,
|
||||||
0x74, 0xd4, 0x62, 0x26, 0x6e, 0x45, 0xcd, 0x9b, 0xce, 0x27, 0x60, 0x0b, 0x51, 0xf2, 0x34, 0x89,
|
0x78, 0x2c, 0x48, 0xa5, 0x0d, 0x87, 0xbe, 0xd9, 0x07, 0x50, 0xc7, 0xdf, 0x5e, 0x2c, 0x22, 0xcf,
|
||||||
0x73, 0x4a, 0xfa, 0xd0, 0x55, 0x1b, 0xd3, 0x8c, 0x86, 0x23, 0x6f, 0x48, 0xa5, 0x5c, 0x6f, 0x40,
|
0x1f, 0x92, 0x56, 0x6b, 0x0e, 0x20, 0xa9, 0x4b, 0x14, 0xd6, 0x82, 0xa2, 0x3b, 0x16, 0xa4, 0xcb,
|
||||||
0xbb, 0x60, 0x91, 0x8c, 0x19, 0x45, 0xc9, 0x5a, 0xdb, 0xb6, 0x54, 0xf0, 0x09, 0xa7, 0x39, 0x47,
|
0xa2, 0x83, 0x9f, 0xa8, 0x9f, 0xd0, 0x9d, 0x8e, 0xb9, 0x2f, 0x52, 0x05, 0x36, 0x9c, 0xba, 0xa2,
|
||||||
0x60, 0xdf, 0x3b, 0xf5, 0xe2, 0x98, 0x46, 0x07, 0x49, 0x18, 0x33, 0x2e, 0xea, 0xc9, 0x38, 0x0e,
|
0x91, 0x0a, 0xb7, 0x60, 0xc5, 0x64, 0xd1, 0xd2, 0xcb, 0x24, 0x7d, 0xd9, 0xe0, 0x54, 0x93, 0x3c,
|
||||||
0xc2, 0x78, 0xe8, 0xb2, 0x17, 0x61, 0x20, 0x59, 0xf5, 0xa1, 0xab, 0x53, 0xb9, 0xa8, 0x52, 0xcf,
|
0x84, 0x25, 0xcd, 0x1f, 0xc9, 0xc5, 0x92, 0x52, 0x6b, 0xce, 0xa2, 0x22, 0x6b, 0x05, 0x8d, 0xa0,
|
||||||
0x55, 0xb0, 0x93, 0x31, 0x4b, 0xc7, 0xcc, 0x0d, 0xe3, 0x80, 0xbe, 0x40, 0x85, 0xdb, 0xce, 0x1d,
|
0x21, 0x77, 0x14, 0x87, 0x81, 0x1f, 0x73, 0xf6, 0x13, 0x68, 0xe9, 0x81, 0x61, 0xc4, 0xbd, 0xb1,
|
||||||
0xe8, 0xee, 0xf1, 0x17, 0x8c, 0xc3, 0x78, 0xb8, 0x13, 0x04, 0x19, 0xcd, 0x73, 0xee, 0x1b, 0xe9,
|
0x3b, 0xe4, 0x6a, 0x7b, 0x5a, 0xe0, 0x89, 0x22, 0xb3, 0x4f, 0xa0, 0x99, 0xcc, 0x11, 0x4c, 0x04,
|
||||||
0xf8, 0xf8, 0x39, 0x9d, 0x48, 0x5f, 0xb1, 0xa1, 0x7e, 0x9a, 0xe4, 0xc2, 0x53, 0x9a, 0xce, 0x2f,
|
0xa7, 0xbd, 0xd6, 0x77, 0x1b, 0x4a, 0x8d, 0x0e, 0xd2, 0x1c, 0xbd, 0x33, 0x6a, 0xd9, 0xbf, 0x86,
|
||||||
0x2c, 0xe8, 0x70, 0xbd, 0x3e, 0xf1, 0xe2, 0x89, 0x32, 0xf3, 0x47, 0x60, 0xf3, 0xc3, 0x47, 0xc9,
|
0xc6, 0xfe, 0x85, 0xeb, 0xfb, 0x7c, 0x74, 0x12, 0x78, 0x3e, 0xed, 0xfc, 0x7c, 0xe2, 0x0f, 0x3c,
|
||||||
0x8e, 0xf0, 0x29, 0xf1, 0x40, 0x9b, 0x52, 0xfe, 0xca, 0xee, 0xdb, 0xfa, 0xd6, 0x07, 0x31, 0xcb,
|
0x7f, 0xd8, 0x13, 0xd7, 0xde, 0x40, 0xcd, 0x54, 0x57, 0xb4, 0xd3, 0x6b, 0x6f, 0xc0, 0x36, 0xa1,
|
||||||
0x26, 0x83, 0x77, 0x61, 0x79, 0x8a, 0xc8, 0x1f, 0xa6, 0x94, 0xa1, 0x0d, 0xf3, 0x67, 0x5e, 0x34,
|
0x65, 0xb2, 0xe0, 0xce, 0x95, 0x52, 0x17, 0x0d, 0xb6, 0xae, 0x88, 0x50, 0x58, 0x30, 0x11, 0xe1,
|
||||||
0x16, 0xa6, 0xa9, 0xbd, 0x3f, 0xf7, 0x9e, 0xe5, 0x6c, 0x40, 0xb7, 0xe4, 0x2c, 0x6d, 0x6c, 0x43,
|
0x44, 0xf4, 0x3c, 0x7f, 0xc0, 0xaf, 0x49, 0xc3, 0x4d, 0xa7, 0x2e, 0x69, 0xcf, 0x91, 0x64, 0xff,
|
||||||
0xbd, 0x30, 0x46, 0x93, 0x2b, 0xc7, 0x77, 0xdc, 0x4b, 0xc2, 0xc2, 0xc3, 0xf8, 0x0e, 0x2f, 0x08,
|
0x11, 0xb4, 0x8e, 0xf0, 0xbc, 0xf9, 0x9e, 0x3f, 0xdc, 0x1b, 0x0c, 0x22, 0x1e, 0xc7, 0xe8, 0x01,
|
||||||
0xb2, 0x99, 0x61, 0x50, 0x73, 0xae, 0xc3, 0xb2, 0x76, 0x62, 0x26, 0xd3, 0x5f, 0x5b, 0xb0, 0xbc,
|
0xe1, 0xe4, 0xec, 0x35, 0x9f, 0x6a, 0xcf, 0x90, 0x2d, 0x34, 0xee, 0x45, 0x10, 0x0b, 0x35, 0x19,
|
||||||
0x4f, 0xcf, 0xa5, 0xb1, 0x14, 0xdb, 0x6d, 0xa8, 0xb3, 0x49, 0x2a, 0x1e, 0x74, 0x69, 0xfb, 0x86,
|
0x7d, 0xdb, 0x7f, 0x6f, 0xc1, 0x12, 0xaa, 0xeb, 0x85, 0xeb, 0x4f, 0xf5, 0x21, 0x38, 0x82, 0x06,
|
||||||
0xd4, 0x7c, 0x6a, 0xdf, 0x6d, 0xf9, 0xf3, 0x68, 0x92, 0x52, 0xe7, 0x31, 0xb4, 0xb4, 0x9f, 0x64,
|
0x8a, 0x3a, 0x0d, 0xf6, 0xa4, 0x1f, 0xc9, 0xc3, 0xb4, 0xa9, 0xb4, 0x90, 0xe3, 0xde, 0x32, 0x59,
|
||||||
0x1d, 0x56, 0x9e, 0x3d, 0x3a, 0xda, 0x7f, 0x70, 0x78, 0xe8, 0x1e, 0x3c, 0xfd, 0xf8, 0x87, 0x0f,
|
0x9f, 0xf8, 0x22, 0x9a, 0x3a, 0x0d, 0xd7, 0x20, 0x75, 0x7e, 0x06, 0xcb, 0x33, 0x2c, 0x78, 0x64,
|
||||||
0x7e, 0xec, 0xee, 0xee, 0x1c, 0xee, 0x76, 0x2f, 0x91, 0x1e, 0x90, 0xfd, 0x07, 0x87, 0x47, 0x0f,
|
0xd2, 0xf5, 0xe1, 0x27, 0x5b, 0x85, 0xf2, 0xa5, 0x3b, 0x9a, 0x48, 0x9d, 0x17, 0x1d, 0xd9, 0xf8,
|
||||||
0xee, 0x1b, 0x74, 0x8b, 0x74, 0xa0, 0xa5, 0x13, 0xe6, 0x9c, 0x01, 0xf4, 0xf7, 0xe9, 0xf9, 0xb3,
|
0xb2, 0xf0, 0xb9, 0x65, 0xff, 0x18, 0x5a, 0xe9, 0x9c, 0xca, 0xa8, 0x0c, 0x4a, 0x89, 0x7a, 0x6b,
|
||||||
0x90, 0xc5, 0x34, 0xcf, 0xcd, 0x8b, 0x9d, 0x37, 0x81, 0xe8, 0xd2, 0x48, 0xd5, 0x3a, 0xb0, 0xe8,
|
0x0e, 0x7d, 0xa3, 0x2a, 0x90, 0x6f, 0x3f, 0xf0, 0x12, 0x6f, 0x41, 0x3e, 0x5c, 0x8c, 0xe6, 0xc3,
|
||||||
0x09, 0x92, 0xd4, 0xee, 0x11, 0x90, 0x7b, 0x49, 0x1c, 0x53, 0x9f, 0x1d, 0x50, 0x9a, 0x29, 0xed,
|
0xef, 0x5c, 0x80, 0x28, 0xea, 0x00, 0x61, 0x3f, 0x84, 0x65, 0x63, 0xfc, 0xf7, 0x4c, 0xf4, 0x1b,
|
||||||
0xde, 0xd4, 0x8c, 0xd6, 0xda, 0x5e, 0x97, 0xda, 0x4d, 0x39, 0x8e, 0x0d, 0xf5, 0x94, 0x66, 0x23,
|
0x0b, 0x96, 0x8f, 0xf9, 0x95, 0x52, 0xb7, 0x9e, 0xea, 0x73, 0x28, 0x89, 0x69, 0x28, 0xcf, 0xd6,
|
||||||
0xb4, 0x65, 0xc3, 0x79, 0x0b, 0x56, 0x0c, 0x56, 0xe5, 0x95, 0x29, 0xa5, 0x99, 0x2b, 0x0d, 0x3a,
|
0xe2, 0xee, 0x03, 0xa5, 0xad, 0x19, 0xbe, 0x2d, 0xd5, 0x3c, 0x9d, 0x86, 0xdc, 0xa1, 0x11, 0xf6,
|
||||||
0xef, 0xa4, 0x50, 0xdf, 0x3d, 0xda, 0xbb, 0x47, 0xba, 0xd0, 0x08, 0x63, 0x3f, 0x19, 0xf1, 0xd0,
|
0x4b, 0xa8, 0x1b, 0x44, 0xb6, 0x01, 0x2b, 0xaf, 0x9e, 0x9f, 0x1e, 0x3f, 0xe9, 0x76, 0x7b, 0x27,
|
||||||
0xe2, 0x2b, 0x8d, 0xea, 0xeb, 0x90, 0x65, 0x68, 0x62, 0xfc, 0xf1, 0xcc, 0x83, 0xfe, 0x6b, 0xf3,
|
0xdf, 0x3c, 0xfe, 0xea, 0xc9, 0x9f, 0xf4, 0x0e, 0xf7, 0xba, 0x87, 0xad, 0x5b, 0x6c, 0x1d, 0xd8,
|
||||||
0xbc, 0x45, 0x5f, 0xa4, 0x61, 0x86, 0x19, 0x4b, 0x65, 0x23, 0x1e, 0xb5, 0x6d, 0x1e, 0x0a, 0x19,
|
0xf1, 0x93, 0xee, 0xe9, 0x93, 0x83, 0x0c, 0xdd, 0x62, 0x4b, 0x50, 0x37, 0x09, 0x05, 0xbb, 0x03,
|
||||||
0x3d, 0x4b, 0x7c, 0xb1, 0x14, 0xd0, 0xc8, 0x9b, 0x60, 0xc8, 0xb6, 0x9d, 0xdf, 0xcf, 0x41, 0x7b,
|
0xed, 0x63, 0x7e, 0xf5, 0xca, 0x13, 0x3e, 0x8f, 0xe3, 0xec, 0xf4, 0xf6, 0x16, 0x30, 0x73, 0x4d,
|
||||||
0xc7, 0x67, 0xe1, 0x19, 0x95, 0x11, 0x45, 0xd6, 0xa0, 0x9d, 0xd1, 0x51, 0xc2, 0xa8, 0x6b, 0x78,
|
0x6a, 0x9b, 0x6d, 0xa8, 0xb8, 0x92, 0xa4, 0x76, 0xaa, 0x9b, 0xf6, 0x37, 0xc0, 0xf6, 0x03, 0xdf,
|
||||||
0xfe, 0x1a, 0xb4, 0x7d, 0xb1, 0xc3, 0x4d, 0x79, 0xd0, 0xc9, 0x50, 0xea, 0xc0, 0x22, 0x27, 0x73,
|
0xe7, 0x7d, 0x71, 0xc2, 0x79, 0xa4, 0x37, 0xfb, 0x91, 0xa1, 0xd7, 0xfa, 0xee, 0x86, 0xda, 0x6c,
|
||||||
0x15, 0xb8, 0x14, 0x75, 0x2e, 0xba, 0xef, 0xa5, 0x9e, 0x1f, 0xb2, 0x09, 0x5e, 0x5e, 0xe3, 0x27,
|
0xfe, 0x24, 0x2a, 0x85, 0x33, 0x28, 0x85, 0x3c, 0x1a, 0x93, 0xba, 0xab, 0x0e, 0x7d, 0xdb, 0x5b,
|
||||||
0xa3, 0xc4, 0xf7, 0x22, 0xf7, 0xd8, 0x8b, 0xbc, 0xd8, 0xa7, 0x78, 0x73, 0x8d, 0xf4, 0x60, 0x49,
|
0xb0, 0x92, 0x11, 0xab, 0xd6, 0xb1, 0x01, 0x95, 0x90, 0xf3, 0xa8, 0xa7, 0x34, 0x5e, 0x76, 0x16,
|
||||||
0xde, 0xa3, 0xe8, 0x22, 0x4b, 0x5e, 0x86, 0xe5, 0x71, 0x9c, 0x53, 0xc6, 0x22, 0x1a, 0x14, 0x4b,
|
0xb0, 0xf9, 0x7c, 0x60, 0xff, 0xa3, 0x05, 0xa5, 0xc3, 0xd3, 0xa3, 0x7d, 0xd6, 0x81, 0xaa, 0xe7,
|
||||||
0x98, 0x2c, 0x79, 0xf2, 0x11, 0x09, 0x34, 0xf7, 0x58, 0x92, 0x9f, 0x86, 0xb9, 0x9b, 0xd3, 0x98,
|
0xf7, 0x83, 0x31, 0x06, 0x0b, 0x8b, 0x04, 0x26, 0xed, 0x9b, 0x2c, 0xcb, 0xee, 0x40, 0x8d, 0x62,
|
||||||
0xf5, 0x1b, 0xb8, 0x78, 0x0d, 0xd6, 0x2b, 0x8b, 0x19, 0xf5, 0x69, 0x78, 0x46, 0x83, 0x7e, 0x13,
|
0x0c, 0x86, 0x67, 0x72, 0xa2, 0x86, 0x53, 0x45, 0xc2, 0x51, 0xd0, 0x7f, 0x8d, 0x79, 0x81, 0x5f,
|
||||||
0x37, 0xac, 0x40, 0x8b, 0xe7, 0xf5, 0x71, 0x1a, 0x78, 0x8c, 0xe6, 0x7d, 0x40, 0x71, 0x1d, 0x68,
|
0x87, 0x5e, 0x44, 0x91, 0x5f, 0x07, 0xf4, 0x12, 0x79, 0x5a, 0x2b, 0xed, 0x50, 0x51, 0xfd, 0x27,
|
||||||
0xa7, 0x54, 0x24, 0x89, 0x53, 0x16, 0xf9, 0x79, 0xbf, 0x85, 0xf1, 0xda, 0x92, 0xef, 0xca, 0x5f,
|
0xd0, 0x8a, 0xf8, 0x65, 0xd0, 0x97, 0xcc, 0x03, 0x3e, 0x72, 0xa7, 0x14, 0xb2, 0x9a, 0xce, 0x52,
|
||||||
0xc3, 0x59, 0x83, 0x95, 0xbd, 0x30, 0x67, 0xd2, 0x40, 0x5a, 0x82, 0x5e, 0x35, 0xc9, 0xf2, 0x55,
|
0x4a, 0x3f, 0x40, 0xb2, 0xfd, 0xcf, 0x45, 0x68, 0xee, 0xf5, 0x85, 0x77, 0xc9, 0x55, 0x80, 0x60,
|
||||||
0xdf, 0x82, 0x86, 0xb4, 0x94, 0xe2, 0xb6, 0x2a, 0xb9, 0x19, 0x86, 0x76, 0xfe, 0x60, 0x41, 0x9d,
|
0x1f, 0x42, 0x33, 0xe2, 0xe3, 0x40, 0xf0, 0x5e, 0xc6, 0x3d, 0x1b, 0x92, 0x78, 0x22, 0x9d, 0xf4,
|
||||||
0xbb, 0x03, 0xba, 0xc1, 0xf8, 0xd8, 0x2d, 0x6d, 0xad, 0xf9, 0xc5, 0x1c, 0x56, 0x13, 0xcd, 0x37,
|
0x43, 0x68, 0xf6, 0x25, 0x7f, 0x2f, 0xc4, 0x88, 0xa2, 0xbc, 0xb5, 0xd1, 0x37, 0xa3, 0xcc, 0x06,
|
||||||
0x6b, 0xb8, 0x83, 0x17, 0xa2, 0x09, 0xa3, 0xd2, 0x00, 0x75, 0x54, 0xa5, 0xa0, 0x65, 0xd4, 0x3f,
|
0x54, 0xb0, 0x8d, 0x6a, 0xc2, 0xed, 0x94, 0x9c, 0x05, 0x6c, 0x3e, 0x1f, 0xa0, 0x76, 0xfa, 0x6e,
|
||||||
0x43, 0x23, 0xe3, 0x6b, 0xe4, 0x1e, 0x13, 0xbb, 0x84, 0x79, 0x25, 0x05, 0xf7, 0x08, 0xab, 0x76,
|
0xe8, 0xf6, 0x3d, 0x31, 0xa5, 0x3d, 0x14, 0x9d, 0xa4, 0x8d, 0x92, 0x47, 0x41, 0xdf, 0x1d, 0xf5,
|
||||||
0x60, 0x31, 0x8c, 0x8f, 0x93, 0x71, 0x1c, 0xa0, 0x25, 0x1b, 0xdc, 0xb7, 0x52, 0xcc, 0x9a, 0xe1,
|
0xce, 0xdc, 0x91, 0xeb, 0xf7, 0x39, 0x2d, 0xbc, 0xe8, 0x34, 0x88, 0xf8, 0x58, 0xd2, 0xd8, 0x8f,
|
||||||
0x88, 0x0a, 0xdb, 0x39, 0x84, 0xe7, 0xc6, 0x1c, 0xbd, 0xb7, 0xd0, 0x7f, 0x0b, 0x96, 0x35, 0x9a,
|
0x60, 0x51, 0xad, 0x51, 0x73, 0xc9, 0xd4, 0xa5, 0x56, 0xae, 0xd9, 0x3e, 0x82, 0xe5, 0x89, 0x1f,
|
||||||
0x54, 0x7e, 0x00, 0xf3, 0x5c, 0x74, 0x55, 0x98, 0x94, 0x1d, 0xf9, 0x26, 0xa7, 0x0b, 0x4b, 0x0f,
|
0x73, 0x21, 0x46, 0x7c, 0x90, 0x70, 0xca, 0x2c, 0xd6, 0x4a, 0x3a, 0x34, 0xf3, 0x16, 0xac, 0xc8,
|
||||||
0x29, 0x7b, 0x14, 0x9f, 0x24, 0x8a, 0xc5, 0x3f, 0x2c, 0xe8, 0x14, 0x24, 0xc9, 0x61, 0x1d, 0x3a,
|
0x5c, 0x17, 0xbb, 0x22, 0x88, 0x2f, 0xbc, 0xb8, 0x17, 0x73, 0x5f, 0xb4, 0xab, 0xc4, 0xbe, 0x4c,
|
||||||
0x61, 0x40, 0x63, 0x16, 0xb2, 0x89, 0xe9, 0x81, 0x6d, 0x98, 0xf7, 0xa2, 0xd0, 0xcb, 0xa5, 0xe7,
|
0x5d, 0x5d, 0xd5, 0xd3, 0xe5, 0xbe, 0x60, 0x9f, 0xc2, 0x46, 0x8e, 0x3f, 0xe2, 0x7d, 0xee, 0x5d,
|
||||||
0x5d, 0x85, 0x55, 0xfe, 0x9c, 0xea, 0xf5, 0x0a, 0x93, 0x63, 0x32, 0xe7, 0xae, 0xc2, 0x57, 0x3d,
|
0xf2, 0x41, 0xbb, 0x46, 0x63, 0xd6, 0x32, 0x63, 0x1c, 0xd5, 0x89, 0x89, 0x0a, 0x33, 0xfc, 0x24,
|
||||||
0xb4, 0x78, 0xb9, 0x28, 0xc2, 0x61, 0x19, 0x9a, 0xe2, 0x28, 0x17, 0x14, 0xe3, 0x60, 0xaa, 0x8a,
|
0x1c, 0xb8, 0x82, 0xc7, 0x6d, 0x20, 0xcd, 0x80, 0x3f, 0x19, 0x7f, 0x23, 0x29, 0x6c, 0x07, 0x9a,
|
||||||
0x2f, 0x20, 0xd5, 0xac, 0xf7, 0x0d, 0x55, 0xe4, 0xf2, 0x49, 0xec, 0xd3, 0xc0, 0x65, 0x09, 0x67,
|
0x21, 0x97, 0x91, 0xf7, 0x42, 0x8c, 0xfa, 0x71, 0xbb, 0x4e, 0x91, 0xad, 0xae, 0x8e, 0x2f, 0x9e,
|
||||||
0x1c, 0xc6, 0x68, 0xa3, 0x06, 0x02, 0x0b, 0x9a, 0xb3, 0x98, 0x32, 0xf4, 0xad, 0x86, 0xf3, 0x14,
|
0x2f, 0xa7, 0xa1, 0x38, 0x0e, 0x91, 0xc1, 0x5e, 0x83, 0x95, 0x23, 0x2f, 0x16, 0xca, 0x82, 0x89,
|
||||||
0x13, 0x48, 0x01, 0x22, 0x9e, 0xa2, 0xe3, 0xf1, 0xcb, 0x05, 0xcf, 0xfc, 0xd4, 0x93, 0x95, 0xaa,
|
0x13, 0x1d, 0xc2, 0x6a, 0x96, 0xac, 0x8e, 0xef, 0x0e, 0x54, 0x95, 0x9d, 0xb4, 0xec, 0x55, 0x25,
|
||||||
0x7a, 0xb9, 0x78, 0xf4, 0x1e, 0x2c, 0x29, 0x1c, 0x92, 0xbb, 0x11, 0x3d, 0x61, 0xb2, 0x4e, 0x7d,
|
0x3b, 0x73, 0x12, 0x9c, 0x84, 0xcb, 0xfe, 0x1f, 0x0b, 0x4a, 0xe8, 0x01, 0x74, 0xf2, 0x27, 0x67,
|
||||||
0x1f, 0x96, 0xa5, 0x0b, 0x3d, 0x4e, 0xa9, 0xe2, 0x7a, 0xb3, 0x1a, 0x9e, 0x22, 0x3f, 0xad, 0x48,
|
0xbd, 0x6c, 0xd4, 0xfe, 0x8a, 0x4f, 0x4d, 0x97, 0x28, 0x98, 0x2e, 0x61, 0xfa, 0x6c, 0x31, 0xe3,
|
||||||
0xfb, 0xeb, 0xe5, 0xd2, 0xf9, 0x00, 0x88, 0xfc, 0x7d, 0x2f, 0x4a, 0x72, 0x2a, 0x39, 0xac, 0x82,
|
0xb3, 0x84, 0x5e, 0xa6, 0x82, 0x2b, 0x3d, 0x97, 0x48, 0x0f, 0x35, 0xa2, 0x90, 0x7e, 0x93, 0xee,
|
||||||
0xed, 0x47, 0x49, 0x5e, 0x29, 0xa2, 0x1d, 0x58, 0xcc, 0xc7, 0xbe, 0xcf, 0x3d, 0x4f, 0xa4, 0xb2,
|
0x88, 0xf7, 0x2f, 0xe9, 0x14, 0xe8, 0x6e, 0x87, 0xf7, 0x2f, 0xd9, 0x6d, 0xa8, 0xc6, 0xae, 0x90,
|
||||||
0x00, 0x56, 0xf0, 0x94, 0xe4, 0xa0, 0xd2, 0xe2, 0xb7, 0xb8, 0xbf, 0xc0, 0x46, 0x51, 0x38, 0x0a,
|
0x63, 0xa5, 0xf1, 0x2b, 0xb1, 0x2b, 0x68, 0xa4, 0xea, 0xa2, 0x71, 0x95, 0xa4, 0x8b, 0x46, 0xb5,
|
||||||
0x55, 0x3e, 0x6b, 0xc3, 0xfc, 0x49, 0x92, 0xf9, 0x14, 0x75, 0x6c, 0x38, 0x7f, 0xb6, 0x60, 0x19,
|
0xa1, 0xe2, 0xf9, 0x67, 0xc1, 0xc4, 0x1f, 0x90, 0x61, 0xab, 0x8e, 0x6e, 0xa2, 0xf7, 0x85, 0x94,
|
||||||
0xaf, 0x39, 0x64, 0x1e, 0x1b, 0xe7, 0x52, 0xc4, 0x77, 0xa0, 0xcd, 0x45, 0xa4, 0xea, 0xd1, 0xe5,
|
0xec, 0xbc, 0x31, 0x57, 0x06, 0xac, 0x22, 0xe1, 0xd4, 0x1b, 0x73, 0x9b, 0x61, 0xfe, 0x8a, 0x29,
|
||||||
0x25, 0xab, 0x85, 0x93, 0x21, 0x55, 0x6c, 0xde, 0xbd, 0x44, 0xee, 0x82, 0xad, 0x83, 0x38, 0x09,
|
0x08, 0x24, 0xda, 0xfd, 0x14, 0x96, 0x0d, 0x9a, 0x52, 0xed, 0x7d, 0x28, 0xe3, 0xbe, 0x35, 0xb4,
|
||||||
0x25, 0x2e, 0x2b, 0x91, 0xa6, 0x9e, 0x66, 0xf7, 0x12, 0xd9, 0x02, 0xc0, 0x74, 0x86, 0xd7, 0xa0,
|
0xd1, 0x36, 0xa3, 0xe8, 0x21, 0x7b, 0xec, 0x16, 0x2c, 0x3e, 0xe3, 0xe2, 0xb9, 0x7f, 0x1e, 0x68,
|
||||||
0x2c, 0xda, 0x81, 0x29, 0x9b, 0xed, 0x5e, 0xfa, 0xb8, 0x01, 0x0b, 0x22, 0xa1, 0x38, 0xaf, 0x41,
|
0x49, 0xbf, 0x2d, 0xc0, 0x52, 0x42, 0x52, 0x82, 0x1e, 0xc2, 0x92, 0x37, 0xe0, 0xbe, 0xf0, 0xc4,
|
||||||
0xdb, 0x10, 0xc0, 0xa8, 0x95, 0xb6, 0xf3, 0x3b, 0x0b, 0x08, 0x7f, 0xaf, 0x8a, 0xdd, 0x7a, 0xb0,
|
0x34, 0xeb, 0x87, 0x8b, 0x9a, 0xac, 0x3c, 0x71, 0x15, 0xca, 0xee, 0xc8, 0x73, 0x63, 0xe5, 0x81,
|
||||||
0xc4, 0xbc, 0x6c, 0x48, 0x99, 0x6b, 0x54, 0x02, 0x4c, 0x56, 0x49, 0x50, 0xe4, 0xe0, 0x39, 0x7c,
|
0xb2, 0xc1, 0x76, 0x60, 0x15, 0x0f, 0x99, 0x3e, 0x47, 0x89, 0xb9, 0x65, 0x6e, 0x66, 0xfe, 0x64,
|
||||||
0x8c, 0x01, 0x10, 0x8d, 0xa8, 0xb0, 0x57, 0x4d, 0x85, 0x83, 0xc8, 0xb2, 0x0a, 0xf3, 0xc8, 0x72,
|
0x7c, 0x22, 0xbb, 0xf4, 0xe1, 0xc0, 0xe3, 0x8f, 0x23, 0x5c, 0x3a, 0x01, 0xe9, 0x00, 0x19, 0x62,
|
||||||
0x51, 0x57, 0x51, 0x9f, 0x8e, 0x39, 0x5c, 0xf3, 0x98, 0x4c, 0xbf, 0x32, 0x06, 0xd0, 0xbb, 0x84,
|
0x10, 0x93, 0x66, 0xce, 0x46, 0x8c, 0xfa, 0x92, 0x33, 0xe0, 0x6e, 0x65, 0x70, 0xa9, 0x92, 0x58,
|
||||||
0xb7, 0x3b, 0x7f, 0xb4, 0xa0, 0xcb, 0x45, 0x34, 0x6c, 0x7e, 0x0b, 0x6c, 0xb4, 0xc8, 0xff, 0xcd,
|
0x1e, 0xc5, 0x33, 0xc8, 0x73, 0x41, 0x42, 0x82, 0x1c, 0xf2, 0x34, 0xb0, 0x6b, 0x35, 0x8f, 0x5d,
|
||||||
0xe4, 0xef, 0x40, 0x13, 0x2f, 0x48, 0x52, 0x1a, 0x4b, 0x8b, 0xf7, 0x4d, 0x8b, 0x97, 0x6e, 0x6e,
|
0x7f, 0x0c, 0x4b, 0xf1, 0xd4, 0xef, 0xf3, 0x41, 0x4f, 0x04, 0xb8, 0x1a, 0xcf, 0x27, 0xa3, 0x54,
|
||||||
0x18, 0xfc, 0x43, 0x58, 0x93, 0xd7, 0x57, 0x6c, 0x7a, 0x03, 0x16, 0x72, 0x54, 0x41, 0x42, 0x90,
|
0x9d, 0xa6, 0x24, 0x9f, 0x06, 0xfb, 0x48, 0x44, 0x83, 0x0a, 0x1e, 0x0b, 0x9f, 0x0b, 0xf2, 0xa4,
|
||||||
0x55, 0x93, 0x9d, 0x50, 0xcf, 0xf9, 0xd3, 0x1c, 0xf4, 0xaa, 0xe7, 0x65, 0x0a, 0xfa, 0x01, 0x74,
|
0xaa, 0xa3, 0x9b, 0xf6, 0x77, 0x94, 0x12, 0x12, 0xb4, 0x2c, 0xbd, 0x0b, 0x97, 0x2d, 0xa7, 0x8d,
|
||||||
0xa7, 0xd2, 0x8a, 0xc8, 0x67, 0xb7, 0x4c, 0xbd, 0x2b, 0x07, 0x2b, 0xe4, 0xc1, 0x5f, 0x2d, 0x58,
|
0x2f, 0x5c, 0x05, 0x7b, 0xaa, 0x44, 0xe8, 0x5e, 0xb8, 0x33, 0xcb, 0x2e, 0xcc, 0x02, 0xe6, 0x07,
|
||||||
0x32, 0x49, 0x53, 0x25, 0x9f, 0x87, 0x5d, 0x91, 0xee, 0xd4, 0x4b, 0xcf, 0xa8, 0xb6, 0xe2, 0x91,
|
0xb0, 0xa8, 0xf1, 0x79, 0xdc, 0x1b, 0xf1, 0x73, 0xa1, 0x54, 0xda, 0x50, 0xe0, 0x3c, 0x3e, 0xe2,
|
||||||
0xff, 0xe7, 0xe2, 0x5a, 0x0d, 0xf2, 0x45, 0x64, 0x5b, 0x1a, 0xac, 0xf1, 0x0d, 0x06, 0xbb, 0x05,
|
0xe7, 0xc2, 0x7e, 0x01, 0xcb, 0x4a, 0x51, 0x2f, 0x43, 0xae, 0xa7, 0xfe, 0x3c, 0x1f, 0x33, 0x65,
|
||||||
0xab, 0xcf, 0xbc, 0x28, 0xa2, 0xec, 0x63, 0xc1, 0x52, 0x99, 0x7b, 0x15, 0xec, 0x73, 0x81, 0xb3,
|
0x5a, 0x5a, 0x51, 0x67, 0xc4, 0x04, 0x68, 0xd9, 0x40, 0x6a, 0x7f, 0x0d, 0x4c, 0xf5, 0xee, 0x8f,
|
||||||
0xdc, 0x24, 0x8e, 0x44, 0xb6, 0x6e, 0x38, 0x9b, 0xb0, 0x56, 0xd9, 0x5d, 0x82, 0x1e, 0x25, 0x13,
|
0x82, 0x98, 0x2b, 0x79, 0xf7, 0xa1, 0xd1, 0x1f, 0x05, 0x71, 0x1e, 0xc4, 0x29, 0x1a, 0x81, 0xb8,
|
||||||
0xdf, 0x69, 0x39, 0xeb, 0xb0, 0x26, 0x2f, 0x32, 0x19, 0x3b, 0x6f, 0x43, 0xaf, 0xba, 0x30, 0x9b,
|
0x36, 0x54, 0xe2, 0x49, 0xbf, 0x8f, 0xce, 0x27, 0xd3, 0x9a, 0x6e, 0xda, 0x7f, 0x61, 0xc1, 0x0a,
|
||||||
0x47, 0xcd, 0xb9, 0x05, 0x36, 0xb6, 0x06, 0x4a, 0xa6, 0xa9, 0x92, 0x2a, 0x5b, 0x1b, 0x01, 0x6d,
|
0x09, 0xd3, 0xce, 0x9e, 0xe0, 0x83, 0xff, 0xe7, 0x22, 0x93, 0xab, 0xc4, 0xc8, 0x1b, 0x7b, 0x3a,
|
||||||
0x9f, 0x40, 0x6d, 0x37, 0x49, 0x75, 0xec, 0x62, 0x61, 0xb5, 0x94, 0x56, 0x77, 0x0b, 0x1b, 0xcf,
|
0xb5, 0xd1, 0x55, 0xe2, 0x08, 0x09, 0x78, 0x4e, 0xcf, 0x83, 0xa8, 0xcf, 0x49, 0x5f, 0x55, 0x47,
|
||||||
0x29, 0x63, 0x7a, 0x23, 0xc6, 0xd3, 0xfd, 0x49, 0x92, 0x9d, 0x7b, 0x59, 0x20, 0x3b, 0xa4, 0x16,
|
0x36, 0xec, 0x7f, 0xb3, 0x60, 0x99, 0x96, 0xd1, 0x15, 0xae, 0x98, 0xc4, 0x6a, 0x67, 0x3f, 0x85,
|
||||||
0xd4, 0x4e, 0x28, 0x15, 0x0f, 0xe1, 0x78, 0x30, 0x8f, 0x12, 0xf0, 0xfa, 0x20, 0x70, 0x88, 0xc8,
|
0x26, 0xee, 0x82, 0xeb, 0xf3, 0xab, 0x16, 0xb1, 0x9a, 0x78, 0x13, 0x51, 0x25, 0xf3, 0xe1, 0x2d,
|
||||||
0x71, 0x1c, 0x9f, 0x59, 0xaa, 0x98, 0x68, 0xed, 0x5f, 0x01, 0xe3, 0x04, 0xad, 0xec, 0xbb, 0xfa,
|
0x87, 0xd4, 0xc0, 0x15, 0x95, 0xfd, 0x0c, 0x1a, 0xe6, 0xed, 0x49, 0xa1, 0xe3, 0xdb, 0x7a, 0x03,
|
||||||
0xbc, 0xc5, 0x48, 0x79, 0xa9, 0xe2, 0x0e, 0x07, 0x0a, 0x88, 0x24, 0xa9, 0xe3, 0x40, 0x67, 0x3f,
|
0x33, 0x47, 0x82, 0x04, 0x18, 0x54, 0xf6, 0x25, 0x00, 0xa5, 0x2d, 0x92, 0x4a, 0xcb, 0x35, 0x86,
|
||||||
0x09, 0xa8, 0x56, 0x40, 0xa7, 0xf4, 0x74, 0x7e, 0x02, 0x0d, 0xb5, 0x87, 0x38, 0x50, 0xe7, 0xe9,
|
0xcf, 0x98, 0xe1, 0xf0, 0x96, 0x53, 0x43, 0x76, 0x22, 0x3d, 0xae, 0xc2, 0x82, 0x0c, 0xec, 0xf6,
|
||||||
0xa2, 0x12, 0xb2, 0x05, 0x54, 0xe5, 0xfb, 0xf8, 0xe3, 0x61, 0x1a, 0x50, 0x6e, 0x3e, 0x87, 0xa2,
|
0x87, 0xd0, 0xcc, 0xac, 0x33, 0x83, 0xd1, 0x1a, 0x0a, 0xa3, 0xfd, 0x97, 0x05, 0x0c, 0x4f, 0x48,
|
||||||
0xf2, 0xac, 0x84, 0x62, 0x15, 0x96, 0x40, 0xd9, 0x9c, 0xa7, 0xd0, 0x36, 0x8f, 0xaf, 0x40, 0x2b,
|
0xce, 0x08, 0x0f, 0x60, 0x51, 0xb8, 0xd1, 0x90, 0x8b, 0x5e, 0x16, 0x66, 0x34, 0x24, 0xf5, 0x44,
|
||||||
0xf2, 0x72, 0x26, 0x41, 0x95, 0x54, 0x54, 0x13, 0xaa, 0x00, 0x89, 0x26, 0x7c, 0x29, 0x4a, 0x39,
|
0x46, 0x56, 0x4c, 0x24, 0xc1, 0x20, 0x49, 0xd3, 0x05, 0x92, 0x0b, 0x48, 0x52, 0xa1, 0xe1, 0x63,
|
||||||
0xb6, 0xd0, 0x4e, 0x0c, 0x6d, 0x6e, 0xbb, 0x30, 0x1e, 0x1e, 0x24, 0x51, 0xe8, 0x4f, 0xd0, 0x86,
|
0x60, 0x06, 0x83, 0xbe, 0xbb, 0xc8, 0x28, 0xdc, 0x4a, 0xf9, 0xd4, 0xd5, 0x65, 0x07, 0x56, 0x65,
|
||||||
0xca, 0x7a, 0x1c, 0xae, 0x32, 0x4f, 0xb2, 0xee, 0x42, 0x63, 0x14, 0xc6, 0x08, 0xd5, 0xa4, 0x05,
|
0xe2, 0xd5, 0xb0, 0x5f, 0x81, 0x14, 0x99, 0xa0, 0x19, 0xf5, 0x3d, 0x95, 0x5d, 0x12, 0x23, 0x63,
|
||||||
0xd7, 0xa0, 0x7d, 0x42, 0xb9, 0x9b, 0xe7, 0xd4, 0x1d, 0xf1, 0xf4, 0x56, 0x53, 0x50, 0x91, 0x93,
|
0x9c, 0x0d, 0x27, 0x78, 0x29, 0x72, 0x85, 0xca, 0xd2, 0x15, 0x6c, 0x77, 0x5d, 0xa1, 0xa3, 0x03,
|
||||||
0x33, 0x8f, 0x51, 0x77, 0x14, 0x46, 0x51, 0x28, 0x16, 0xc5, 0x5b, 0xfd, 0xdd, 0x82, 0x96, 0xf4,
|
0xb9, 0x89, 0xf2, 0xfe, 0xaa, 0xf6, 0x10, 0xfb, 0x5f, 0x2d, 0x68, 0xe1, 0xae, 0x33, 0x36, 0xff,
|
||||||
0xac, 0x07, 0xc1, 0x90, 0xf2, 0x97, 0x51, 0xd1, 0x56, 0xf8, 0x82, 0xa4, 0x19, 0x60, 0xb7, 0xa2,
|
0x02, 0xe8, 0x38, 0xbd, 0xa3, 0xc9, 0xeb, 0xc8, 0xfb, 0x3b, 0xb3, 0xf8, 0x67, 0x40, 0x26, 0xec,
|
||||||
0x6d, 0xad, 0x00, 0x13, 0x49, 0x40, 0xef, 0xf2, 0xac, 0x2c, 0x47, 0x02, 0x92, 0xb4, 0x8d, 0xa4,
|
0x05, 0x21, 0xf7, 0x95, 0xc1, 0xdb, 0x59, 0x83, 0xa7, 0x6e, 0x7c, 0x78, 0x4b, 0xe6, 0x45, 0xa4,
|
||||||
0xf9, 0xa9, 0xc8, 0x15, 0xa1, 0x78, 0x13, 0x6c, 0x79, 0x0e, 0x75, 0xc6, 0x50, 0x2c, 0x5f, 0xc9,
|
0x18, 0xe6, 0x7e, 0x02, 0x6b, 0xd9, 0x88, 0xaa, 0x6d, 0xf9, 0x31, 0x2c, 0xc4, 0xb4, 0x4f, 0x05,
|
||||||
0xb4, 0x87, 0xdc, 0xbb, 0xad, 0xf6, 0x36, 0x5e, 0xbd, 0x97, 0xa3, 0x55, 0xa9, 0xdb, 0xc3, 0xcc,
|
0xb9, 0x57, 0xb3, 0x82, 0xa5, 0x0e, 0x1c, 0xc5, 0x63, 0xff, 0x65, 0x11, 0xd6, 0xf3, 0x72, 0x54,
|
||||||
0x4b, 0x4f, 0x55, 0x30, 0x7d, 0x56, 0xf4, 0xcc, 0x48, 0x26, 0x6f, 0xc0, 0x3c, 0x67, 0xa9, 0x12,
|
0x46, 0x78, 0x05, 0xad, 0x99, 0x70, 0x2e, 0xb3, 0xcc, 0xc7, 0x59, 0x25, 0xe5, 0x06, 0xe6, 0xc9,
|
||||||
0xdb, 0x6c, 0xef, 0xb8, 0x0e, 0xf3, 0x34, 0x18, 0xa2, 0xb7, 0xea, 0x63, 0x06, 0xcd, 0x76, 0xdc,
|
0x4b, 0x61, 0x36, 0xf2, 0x77, 0xfe, 0xb6, 0x00, 0x8b, 0x59, 0x1e, 0x0c, 0x2d, 0x49, 0xf6, 0x49,
|
||||||
0x29, 0xf9, 0xcf, 0x8a, 0x53, 0x1a, 0x71, 0xe5, 0xac, 0xf2, 0x86, 0x8b, 0x9d, 0x27, 0xd9, 0x73,
|
0x53, 0x4f, 0x5d, 0xd3, 0xbe, 0x7a, 0x57, 0x04, 0x68, 0x02, 0xbd, 0xe2, 0x0f, 0x01, 0xbd, 0xd2,
|
||||||
0x1d, 0xfc, 0xfd, 0xdb, 0x82, 0x96, 0x46, 0xe6, 0x4e, 0x37, 0xe4, 0xa2, 0xb9, 0x41, 0xe8, 0x8d,
|
0x3b, 0x01, 0xbd, 0xf2, 0x3c, 0xa0, 0x97, 0x0f, 0x85, 0xf2, 0xce, 0x9d, 0x09, 0x85, 0xa9, 0x1d,
|
||||||
0x28, 0xa3, 0x99, 0x7c, 0x73, 0x1e, 0x7e, 0x67, 0x43, 0x37, 0x19, 0x33, 0x37, 0xa0, 0xc3, 0x8c,
|
0x2a, 0xef, 0x60, 0x87, 0x2f, 0x60, 0xf5, 0x95, 0x3b, 0x1a, 0x71, 0xa1, 0x66, 0xd0, 0xd6, 0xbc,
|
||||||
0x52, 0x39, 0xa7, 0xe9, 0xc1, 0xd2, 0xc8, 0x7b, 0xa1, 0xd3, 0x6b, 0x3a, 0xba, 0x13, 0xda, 0xd5,
|
0x0f, 0x8d, 0x2b, 0x79, 0x61, 0xe9, 0x05, 0xfe, 0x68, 0xaa, 0xb0, 0x7d, 0x5d, 0xd1, 0x5e, 0xfa,
|
||||||
0x15, 0xba, 0x33, 0xbc, 0x5c, 0x60, 0xbe, 0xd7, 0xa1, 0x27, 0xbc, 0x3c, 0x16, 0x52, 0xb8, 0x95,
|
0xa3, 0xa9, 0xfd, 0x09, 0xac, 0xe5, 0x86, 0xa6, 0xb7, 0x17, 0xbd, 0x09, 0x8b, 0x6a, 0x3e, 0xba,
|
||||||
0x17, 0xea, 0x43, 0x97, 0x5f, 0xac, 0x5c, 0x23, 0x0f, 0x7f, 0x26, 0x1a, 0x11, 0x8b, 0xaf, 0x70,
|
0x69, 0x6f, 0xc0, 0x9a, 0x5a, 0x46, 0x76, 0x3a, 0x7b, 0x17, 0xd6, 0xf3, 0x1d, 0xf3, 0x85, 0x15,
|
||||||
0x37, 0x34, 0x56, 0x1a, 0xea, 0x0c, 0x17, 0xca, 0x58, 0x11, 0x10, 0xfa, 0x06, 0x74, 0x0e, 0x29,
|
0x53, 0x61, 0x5f, 0x40, 0x43, 0x96, 0x00, 0xd4, 0x92, 0x6f, 0x84, 0x6c, 0xaa, 0x20, 0x52, 0x48,
|
||||||
0xdb, 0xe1, 0x6e, 0xaf, 0x0c, 0xc5, 0x25, 0xa5, 0xe7, 0xae, 0x08, 0x05, 0x11, 0xbf, 0x84, 0xf7,
|
0x0a, 0x22, 0xf6, 0x1b, 0x28, 0x1e, 0x06, 0xa1, 0x89, 0xdb, 0xad, 0x0c, 0x6e, 0x57, 0x36, 0xef,
|
||||||
0xe9, 0x6a, 0x97, 0xc8, 0x76, 0xce, 0x5f, 0x2c, 0x58, 0x7c, 0x14, 0x9f, 0x25, 0xa1, 0x8f, 0xa0,
|
0x25, 0x36, 0x95, 0x63, 0xc9, 0xe6, 0xfb, 0xda, 0xae, 0x0f, 0x60, 0xd1, 0x1d, 0x0b, 0x4c, 0xdb,
|
||||||
0x62, 0x44, 0x47, 0x49, 0xd9, 0x28, 0x60, 0x93, 0x93, 0x32, 0x89, 0x10, 0x08, 0x40, 0x56, 0x8e,
|
0xe7, 0x41, 0x74, 0xe5, 0x46, 0x03, 0x65, 0xf9, 0x86, 0x3b, 0x16, 0xa7, 0xc1, 0x53, 0x49, 0xc3,
|
||||||
0x54, 0x44, 0x5f, 0xb8, 0x04, 0x0b, 0x99, 0x3e, 0xc2, 0x29, 0xe6, 0x07, 0xf3, 0x0a, 0xfe, 0xcb,
|
0xc9, 0xcf, 0xb9, 0xb6, 0x39, 0x7e, 0xda, 0x7f, 0x65, 0x41, 0x99, 0x16, 0x8e, 0xb9, 0x5f, 0x22,
|
||||||
0x6e, 0x0b, 0xd5, 0x6e, 0x60, 0x16, 0xcc, 0xa8, 0x6c, 0x15, 0xb9, 0x9f, 0x2f, 0xaa, 0xf6, 0x49,
|
0x6b, 0x99, 0x4f, 0xf0, 0x3a, 0x64, 0x51, 0x08, 0x69, 0x12, 0x19, 0x11, 0x19, 0xdd, 0x89, 0xb2,
|
||||||
0xec, 0x13, 0x44, 0xa1, 0xee, 0x8c, 0x89, 0x4f, 0x13, 0xf5, 0xf8, 0x10, 0xc8, 0x4e, 0x10, 0x48,
|
0xd5, 0xa9, 0x42, 0xae, 0x3a, 0x85, 0x31, 0x48, 0x76, 0xa7, 0x65, 0x9f, 0x2a, 0x11, 0xf6, 0xc6,
|
||||||
0xa9, 0x8b, 0xbc, 0x5d, 0x8a, 0x22, 0xd0, 0xe5, 0x8c, 0xe3, 0x62, 0xb2, 0x72, 0x17, 0x5a, 0x07,
|
0x82, 0xbd, 0x0f, 0xa5, 0x8b, 0x20, 0x44, 0x7c, 0x83, 0x1e, 0x04, 0x1a, 0x5b, 0x07, 0xa1, 0x43,
|
||||||
0x62, 0x61, 0xd7, 0xcb, 0x4f, 0x85, 0x5a, 0x6a, 0xde, 0x54, 0xce, 0x2b, 0x24, 0x2f, 0x54, 0xdd,
|
0x74, 0xfb, 0x11, 0x2c, 0x1d, 0x07, 0x03, 0x6e, 0xc0, 0xb4, 0x1b, 0x15, 0x69, 0xff, 0x1a, 0xaa,
|
||||||
0xb9, 0x09, 0x84, 0xb7, 0x23, 0xc5, 0x95, 0x45, 0x71, 0x52, 0xa5, 0x5c, 0x2b, 0x4e, 0xdf, 0x13,
|
0x9a, 0x97, 0x6d, 0x42, 0x09, 0x23, 0x6b, 0x2e, 0x7c, 0x25, 0x57, 0x4e, 0xe4, 0x73, 0x88, 0x03,
|
||||||
0x1d, 0x5d, 0x55, 0xbc, 0x0d, 0xde, 0x76, 0x23, 0x49, 0x85, 0xc5, 0x92, 0xf4, 0x78, 0xb9, 0x93,
|
0x8f, 0x12, 0x85, 0x48, 0xed, 0xcb, 0x05, 0x89, 0x91, 0x30, 0x4a, 0x6a, 0x8c, 0xf5, 0x23, 0x58,
|
||||||
0x07, 0x97, 0xfc, 0xf3, 0x70, 0x7c, 0x9c, 0xfb, 0x59, 0x98, 0xe2, 0xac, 0xed, 0x4b, 0x58, 0x94,
|
0x94, 0x3b, 0xc8, 0x39, 0x91, 0xd4, 0x83, 0xd6, 0xb8, 0x3d, 0x85, 0x66, 0x66, 0x02, 0xcc, 0x0c,
|
||||||
0xe2, 0x4e, 0x8d, 0xcd, 0x66, 0xcd, 0x6c, 0xa6, 0x4d, 0x2c, 0x92, 0x96, 0x0d, 0xf5, 0xd4, 0x63,
|
0x23, 0x37, 0x16, 0xea, 0x8e, 0xa1, 0x94, 0x07, 0x48, 0x52, 0xc1, 0xd6, 0xd8, 0x4a, 0x21, 0x73,
|
||||||
0xa7, 0x98, 0xfa, 0x9b, 0xaa, 0xbc, 0xe0, 0x2b, 0xa9, 0x1e, 0x54, 0xde, 0x52, 0xf4, 0x60, 0xef,
|
0x26, 0x6e, 0x46, 0xeb, 0x09, 0xce, 0x2c, 0x19, 0x38, 0xd3, 0xfe, 0x07, 0x0b, 0x9a, 0x68, 0x34,
|
||||||
0x89, 0x1e, 0xb4, 0x24, 0x97, 0x9a, 0x48, 0x29, 0xaa, 0x9a, 0xc8, 0xad, 0xce, 0x00, 0xfa, 0xf7,
|
0xcf, 0x1f, 0x9e, 0x04, 0x23, 0xaf, 0x3f, 0x25, 0xe3, 0x69, 0xb3, 0xe1, 0xd5, 0x53, 0xb8, 0x89,
|
||||||
0x69, 0x44, 0x19, 0xdd, 0x89, 0xa2, 0x2a, 0xd7, 0x2b, 0x70, 0x79, 0xc6, 0x9a, 0xf4, 0xc6, 0xef,
|
0xf1, 0x94, 0xdd, 0x0e, 0x90, 0x88, 0xc9, 0x63, 0xec, 0xf9, 0x74, 0xc3, 0x51, 0xa6, 0xab, 0x8c,
|
||||||
0xc2, 0xf2, 0x7d, 0x7a, 0x3c, 0x1e, 0xee, 0xd1, 0xb3, 0x12, 0x72, 0xd9, 0x50, 0xcf, 0x4f, 0x93,
|
0x3d, 0x1f, 0xef, 0x33, 0xcc, 0x86, 0xe6, 0x39, 0x47, 0x8f, 0x8f, 0x79, 0x6f, 0x8c, 0xc9, 0x45,
|
||||||
0x73, 0x39, 0xac, 0x20, 0x00, 0x11, 0x5f, 0x75, 0xf3, 0x94, 0xfa, 0xf2, 0x45, 0xdf, 0x06, 0xa2,
|
0xee, 0xba, 0x7e, 0xce, 0xf9, 0x63, 0x37, 0xe6, 0x2f, 0x62, 0x57, 0xb0, 0xdf, 0x83, 0x15, 0xe4,
|
||||||
0x1f, 0x93, 0x72, 0x72, 0xa7, 0x1a, 0x1f, 0xbb, 0xf9, 0x24, 0x67, 0x74, 0xa4, 0x62, 0xe0, 0x1a,
|
0x89, 0x5c, 0xc1, 0x7b, 0x63, 0x6f, 0x34, 0xf2, 0x24, 0xa7, 0x3c, 0x4f, 0xad, 0x73, 0xce, 0x1d,
|
||||||
0xd8, 0x07, 0xde, 0xe4, 0x09, 0xfd, 0xfa, 0x10, 0x01, 0x2e, 0xd6, 0x13, 0x6f, 0xc2, 0x3d, 0xa4,
|
0x57, 0xf0, 0x17, 0xd8, 0x81, 0xec, 0xf6, 0x3f, 0x15, 0xa0, 0xae, 0xd4, 0xfa, 0x64, 0x30, 0xe4,
|
||||||
0x98, 0xcc, 0x2c, 0x88, 0x0d, 0x6a, 0x8c, 0x19, 0xc6, 0x02, 0x6e, 0x5a, 0x6a, 0xbc, 0x67, 0x3c,
|
0x78, 0x74, 0x74, 0xf4, 0x4a, 0x4e, 0x79, 0x4d, 0x51, 0x9e, 0x0f, 0x74, 0x77, 0x26, 0xb2, 0x51,
|
||||||
0x41, 0x31, 0xf4, 0xe3, 0x39, 0x40, 0x4d, 0x07, 0x84, 0xc9, 0x6f, 0x6e, 0x43, 0xdb, 0x40, 0x39,
|
0xb7, 0x0c, 0x6b, 0x39, 0xfd, 0x16, 0x67, 0xf4, 0x8b, 0xe9, 0x2f, 0x18, 0xf0, 0x4f, 0x30, 0xf5,
|
||||||
0x64, 0x11, 0x6a, 0x3b, 0x7b, 0x7b, 0xdd, 0x4b, 0xa4, 0x05, 0x8b, 0x8f, 0x0f, 0x1e, 0xec, 0x3f,
|
0x2a, 0x85, 0x55, 0x89, 0x70, 0x32, 0x39, 0xd3, 0x9d, 0xbb, 0xd4, 0x59, 0x4e, 0x3b, 0x77, 0xb1,
|
||||||
0xda, 0x7f, 0xd8, 0xb5, 0xf8, 0x8f, 0x7b, 0x7b, 0x8f, 0x0f, 0xf9, 0x8f, 0xb9, 0xed, 0x7f, 0xf6,
|
0xd3, 0x8c, 0x98, 0x0b, 0xb9, 0x88, 0xf9, 0x19, 0x34, 0x94, 0x54, 0x52, 0x35, 0x05, 0xb2, 0xf4,
|
||||||
0xa0, 0x59, 0xe4, 0x49, 0xf2, 0x15, 0xb4, 0x0d, 0xa0, 0x43, 0xae, 0x48, 0x4b, 0xcf, 0x02, 0x4b,
|
0x8c, 0x65, 0xcc, 0xe0, 0xd4, 0xe5, 0x74, 0xd2, 0x26, 0x6a, 0xe0, 0xae, 0x1e, 0x58, 0xfd, 0xa1,
|
||||||
0x83, 0xab, 0xb3, 0x17, 0xa5, 0x6d, 0x5f, 0xff, 0xf9, 0xdf, 0xfe, 0xf5, 0xab, 0xb9, 0x3e, 0xe9,
|
0x81, 0xbb, 0xb2, 0x81, 0x17, 0x4b, 0xa5, 0xb5, 0x67, 0x91, 0x1b, 0x5e, 0xe8, 0xb0, 0x34, 0x48,
|
||||||
0x6d, 0x9d, 0xdd, 0xdd, 0x92, 0x08, 0x67, 0x0b, 0x5b, 0x43, 0x6c, 0x34, 0xc9, 0x73, 0x58, 0x32,
|
0xca, 0x89, 0x44, 0x66, 0x8f, 0xa0, 0x8c, 0xa3, 0x74, 0x3e, 0x9a, 0x7f, 0xea, 0x25, 0x0b, 0xdb,
|
||||||
0x11, 0x11, 0xb9, 0x6a, 0xa6, 0xe4, 0xca, 0x6d, 0xaf, 0xbd, 0x62, 0x55, 0x5e, 0x77, 0x15, 0xaf,
|
0x84, 0x32, 0x1f, 0x0c, 0xc9, 0x5f, 0xcd, 0xe2, 0xaf, 0x61, 0x1c, 0x47, 0x32, 0xa0, 0x0b, 0x22,
|
||||||
0xeb, 0x91, 0x55, 0xfd, 0x3a, 0x95, 0x24, 0x09, 0xc5, 0xde, 0x5c, 0x1f, 0x4d, 0x13, 0xc5, 0x6f,
|
0x35, 0xe7, 0x82, 0x73, 0x23, 0x93, 0xbd, 0x0a, 0xec, 0x98, 0x8b, 0xab, 0x20, 0x7a, 0x6d, 0x5e,
|
||||||
0xf6, 0xc8, 0x7a, 0x70, 0x79, 0x7a, 0x0c, 0x2d, 0xe7, 0xd6, 0x4e, 0x1f, 0xaf, 0x22, 0xa4, 0xcb,
|
0xac, 0xfe, 0xbb, 0x00, 0x75, 0x83, 0x8c, 0xfe, 0x34, 0xc4, 0x05, 0xf7, 0x06, 0x9e, 0x3b, 0xe6,
|
||||||
0xaf, 0xd2, 0x27, 0xd8, 0xe4, 0x0b, 0x68, 0x16, 0x73, 0x46, 0xb2, 0xae, 0xcd, 0x49, 0xf5, 0x59,
|
0x82, 0x47, 0xfa, 0x68, 0x12, 0xf5, 0x40, 0x11, 0x29, 0x82, 0x5d, 0x0e, 0x7b, 0xc1, 0x44, 0xf4,
|
||||||
0xe5, 0xa0, 0x3f, 0xbd, 0x20, 0x95, 0xb8, 0x82, 0x9c, 0xd7, 0x9c, 0x29, 0xce, 0xef, 0x5b, 0x37,
|
0x06, 0x7c, 0x18, 0x71, 0xae, 0x6a, 0xf4, 0x0d, 0xf7, 0x72, 0xf8, 0x72, 0x22, 0x0e, 0x88, 0x86,
|
||||||
0xc9, 0x1e, 0xac, 0xc9, 0x40, 0x3d, 0xa6, 0xdf, 0x46, 0x93, 0x19, 0x03, 0xf5, 0x3b, 0x16, 0xf9,
|
0x5c, 0x63, 0xf7, 0xda, 0xe4, 0x52, 0x37, 0x81, 0xb1, 0x7b, 0x9d, 0x72, 0x29, 0x20, 0x24, 0xd5,
|
||||||
0x00, 0x1a, 0x6a, 0xcc, 0x4a, 0x7a, 0xb3, 0x27, 0xba, 0x83, 0xf5, 0x29, 0xba, 0x74, 0xf5, 0x1d,
|
0x53, 0x4a, 0x80, 0xd0, 0x31, 0xe9, 0x22, 0x1f, 0x02, 0xca, 0xb3, 0x21, 0xe0, 0x0f, 0x60, 0x5d,
|
||||||
0x80, 0x72, 0xea, 0x48, 0xfa, 0xaf, 0x1a, 0x8b, 0x16, 0x46, 0x9c, 0x31, 0xa2, 0x1c, 0xe2, 0xb8,
|
0x86, 0x00, 0x5f, 0xee, 0xa3, 0x97, 0x3b, 0x1d, 0xab, 0xd4, 0xab, 0x36, 0x99, 0xc4, 0xe0, 0x4d,
|
||||||
0xd5, 0x1c, 0x6a, 0x92, 0x6b, 0xe5, 0xfe, 0x99, 0xe3, 0xce, 0x6f, 0x60, 0xe8, 0xf4, 0xd0, 0x76,
|
0x68, 0xe1, 0x0e, 0xf4, 0x11, 0x8f, 0xbd, 0xef, 0x64, 0xdd, 0xc3, 0x72, 0x70, 0x67, 0x3a, 0xe5,
|
||||||
0x5d, 0xb2, 0xc4, 0x6d, 0x17, 0xd3, 0x73, 0x89, 0xd2, 0xc8, 0xe7, 0xd0, 0xd2, 0xe6, 0x95, 0x44,
|
0x79, 0xdf, 0x71, 0xe4, 0x44, 0x37, 0xcc, 0x70, 0xca, 0x92, 0xc7, 0xe2, 0xd8, 0xf3, 0xf3, 0x9c,
|
||||||
0xeb, 0xdf, 0x2a, 0xe3, 0xd0, 0xc1, 0x60, 0xd6, 0x92, 0xe4, 0xbe, 0x8a, 0xdc, 0x97, 0x9c, 0x26,
|
0xee, 0x75, 0x96, 0xb3, 0xa6, 0x38, 0xdd, 0x6b, 0x83, 0xd3, 0xde, 0x82, 0xa5, 0x2e, 0x17, 0x7b,
|
||||||
0xe7, 0x8e, 0xc3, 0x16, 0xfe, 0x24, 0x9f, 0xf2, 0xe0, 0x91, 0x63, 0x23, 0x52, 0xce, 0x4f, 0xcd,
|
0x18, 0x20, 0xb4, 0xe1, 0x50, 0x0d, 0xfc, 0xaa, 0x27, 0x23, 0x88, 0xa5, 0xce, 0x3c, 0xbf, 0x22,
|
||||||
0xe1, 0x52, 0xf1, 0xde, 0x53, 0x13, 0x26, 0x67, 0x19, 0xb9, 0xb6, 0x48, 0xc9, 0x95, 0x7c, 0x02,
|
0x1e, 0xbc, 0x5d, 0xa7, 0xfc, 0x32, 0xbf, 0xd9, 0x7f, 0x5d, 0x80, 0xca, 0x73, 0xff, 0x32, 0xf0,
|
||||||
0x8b, 0x72, 0x8a, 0x44, 0xd6, 0xca, 0x77, 0xd5, 0xb0, 0xc6, 0xa0, 0x57, 0x25, 0x4b, 0x66, 0x2b,
|
0xfa, 0x84, 0x9c, 0xc7, 0x7c, 0x1c, 0xe8, 0xea, 0x26, 0x7e, 0x63, 0xa0, 0xa2, 0x72, 0x4b, 0x28,
|
||||||
0xc8, 0xac, 0x4d, 0x5a, 0x9c, 0xd9, 0x90, 0xb2, 0x90, 0xf3, 0x88, 0xa0, 0x63, 0x76, 0x6d, 0x79,
|
0x14, 0xf0, 0xd5, 0x4d, 0xf4, 0xdd, 0x28, 0xad, 0xa1, 0xcb, 0x3a, 0x5a, 0x2d, 0x4a, 0xaa, 0xe7,
|
||||||
0x11, 0x66, 0x33, 0x1b, 0xce, 0x22, 0xcc, 0x66, 0x77, 0x85, 0x66, 0x98, 0xa9, 0xf0, 0xda, 0x92,
|
0x6b, 0xb0, 0x10, 0x99, 0xe5, 0xfe, 0x72, 0x44, 0xf7, 0xcd, 0xa4, 0xb0, 0x5b, 0x36, 0x0a, 0xbb,
|
||||||
0x65, 0x89, 0xfc, 0x14, 0x6c, 0x7d, 0x8c, 0x48, 0x06, 0x9a, 0xe6, 0x95, 0x91, 0xe3, 0xe0, 0xca,
|
0x74, 0x7f, 0x92, 0x55, 0x22, 0x52, 0x37, 0xde, 0x9f, 0x64, 0x93, 0x52, 0x61, 0xc4, 0x55, 0x81,
|
||||||
0xcc, 0x35, 0xd3, 0xdc, 0xc4, 0xd6, 0xaf, 0x21, 0x9f, 0x43, 0x47, 0x1b, 0x3b, 0x1c, 0x4e, 0x62,
|
0x0d, 0x83, 0x40, 0x45, 0xa5, 0x42, 0x45, 0x3c, 0xc0, 0x30, 0xf0, 0x01, 0xd4, 0x25, 0xbf, 0x64,
|
||||||
0xbf, 0x78, 0xce, 0xe9, 0x71, 0xc4, 0x60, 0xe6, 0xbc, 0x68, 0x1d, 0x19, 0x2f, 0x3b, 0x06, 0x63,
|
0x91, 0x7a, 0x05, 0x49, 0x22, 0x86, 0x39, 0xcf, 0x05, 0xb5, 0xb9, 0xcf, 0x05, 0xa7, 0xc0, 0xf6,
|
||||||
0xfe, 0x94, 0xf7, 0xa0, 0xa5, 0xf1, 0xf8, 0x26, 0xbe, 0xeb, 0xda, 0x92, 0x3e, 0x5e, 0xb8, 0x63,
|
0x06, 0x03, 0xa5, 0x90, 0x04, 0x04, 0xa4, 0x7b, 0xb1, 0xcc, 0xbd, 0xcc, 0x91, 0x5a, 0x98, 0x2b,
|
||||||
0x91, 0xdf, 0x5a, 0x60, 0xeb, 0x13, 0xa5, 0xc2, 0x00, 0x33, 0xc6, 0x4c, 0x85, 0x5b, 0x4c, 0xcd,
|
0xf5, 0x31, 0xd4, 0x4f, 0x8c, 0xc7, 0x8e, 0xbb, 0xa8, 0x39, 0xfd, 0xcc, 0xa1, 0xad, 0x14, 0xa9,
|
||||||
0x86, 0x9c, 0xcf, 0x50, 0xc8, 0x83, 0x9b, 0xfb, 0x86, 0x91, 0x5f, 0x1a, 0x5d, 0xf4, 0x6d, 0xfd,
|
0xd7, 0x0d, 0x63, 0xb2, 0x82, 0x31, 0x99, 0xfd, 0x19, 0xb0, 0x23, 0x2f, 0x16, 0xc9, 0xd2, 0x12,
|
||||||
0x7b, 0xd0, 0x45, 0x75, 0x51, 0xff, 0x24, 0x74, 0xb1, 0xf5, 0x12, 0xc7, 0x51, 0x17, 0x77, 0x2c,
|
0x9c, 0xa4, 0xc1, 0xaa, 0x89, 0x93, 0x14, 0x8d, 0x70, 0xd2, 0x9e, 0x2c, 0x5a, 0xe5, 0xf7, 0xf4,
|
||||||
0xf2, 0xbe, 0xf8, 0x8e, 0xa6, 0x0a, 0x3c, 0xd1, 0x02, 0xbc, 0x6a, 0x36, 0xfd, 0x23, 0xd7, 0xa6,
|
0x08, 0xaa, 0x9e, 0x24, 0xe9, 0x70, 0xb2, 0xa8, 0x42, 0x84, 0xe6, 0x4c, 0xfa, 0x31, 0x3c, 0x29,
|
||||||
0x75, 0xc7, 0x22, 0x5f, 0x8a, 0x0f, 0x44, 0xf2, 0x2c, 0x5a, 0xff, 0xbf, 0x3d, 0xef, 0xdc, 0x40,
|
0x62, 0x77, 0x72, 0x16, 0xf7, 0x23, 0x2f, 0x44, 0xd5, 0xdb, 0x7f, 0x63, 0x41, 0x45, 0xed, 0x6b,
|
||||||
0x8d, 0x5e, 0x77, 0x2e, 0x1b, 0x1a, 0x55, 0x33, 0xdc, 0x01, 0x40, 0x09, 0xb4, 0x48, 0x05, 0xaf,
|
0xe6, 0x8d, 0x47, 0x21, 0x59, 0xf3, 0x8d, 0x67, 0x6e, 0x4d, 0x7f, 0xd6, 0xc0, 0xc5, 0x39, 0x06,
|
||||||
0x14, 0xb1, 0x3f, 0x8d, 0xc5, 0xcc, 0x57, 0x55, 0xb0, 0x87, 0x73, 0xfc, 0x4a, 0x38, 0xa4, 0xdc,
|
0x66, 0x50, 0x0a, 0x5d, 0x71, 0x41, 0x28, 0xa2, 0xe6, 0xd0, 0xb7, 0x46, 0x36, 0xe5, 0x14, 0xd9,
|
||||||
0x9f, 0x17, 0xcf, 0x3a, 0x8d, 0xae, 0x06, 0x83, 0x59, 0x4b, 0x92, 0xff, 0x1b, 0xc8, 0xff, 0x35,
|
0xa8, 0xf2, 0x9c, 0x5a, 0x52, 0x9c, 0x6a, 0x7f, 0x35, 0x4b, 0x4e, 0x35, 0xa0, 0x96, 0x97, 0xd7,
|
||||||
0x72, 0x45, 0xe7, 0xbf, 0xf5, 0x52, 0x47, 0x63, 0x17, 0xe4, 0x33, 0x68, 0xef, 0x25, 0xc9, 0xf3,
|
0x80, 0x62, 0x75, 0x92, 0x7e, 0xbb, 0x03, 0xed, 0x03, 0x3e, 0xe2, 0x82, 0xef, 0x8d, 0x46, 0x79,
|
||||||
0x71, 0xaa, 0x14, 0x20, 0x26, 0x4c, 0xe1, 0xe8, 0x6f, 0x50, 0x05, 0x61, 0xd7, 0x91, 0xf3, 0x15,
|
0xf9, 0x77, 0xe0, 0xf6, 0x9c, 0x3e, 0xe5, 0x5f, 0x4f, 0x61, 0xf9, 0x80, 0x9f, 0x4d, 0x86, 0x47,
|
||||||
0x72, 0xd9, 0xe4, 0x5c, 0x22, 0xc4, 0x0b, 0xe2, 0xc1, 0x72, 0x91, 0xf7, 0x0b, 0x45, 0x06, 0x26,
|
0xfc, 0x32, 0xbd, 0xab, 0x30, 0x28, 0xc5, 0x17, 0xc1, 0x95, 0xb2, 0x16, 0x7d, 0xa3, 0x3b, 0x8d,
|
||||||
0x1f, 0x1d, 0xc1, 0x4d, 0xdd, 0x61, 0x54, 0xe2, 0xe2, 0x8e, 0x5c, 0xf1, 0xbc, 0x63, 0x91, 0x03,
|
0x90, 0xa7, 0x17, 0x87, 0xbc, 0xaf, 0x53, 0x21, 0x51, 0xba, 0x21, 0xef, 0xdb, 0x7f, 0x08, 0xcc,
|
||||||
0xb0, 0xef, 0x53, 0x3f, 0x09, 0xa8, 0x82, 0x22, 0xa5, 0xe4, 0x05, 0x74, 0x19, 0xb4, 0x0d, 0xa2,
|
0x94, 0xa3, 0xb6, 0x80, 0x07, 0x7f, 0x72, 0xd6, 0x8b, 0xa7, 0xb1, 0xe0, 0x63, 0xed, 0xf0, 0x10,
|
||||||
0x99, 0x09, 0x52, 0x6f, 0x92, 0xd1, 0xaf, 0xb7, 0x5e, 0x4a, 0x6c, 0x73, 0xa1, 0x32, 0x81, 0x42,
|
0x4f, 0xce, 0xba, 0x92, 0x62, 0x3f, 0x84, 0xc6, 0x89, 0x3b, 0x75, 0xf8, 0xb7, 0xea, 0xf2, 0x89,
|
||||||
0x5c, 0x46, 0x26, 0xa8, 0x40, 0x34, 0x23, 0x13, 0x4c, 0x41, 0x34, 0x23, 0x13, 0x28, 0x1c, 0x48,
|
0x80, 0xc4, 0x9d, 0xe2, 0x71, 0x4d, 0xb0, 0x15, 0x75, 0xdb, 0x21, 0x2c, 0x48, 0x46, 0x76, 0x4f,
|
||||||
0x22, 0x0e, 0xdc, 0x2a, 0xa8, 0xae, 0xa8, 0x1e, 0xaf, 0xc2, 0x82, 0x83, 0x8d, 0x57, 0x6f, 0x30,
|
0x3e, 0xf0, 0x79, 0xbe, 0xbc, 0xe4, 0x29, 0x43, 0x1a, 0xa4, 0x19, 0x5b, 0x17, 0x66, 0x6d, 0xad,
|
||||||
0x6f, 0xbb, 0x69, 0xde, 0x76, 0x08, 0xed, 0xfb, 0x54, 0x18, 0x4b, 0x34, 0x9c, 0x03, 0x33, 0xb5,
|
0x22, 0xae, 0x2e, 0xd9, 0x6a, 0x64, 0xe1, 0x4f, 0xc6, 0xba, 0x4e, 0xfb, 0x68, 0x17, 0x9a, 0x99,
|
||||||
0xe8, 0xcd, 0x69, 0x35, 0xed, 0xe0, 0x9a, 0x99, 0xe8, 0xb1, 0x33, 0x24, 0x5f, 0x40, 0xeb, 0x21,
|
0x3b, 0x01, 0xab, 0x40, 0x71, 0xef, 0xe8, 0xa8, 0x75, 0x8b, 0xd5, 0xa1, 0xf2, 0xf2, 0xe4, 0xc9,
|
||||||
0x65, 0xaa, 0xdf, 0x2c, 0x6a, 0x70, 0xa5, 0x01, 0x1d, 0xcc, 0xea, 0x53, 0x37, 0x90, 0xdb, 0x80,
|
0xf1, 0xf3, 0xe3, 0x67, 0x2d, 0x0b, 0x1b, 0xfb, 0x47, 0x2f, 0xbb, 0xd8, 0x28, 0xec, 0xfe, 0xfb,
|
||||||
0xf4, 0x0b, 0x6e, 0x5b, 0xbc, 0xb5, 0x15, 0x49, 0xc0, 0x0d, 0x83, 0x0b, 0xf2, 0x23, 0x64, 0x5e,
|
0x3a, 0xd4, 0x92, 0x6c, 0xc7, 0x7e, 0x05, 0xcd, 0xcc, 0x0d, 0x80, 0xdd, 0x51, 0xf6, 0x9b, 0x77,
|
||||||
0x4c, 0x4f, 0x14, 0xf3, 0xca, 0xc8, 0x65, 0xd0, 0xa9, 0xd0, 0x67, 0x71, 0xe6, 0xbd, 0xe7, 0xd6,
|
0xa5, 0xe8, 0xdc, 0x9d, 0xdf, 0xa9, 0xec, 0xf4, 0xfe, 0x9f, 0xff, 0xf6, 0x3f, 0xfe, 0xae, 0xd0,
|
||||||
0x4b, 0x39, 0x04, 0xe1, 0x9c, 0xe1, 0xd3, 0x31, 0xcd, 0x26, 0x62, 0x40, 0xb4, 0xa2, 0x7f, 0xcb,
|
0x66, 0xeb, 0xdb, 0x97, 0x9f, 0x6c, 0x2b, 0x88, 0xbf, 0x4d, 0x05, 0x29, 0x2a, 0x8a, 0xb1, 0xd7,
|
||||||
0x56, 0x5c, 0xcd, 0x0f, 0xdc, 0xdf, 0x41, 0x96, 0xd7, 0xc9, 0xb5, 0x92, 0x25, 0x7e, 0x0d, 0x2f,
|
0xb0, 0x98, 0xbd, 0x21, 0xb0, 0xbb, 0xd9, 0x8c, 0x9a, 0x9b, 0xed, 0xbd, 0x1b, 0x7a, 0xd5, 0x74,
|
||||||
0x79, 0x6e, 0xbd, 0xf4, 0x46, 0xec, 0x82, 0x3c, 0xc3, 0x4f, 0x2a, 0x7a, 0x17, 0x5d, 0x56, 0xfb,
|
0x77, 0x69, 0xba, 0x75, 0xb6, 0x6a, 0x4e, 0xa7, 0xf3, 0x13, 0xe3, 0x54, 0xa7, 0x34, 0xdf, 0x7b,
|
||||||
0x6a, 0xc3, 0x5d, 0x98, 0x45, 0x5b, 0x32, 0x11, 0x80, 0xb8, 0x09, 0x6b, 0x20, 0x42, 0x1d, 0xd1,
|
0x99, 0x96, 0x37, 0xff, 0x1d, 0xb8, 0x73, 0x7b, 0xf6, 0x6d, 0x57, 0x3d, 0x06, 0xdb, 0x6d, 0x9a,
|
||||||
0x87, 0x6a, 0x50, 0xc7, 0x68, 0x5f, 0x35, 0xa8, 0x63, 0x36, 0xac, 0x1c, 0xea, 0x94, 0x58, 0xbf,
|
0x8a, 0xb1, 0x16, 0x4e, 0x65, 0x3e, 0xf7, 0xb2, 0x5f, 0x42, 0x2d, 0x79, 0xe2, 0x62, 0x1b, 0xc6,
|
||||||
0x80, 0x3a, 0x53, 0x5d, 0x43, 0x91, 0x9d, 0xa6, 0x1b, 0x83, 0xe3, 0x05, 0xfc, 0xe7, 0x8d, 0x77,
|
0x83, 0x9e, 0xf9, 0x68, 0xd6, 0x69, 0xcf, 0x76, 0xa8, 0x4d, 0xdc, 0x21, 0xc9, 0x6b, 0xf6, 0x8c,
|
||||||
0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x71, 0x82, 0xe3, 0x1a, 0xee, 0x21, 0x00, 0x00,
|
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,
|
||||||
}
|
}
|
||||||
|
@ -372,18 +372,16 @@ message PendingChannelRequest {
|
|||||||
}
|
}
|
||||||
message PendingChannelResponse {
|
message PendingChannelResponse {
|
||||||
message PendingChannel {
|
message PendingChannel {
|
||||||
int32 peer_id = 1;
|
string identity_key = 1;
|
||||||
|
string channel_point = 2;
|
||||||
|
|
||||||
string identity_key = 2;
|
int64 capacity = 3;
|
||||||
string channel_point = 3;
|
int64 local_balance = 4;
|
||||||
|
int64 remote_balance = 5;
|
||||||
|
|
||||||
int64 capacity = 4;
|
string closing_txid = 6;
|
||||||
int64 local_balance = 5;
|
|
||||||
int64 remote_balance = 6;
|
|
||||||
|
|
||||||
string closing_txid = 7;
|
ChannelStatus status = 7;
|
||||||
|
|
||||||
ChannelStatus status = 8;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repeated PendingChannel pending_channels = 1;
|
repeated PendingChannel pending_channels = 1;
|
||||||
|
@ -89,6 +89,7 @@
|
|||||||
},
|
},
|
||||||
"/v1/channels/pending": {
|
"/v1/channels/pending": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"summary": "TODO(roasbeef): merge with below with bool?",
|
||||||
"operationId": "PendingChannels",
|
"operationId": "PendingChannels",
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@ -131,7 +132,6 @@
|
|||||||
},
|
},
|
||||||
"/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}/{force}": {
|
"/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}/{force}": {
|
||||||
"delete": {
|
"delete": {
|
||||||
"summary": "TODO(roasbeef): merge with below with bool?",
|
|
||||||
"operationId": "CloseChannel",
|
"operationId": "CloseChannel",
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@ -544,37 +544,42 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"definitions": {
|
"definitions": {
|
||||||
|
"NewAddressRequestAddressType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"WITNESS_PUBKEY_HASH",
|
||||||
|
"NESTED_PUBKEY_HASH",
|
||||||
|
"PUBKEY_HASH"
|
||||||
|
],
|
||||||
|
"default": "WITNESS_PUBKEY_HASH"
|
||||||
|
},
|
||||||
"PendingChannelResponsePendingChannel": {
|
"PendingChannelResponsePendingChannel": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"capacity": {
|
"identity_key": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"channel_point": {
|
"channel_point": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"closing_txid": {
|
"capacity": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "int64"
|
||||||
},
|
|
||||||
"identity_key": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
},
|
||||||
"local_balance": {
|
"local_balance": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"peer_id": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int32"
|
|
||||||
},
|
|
||||||
"remote_balance": {
|
"remote_balance": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
|
"closing_txid": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"$ref": "#/definitions/lnrpcChannelStatus"
|
"$ref": "#/definitions/lnrpcChannelStatus"
|
||||||
}
|
}
|
||||||
@ -583,22 +588,42 @@
|
|||||||
"lnrpcActiveChannel": {
|
"lnrpcActiveChannel": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"capacity": {
|
"remote_pubkey": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "string"
|
||||||
},
|
|
||||||
"chan_id": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uint64"
|
|
||||||
},
|
},
|
||||||
"channel_point": {
|
"channel_point": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
|
"chan_id": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uint64"
|
||||||
|
},
|
||||||
|
"capacity": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
"local_balance": {
|
"local_balance": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"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": {
|
"num_updates": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uint64"
|
"format": "uint64"
|
||||||
@ -608,39 +633,19 @@
|
|||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/lnrpcHTLC"
|
"$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": {
|
"lnrpcAddInvoiceResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"payment_request": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"r_hash": {
|
"r_hash": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
|
},
|
||||||
|
"payment_request": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -681,58 +686,66 @@
|
|||||||
"lnrpcChannelEdge": {
|
"lnrpcChannelEdge": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"capacity": {
|
"channel_id": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "uint64"
|
||||||
},
|
},
|
||||||
"chan_point": {
|
"chan_point": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"channel_id": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uint64"
|
|
||||||
},
|
|
||||||
"last_update": {
|
"last_update": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"node1_policy": {
|
|
||||||
"$ref": "#/definitions/lnrpcRoutingPolicy"
|
|
||||||
},
|
|
||||||
"node1_pub": {
|
"node1_pub": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"node2_policy": {
|
|
||||||
"$ref": "#/definitions/lnrpcRoutingPolicy"
|
|
||||||
},
|
|
||||||
"node2_pub": {
|
"node2_pub": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
|
},
|
||||||
|
"capacity": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"node1_policy": {
|
||||||
|
"$ref": "#/definitions/lnrpcRoutingPolicy"
|
||||||
|
},
|
||||||
|
"node2_policy": {
|
||||||
|
"$ref": "#/definitions/lnrpcRoutingPolicy"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcChannelGraph": {
|
"lnrpcChannelGraph": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"edges": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"$ref": "#/definitions/lnrpcChannelEdge"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/lnrpcLightningNode"
|
"$ref": "#/definitions/lnrpcLightningNode"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"edges": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/lnrpcChannelEdge"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcChannelGraphRequest": {
|
"lnrpcChannelGraphRequest": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
},
|
},
|
||||||
|
"lnrpcChannelOpenUpdate": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"channel_point": {
|
||||||
|
"$ref": "#/definitions/lnrpcChannelPoint"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"lnrpcChannelPoint": {
|
"lnrpcChannelPoint": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@ -765,41 +778,41 @@
|
|||||||
"channel_point": {
|
"channel_point": {
|
||||||
"$ref": "#/definitions/lnrpcChannelPoint"
|
"$ref": "#/definitions/lnrpcChannelPoint"
|
||||||
},
|
},
|
||||||
"force": {
|
|
||||||
"type": "boolean",
|
|
||||||
"format": "boolean"
|
|
||||||
},
|
|
||||||
"time_limit": {
|
"time_limit": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"force": {
|
||||||
|
"type": "boolean",
|
||||||
|
"format": "boolean"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcCloseStatusUpdate": {
|
"lnrpcCloseStatusUpdate": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"chan_close": {
|
|
||||||
"$ref": "#/definitions/lnrpcChannelCloseUpdate"
|
|
||||||
},
|
|
||||||
"close_pending": {
|
"close_pending": {
|
||||||
"$ref": "#/definitions/lnrpcPendingUpdate"
|
"$ref": "#/definitions/lnrpcPendingUpdate"
|
||||||
},
|
},
|
||||||
"confirmation": {
|
"confirmation": {
|
||||||
"$ref": "#/definitions/lnrpcConfirmationUpdate"
|
"$ref": "#/definitions/lnrpcConfirmationUpdate"
|
||||||
|
},
|
||||||
|
"chan_close": {
|
||||||
|
"$ref": "#/definitions/lnrpcChannelCloseUpdate"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcConfirmationUpdate": {
|
"lnrpcConfirmationUpdate": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"block_height": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int32"
|
|
||||||
},
|
|
||||||
"block_sha": {
|
"block_sha": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
},
|
},
|
||||||
|
"block_height": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int32"
|
||||||
|
},
|
||||||
"num_confs_left": {
|
"num_confs_left": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"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": {
|
"lnrpcDeleteAllPaymentsRequest": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
},
|
},
|
||||||
@ -839,22 +874,18 @@
|
|||||||
"lnrpcGetInfoResponse": {
|
"lnrpcGetInfoResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"identity_pubkey": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
},
|
||||||
"alias": {
|
"alias": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"block_hash": {
|
"num_pending_channels": {
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"block_height": {
|
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"identity_pubkey": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"num_active_channels": {
|
"num_active_channels": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
@ -863,10 +894,14 @@
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"num_pending_channels": {
|
"block_height": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
|
"block_hash": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
},
|
||||||
"synced_to_chain": {
|
"synced_to_chain": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"format": "boolean"
|
"format": "boolean"
|
||||||
@ -883,21 +918,21 @@
|
|||||||
"lnrpcHTLC": {
|
"lnrpcHTLC": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"incoming": {
|
||||||
|
"type": "boolean",
|
||||||
|
"format": "boolean"
|
||||||
|
},
|
||||||
"amount": {
|
"amount": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"expiration_height": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"hash_lock": {
|
"hash_lock": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
},
|
},
|
||||||
"incoming": {
|
"expiration_height": {
|
||||||
"type": "boolean",
|
"type": "integer",
|
||||||
"format": "boolean"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"revocation_delay": {
|
"revocation_delay": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
@ -908,17 +943,17 @@
|
|||||||
"lnrpcHop": {
|
"lnrpcHop": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"amt_to_forward": {
|
"chan_id": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "uint64"
|
||||||
},
|
},
|
||||||
"chan_capacity": {
|
"chan_capacity": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"chan_id": {
|
"amt_to_forward": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uint64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"fee": {
|
"fee": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -929,19 +964,11 @@
|
|||||||
"lnrpcInvoice": {
|
"lnrpcInvoice": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"creation_date": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"memo": {
|
"memo": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"payment_request": {
|
"receipt": {
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"r_hash": {
|
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
},
|
},
|
||||||
@ -949,11 +976,11 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
},
|
},
|
||||||
"receipt": {
|
"r_hash": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
},
|
},
|
||||||
"settle_date": {
|
"value": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
@ -961,9 +988,17 @@
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"format": "boolean"
|
"format": "boolean"
|
||||||
},
|
},
|
||||||
"value": {
|
"creation_date": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"settle_date": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"payment_request": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -973,11 +1008,11 @@
|
|||||||
"lnrpcLightningAddress": {
|
"lnrpcLightningAddress": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"host": {
|
"pubkey": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"pubkey": {
|
"host": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
}
|
}
|
||||||
@ -986,14 +1021,6 @@
|
|||||||
"lnrpcLightningNode": {
|
"lnrpcLightningNode": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"address": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"alias": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"last_update": {
|
"last_update": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
@ -1001,6 +1028,14 @@
|
|||||||
"pub_key": {
|
"pub_key": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
},
|
||||||
|
"alias": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1069,47 +1104,55 @@
|
|||||||
"lnrpcNetworkInfo": {
|
"lnrpcNetworkInfo": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"avg_channel_size": {
|
"graph_diameter": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"format": "double"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"avg_out_degree": {
|
"avg_out_degree": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"format": "double"
|
"format": "double"
|
||||||
},
|
},
|
||||||
"graph_diameter": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"max_channel_size": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"max_out_degree": {
|
"max_out_degree": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"min_channel_size": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"num_channels": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"num_nodes": {
|
"num_nodes": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
|
"num_channels": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
"total_network_capacity": {
|
"total_network_capacity": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"avg_channel_size": {
|
||||||
|
"type": "number",
|
||||||
|
"format": "double"
|
||||||
|
},
|
||||||
|
"min_channel_size": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"max_channel_size": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcNetworkInfoRequest": {
|
"lnrpcNetworkInfoRequest": {
|
||||||
"type": "object"
|
"type": "object"
|
||||||
},
|
},
|
||||||
|
"lnrpcNewAddressRequest": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/definitions/NewAddressRequestAddressType"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"lnrpcNewAddressResponse": {
|
"lnrpcNewAddressResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@ -1150,9 +1193,9 @@
|
|||||||
"lnrpcOpenChannelRequest": {
|
"lnrpcOpenChannelRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"local_funding_amount": {
|
"target_peer_id": {
|
||||||
"type": "string",
|
"type": "integer",
|
||||||
"format": "int64"
|
"format": "int32"
|
||||||
},
|
},
|
||||||
"node_pubkey": {
|
"node_pubkey": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -1162,17 +1205,31 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"num_confs": {
|
"local_funding_amount": {
|
||||||
"type": "integer",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"push_sat": {
|
"push_sat": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"target_peer_id": {
|
"num_confs": {
|
||||||
"type": "integer",
|
"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",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"num_satoshis": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"payment_hash": {
|
"payment_hash": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
|
},
|
||||||
|
"num_satoshis": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1205,11 +1262,15 @@
|
|||||||
"lnrpcPayment": {
|
"lnrpcPayment": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"creation_date": {
|
"payment_hash": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"fee": {
|
"creation_date": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
@ -1220,11 +1281,7 @@
|
|||||||
"format": "string"
|
"format": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"payment_hash": {
|
"fee": {
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
},
|
|
||||||
"value": {
|
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
}
|
}
|
||||||
@ -1233,52 +1290,52 @@
|
|||||||
"lnrpcPaymentHash": {
|
"lnrpcPaymentHash": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"r_hash": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "byte"
|
|
||||||
},
|
|
||||||
"r_hash_str": {
|
"r_hash_str": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
|
},
|
||||||
|
"r_hash": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "byte"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcPeer": {
|
"lnrpcPeer": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"address": {
|
"pub_key": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
"bytes_recv": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uint64"
|
|
||||||
},
|
|
||||||
"bytes_sent": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uint64"
|
|
||||||
},
|
|
||||||
"inbound": {
|
|
||||||
"type": "boolean",
|
|
||||||
"format": "boolean"
|
|
||||||
},
|
|
||||||
"peer_id": {
|
"peer_id": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int32"
|
"format": "int32"
|
||||||
},
|
},
|
||||||
"ping_time": {
|
"address": {
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"pub_key": {
|
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
|
"bytes_sent": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uint64"
|
||||||
|
},
|
||||||
|
"bytes_recv": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uint64"
|
||||||
|
},
|
||||||
|
"sat_sent": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
"sat_recv": {
|
"sat_recv": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"sat_sent": {
|
"inbound": {
|
||||||
|
"type": "boolean",
|
||||||
|
"format": "boolean"
|
||||||
|
},
|
||||||
|
"ping_time": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
}
|
}
|
||||||
@ -1315,56 +1372,56 @@
|
|||||||
"lnrpcRoute": {
|
"lnrpcRoute": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"hops": {
|
"total_time_lock": {
|
||||||
"type": "array",
|
"type": "integer",
|
||||||
"items": {
|
|
||||||
"$ref": "#/definitions/lnrpcHop"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"total_amt": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"total_fees": {
|
"total_fees": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"total_time_lock": {
|
"total_amt": {
|
||||||
"type": "integer",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"hops": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/lnrpcHop"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcRouteRequest": {
|
"lnrpcRouteRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"amt": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"pub_key": {
|
"pub_key": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
|
},
|
||||||
|
"amt": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lnrpcRoutingPolicy": {
|
"lnrpcRoutingPolicy": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"fee_base_msat": {
|
"time_lock_delta": {
|
||||||
"type": "string",
|
"type": "integer",
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"fee_rate_milli_msat": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"min_htlc": {
|
"min_htlc": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
},
|
||||||
"time_lock_delta": {
|
"fee_base_msat": {
|
||||||
"type": "integer",
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"fee_rate_milli_msat": {
|
||||||
|
"type": "string",
|
||||||
"format": "int64"
|
"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": {
|
"lnrpcSendRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"amt": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "int64"
|
|
||||||
},
|
|
||||||
"dest": {
|
"dest": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
@ -1406,6 +1480,10 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
},
|
},
|
||||||
|
"amt": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
"payment_hash": {
|
"payment_hash": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte"
|
||||||
@ -1432,13 +1510,33 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lnrpcSetAliasRequest": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"new_alias": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lnrpcSetAliasResponse": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
"lnrpcTransaction": {
|
"lnrpcTransaction": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"tx_hash": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "string"
|
||||||
|
},
|
||||||
"amount": {
|
"amount": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"format": "double"
|
"format": "double"
|
||||||
},
|
},
|
||||||
|
"num_confirmations": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int32"
|
||||||
|
},
|
||||||
"block_hash": {
|
"block_hash": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
@ -1447,10 +1545,6 @@
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int32"
|
"format": "int32"
|
||||||
},
|
},
|
||||||
"num_confirmations": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int32"
|
|
||||||
},
|
|
||||||
"time_stamp": {
|
"time_stamp": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
@ -1458,10 +1552,6 @@
|
|||||||
"total_fees": {
|
"total_fees": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "int64"
|
"format": "int64"
|
||||||
},
|
|
||||||
"tx_hash": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "string"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
23
peer.go
23
peer.go
@ -440,20 +440,20 @@ out:
|
|||||||
p.queueMsg(lnwire.NewPong(msg.Nonce), nil)
|
p.queueMsg(lnwire.NewPong(msg.Nonce), nil)
|
||||||
|
|
||||||
case *lnwire.SingleFundingRequest:
|
case *lnwire.SingleFundingRequest:
|
||||||
p.server.fundingMgr.processFundingRequest(msg, p)
|
p.server.fundingMgr.processFundingRequest(msg, p.addr)
|
||||||
case *lnwire.SingleFundingResponse:
|
case *lnwire.SingleFundingResponse:
|
||||||
p.server.fundingMgr.processFundingResponse(msg, p)
|
p.server.fundingMgr.processFundingResponse(msg, p.addr)
|
||||||
case *lnwire.SingleFundingComplete:
|
case *lnwire.SingleFundingComplete:
|
||||||
p.server.fundingMgr.processFundingComplete(msg, p)
|
p.server.fundingMgr.processFundingComplete(msg, p.addr)
|
||||||
case *lnwire.SingleFundingSignComplete:
|
case *lnwire.SingleFundingSignComplete:
|
||||||
p.server.fundingMgr.processFundingSignComplete(msg, p)
|
p.server.fundingMgr.processFundingSignComplete(msg, p.addr)
|
||||||
case *lnwire.SingleFundingOpenProof:
|
case *lnwire.SingleFundingOpenProof:
|
||||||
p.server.fundingMgr.processFundingOpenProof(msg, p)
|
p.server.fundingMgr.processFundingOpenProof(msg, p.addr)
|
||||||
case *lnwire.CloseRequest:
|
case *lnwire.CloseRequest:
|
||||||
p.remoteCloseChanReqs <- msg
|
p.remoteCloseChanReqs <- msg
|
||||||
|
|
||||||
case *lnwire.ErrorGeneric:
|
case *lnwire.ErrorGeneric:
|
||||||
p.server.fundingMgr.processErrorGeneric(msg, p)
|
p.server.fundingMgr.processErrorGeneric(msg, p.addr)
|
||||||
|
|
||||||
// TODO(roasbeef): create ChanUpdater interface for the below
|
// TODO(roasbeef): create ChanUpdater interface for the below
|
||||||
case *lnwire.UpdateAddHTLC:
|
case *lnwire.UpdateAddHTLC:
|
||||||
@ -1766,6 +1766,17 @@ func (p *peer) updateCommitTx(state *commitmentState, reply bool) error {
|
|||||||
return nil
|
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)
|
// logEntryToHtlcPkt converts a particular Lightning Commitment Protocol (LCP)
|
||||||
// log entry the corresponding htlcPacket with src/dest set along with the
|
// 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
|
// proper wire message. This helper method is provided in order to aid an
|
||||||
|
@ -770,7 +770,6 @@ func (r *rpcServer) PendingChannels(ctx context.Context,
|
|||||||
// TODO(roasbeef): add confirmation progress
|
// TODO(roasbeef): add confirmation progress
|
||||||
pub := pendingOpen.identityPub.SerializeCompressed()
|
pub := pendingOpen.identityPub.SerializeCompressed()
|
||||||
pendingChan := &lnrpc.PendingChannelResponse_PendingChannel{
|
pendingChan := &lnrpc.PendingChannelResponse_PendingChannel{
|
||||||
PeerId: pendingOpen.peerId,
|
|
||||||
IdentityKey: hex.EncodeToString(pub),
|
IdentityKey: hex.EncodeToString(pub),
|
||||||
ChannelPoint: channelPointStr,
|
ChannelPoint: channelPointStr,
|
||||||
Capacity: int64(pendingOpen.capacity),
|
Capacity: int64(pendingOpen.capacity),
|
||||||
|
31
server.go
31
server.go
@ -196,7 +196,16 @@ func newServer(listenAddrs []string, notifier chainntnfs.ChainNotifier,
|
|||||||
|
|
||||||
s.rpcServer = newRpcServer(s)
|
s.rpcServer = newRpcServer(s)
|
||||||
s.breachArbiter = newBreachArbiter(wallet, chanDB, notifier, s.htlcSwitch)
|
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
|
// TODO(roasbeef): introduce closure and config system to decouple the
|
||||||
// initialization above ^
|
// 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
|
// 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
|
// 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.
|
// 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
|
// of blocking on this request which is exported as a synchronous
|
||||||
// request to the outside world.
|
// request to the outside world.
|
||||||
// TODO(roasbeef): server semaphore to restrict num goroutines
|
// 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
|
// ConnectToPeer requests that the server connect to a Lightning Network peer
|
||||||
|
Loading…
Reference in New Issue
Block a user