Merge pull request #242 from joostjager/user-message

multi: expose server message to clients
pull/243/head
Joost Jager 4 years ago committed by GitHub
commit dcb3b50eec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -14,7 +14,6 @@ import (
"github.com/lightninglabs/loop/lsat" "github.com/lightninglabs/loop/lsat"
"github.com/lightninglabs/loop/swap" "github.com/lightninglabs/loop/swap"
"github.com/lightninglabs/loop/sweep" "github.com/lightninglabs/loop/sweep"
"github.com/lightningnetwork/lnd/lntypes"
) )
var ( var (
@ -354,32 +353,37 @@ func (s *Client) resumeSwaps(ctx context.Context,
// //
// The return value is a hash that uniquely identifies the new swap. // The return value is a hash that uniquely identifies the new swap.
func (s *Client) LoopOut(globalCtx context.Context, func (s *Client) LoopOut(globalCtx context.Context,
request *OutRequest) (*lntypes.Hash, btcutil.Address, error) { request *OutRequest) (*LoopOutSwapInfo, error) {
log.Infof("LoopOut %v to %v (channels: %v)", log.Infof("LoopOut %v to %v (channels: %v)",
request.Amount, request.DestAddr, request.OutgoingChanSet, request.Amount, request.DestAddr, request.OutgoingChanSet,
) )
if err := s.waitForInitialized(globalCtx); err != nil { if err := s.waitForInitialized(globalCtx); err != nil {
return nil, nil, err return nil, err
} }
// Create a new swap object for this swap. // Create a new swap object for this swap.
initiationHeight := s.executor.height() initiationHeight := s.executor.height()
swapCfg := newSwapConfig(s.lndServices, s.Store, s.Server) swapCfg := newSwapConfig(s.lndServices, s.Store, s.Server)
swap, err := newLoopOutSwap( initResult, err := newLoopOutSwap(
globalCtx, swapCfg, initiationHeight, request, globalCtx, swapCfg, initiationHeight, request,
) )
if err != nil { if err != nil {
return nil, nil, err return nil, err
} }
swap := initResult.swap
// Post swap to the main loop. // Post swap to the main loop.
s.executor.initiateSwap(globalCtx, swap) s.executor.initiateSwap(globalCtx, swap)
// Return hash so that the caller can identify this swap in the updates // Return hash so that the caller can identify this swap in the updates
// stream. // stream.
return &swap.hash, swap.htlc.Address, nil return &LoopOutSwapInfo{
SwapHash: swap.hash,
HtlcAddressP2WSH: swap.htlc.Address,
ServerMessage: initResult.serverMessage,
}, nil
} }
// LoopOutQuote takes a LoopOut amount and returns a break down of estimated // LoopOutQuote takes a LoopOut amount and returns a break down of estimated
@ -480,12 +484,13 @@ func (s *Client) LoopIn(globalCtx context.Context,
// Create a new swap object for this swap. // Create a new swap object for this swap.
initiationHeight := s.executor.height() initiationHeight := s.executor.height()
swapCfg := newSwapConfig(s.lndServices, s.Store, s.Server) swapCfg := newSwapConfig(s.lndServices, s.Store, s.Server)
swap, err := newLoopInSwap( initResult, err := newLoopInSwap(
globalCtx, swapCfg, initiationHeight, request, globalCtx, swapCfg, initiationHeight, request,
) )
if err != nil { if err != nil {
return nil, err return nil, err
} }
swap := initResult.swap
// Post swap to the main loop. // Post swap to the main loop.
s.executor.initiateSwap(globalCtx, swap) s.executor.initiateSwap(globalCtx, swap)
@ -496,6 +501,7 @@ func (s *Client) LoopIn(globalCtx context.Context,
SwapHash: swap.hash, SwapHash: swap.hash,
HtlcAddressP2WSH: swap.htlcP2WSH.Address, HtlcAddressP2WSH: swap.htlcP2WSH.Address,
HtlcAddressNP2WSH: swap.htlcNP2WSH.Address, HtlcAddressNP2WSH: swap.htlcNP2WSH.Address,
ServerMessage: initResult.serverMessage,
} }
return swapInfo, nil return swapInfo, nil
} }

@ -45,7 +45,7 @@ func TestSuccess(t *testing.T) {
ctx := createClientTestContext(t, nil) ctx := createClientTestContext(t, nil)
// Initiate loop out. // Initiate loop out.
hash, _, err := ctx.swapClient.LoopOut(context.Background(), testRequest) info, err := ctx.swapClient.LoopOut(context.Background(), testRequest)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -59,7 +59,7 @@ func TestSuccess(t *testing.T) {
// Expect client to register for conf. // Expect client to register for conf.
confIntent := ctx.AssertRegisterConf(false) confIntent := ctx.AssertRegisterConf(false)
testSuccess(ctx, testRequest.Amount, *hash, testSuccess(ctx, testRequest.Amount, info.SwapHash,
signalPrepaymentResult, signalSwapPaymentResult, false, signalPrepaymentResult, signalSwapPaymentResult, false,
confIntent, confIntent,
) )
@ -72,7 +72,7 @@ func TestFailOffchain(t *testing.T) {
ctx := createClientTestContext(t, nil) ctx := createClientTestContext(t, nil)
_, _, err := ctx.swapClient.LoopOut(context.Background(), testRequest) _, err := ctx.swapClient.LoopOut(context.Background(), testRequest)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -110,7 +110,7 @@ func TestFailWrongAmount(t *testing.T) {
// Modify mock for this subtest. // Modify mock for this subtest.
modifier(ctx.serverMock) modifier(ctx.serverMock)
_, _, err := ctx.swapClient.LoopOut( _, err := ctx.swapClient.LoopOut(
context.Background(), testRequest, context.Background(), testRequest,
) )
if err != expectedErr { if err != expectedErr {

@ -157,6 +157,9 @@ func loopIn(ctx *cli.Context) error {
fmt.Printf("HTLC address (NP2WSH): %v\n", resp.HtlcAddressNp2Wsh) fmt.Printf("HTLC address (NP2WSH): %v\n", resp.HtlcAddressNp2Wsh)
} }
fmt.Printf("HTLC address (P2WSH): %v\n", resp.HtlcAddressP2Wsh) fmt.Printf("HTLC address (P2WSH): %v\n", resp.HtlcAddressP2Wsh)
if resp.ServerMessage != "" {
fmt.Printf("Server message: %v\n", resp.ServerMessage)
}
fmt.Println() fmt.Println()
fmt.Printf("Run `loop monitor` to monitor progress.\n") fmt.Printf("Run `loop monitor` to monitor progress.\n")

@ -180,8 +180,11 @@ func loopOut(ctx *cli.Context) error {
} }
fmt.Printf("Swap initiated\n") fmt.Printf("Swap initiated\n")
fmt.Printf("ID: %v\n", resp.Id) fmt.Printf("ID: %v\n", resp.Id)
fmt.Printf("HTLC address: %v\n", resp.HtlcAddress) fmt.Printf("HTLC address: %v\n", resp.HtlcAddress)
if resp.ServerMessage != "" {
fmt.Printf("Server message: %v\n", resp.ServerMessage)
}
fmt.Println() fmt.Println()
fmt.Printf("Run `loop monitor` to monitor progress.\n") fmt.Printf("Run `loop monitor` to monitor progress.\n")

@ -248,6 +248,25 @@ type LoopInSwapInfo struct { // nolint
// HtlcAddressNP2WSH contains the nested segwit swap htlc address, // HtlcAddressNP2WSH contains the nested segwit swap htlc address,
// where the loop-in funds may be paid. // where the loop-in funds may be paid.
HtlcAddressNP2WSH btcutil.Address HtlcAddressNP2WSH btcutil.Address
// ServerMessages is the human-readable message received from the loop
// server.
ServerMessage string
}
// LoopOutSwapInfo contains essential information of a loop-out swap after the
// swap is initiated.
type LoopOutSwapInfo struct { // nolint:golint
// SwapHash contains the sha256 hash of the swap preimage.
SwapHash lntypes.Hash
// HtlcAddressP2WSH contains the native segwit swap htlc address that
// the server will publish to.
HtlcAddressP2WSH btcutil.Address
// ServerMessages is the human-readable message received from the loop
// server.
ServerMessage string
} }
// SwapInfoKit contains common swap info fields. // SwapInfoKit contains common swap info fields.

@ -103,17 +103,18 @@ func (s *swapClientServer) LoopOut(ctx context.Context,
req.OutgoingChanSet = in.OutgoingChanSet req.OutgoingChanSet = in.OutgoingChanSet
} }
hash, htlc, err := s.impl.LoopOut(ctx, req) info, err := s.impl.LoopOut(ctx, req)
if err != nil { if err != nil {
log.Errorf("LoopOut: %v", err) log.Errorf("LoopOut: %v", err)
return nil, err return nil, err
} }
return &looprpc.SwapResponse{ return &looprpc.SwapResponse{
Id: hash.String(), Id: info.SwapHash.String(),
IdBytes: hash[:], IdBytes: info.SwapHash[:],
HtlcAddress: htlc.String(), HtlcAddress: info.HtlcAddressP2WSH.String(),
HtlcAddressP2Wsh: htlc.String(), HtlcAddressP2Wsh: info.HtlcAddressP2WSH.String(),
ServerMessage: info.ServerMessage,
}, nil }, nil
} }
@ -456,6 +457,7 @@ func (s *swapClientServer) LoopIn(ctx context.Context,
Id: swapInfo.SwapHash.String(), Id: swapInfo.SwapHash.String(),
IdBytes: swapInfo.SwapHash[:], IdBytes: swapInfo.SwapHash[:],
HtlcAddressP2Wsh: swapInfo.HtlcAddressP2WSH.String(), HtlcAddressP2Wsh: swapInfo.HtlcAddressP2WSH.String(),
ServerMessage: swapInfo.ServerMessage,
} }
if req.ExternalHtlc { if req.ExternalHtlc {

@ -63,9 +63,16 @@ type loopInSwap struct {
timeoutAddr btcutil.Address timeoutAddr btcutil.Address
} }
// loopInInitResult contains information about a just-initiated loop in swap.
type loopInInitResult struct {
swap *loopInSwap
serverMessage string
}
// newLoopInSwap initiates a new loop in swap. // newLoopInSwap initiates a new loop in swap.
func newLoopInSwap(globalCtx context.Context, cfg *swapConfig, func newLoopInSwap(globalCtx context.Context, cfg *swapConfig,
currentHeight int32, request *LoopInRequest) (*loopInSwap, error) { currentHeight int32, request *LoopInRequest) (*loopInInitResult,
error) {
// Request current server loop in terms and use these to calculate the // Request current server loop in terms and use these to calculate the
// swap fee that we should subtract from the swap amount in the payment // swap fee that we should subtract from the swap amount in the payment
@ -180,7 +187,14 @@ func newLoopInSwap(globalCtx context.Context, cfg *swapConfig,
return nil, fmt.Errorf("cannot store swap: %v", err) return nil, fmt.Errorf("cannot store swap: %v", err)
} }
return swap, nil if swapResp.serverMessage != "" {
swap.log.Infof("Server message: %v", swapResp.serverMessage)
}
return &loopInInitResult{
swap: swap,
serverMessage: swapResp.serverMessage,
}, nil
} }
// resumeLoopInSwap returns a swap object representing a pending swap that has // resumeLoopInSwap returns a swap object representing a pending swap that has

@ -35,13 +35,14 @@ func TestLoopInSuccess(t *testing.T) {
cfg := newSwapConfig(&ctx.lnd.LndServices, ctx.store, ctx.server) cfg := newSwapConfig(&ctx.lnd.LndServices, ctx.store, ctx.server)
swap, err := newLoopInSwap( initResult, err := newLoopInSwap(
context.Background(), cfg, context.Background(), cfg,
height, &testLoopInRequest, height, &testLoopInRequest,
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
swap := initResult.swap
ctx.store.assertLoopInStored() ctx.store.assertLoopInStored()
@ -159,13 +160,14 @@ func testLoopInTimeout(t *testing.T,
req.ExternalHtlc = true req.ExternalHtlc = true
} }
s, err := newLoopInSwap( initResult, err := newLoopInSwap(
context.Background(), cfg, context.Background(), cfg,
height, &req, height, &req,
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
s := initResult.swap
ctx.store.assertLoopInStored() ctx.store.assertLoopInStored()

@ -73,10 +73,16 @@ type executeConfig struct {
loopOutMaxParts uint32 loopOutMaxParts uint32
} }
// loopOutInitResult contains information about a just-initiated loop out swap.
type loopOutInitResult struct {
swap *loopOutSwap
serverMessage string
}
// newLoopOutSwap initiates a new swap with the server and returns a // newLoopOutSwap initiates a new swap with the server and returns a
// corresponding swap object. // corresponding swap object.
func newLoopOutSwap(globalCtx context.Context, cfg *swapConfig, func newLoopOutSwap(globalCtx context.Context, cfg *swapConfig,
currentHeight int32, request *OutRequest) (*loopOutSwap, error) { currentHeight int32, request *OutRequest) (*loopOutInitResult, error) {
// Generate random preimage. // Generate random preimage.
var swapPreimage [32]byte var swapPreimage [32]byte
@ -176,7 +182,14 @@ func newLoopOutSwap(globalCtx context.Context, cfg *swapConfig,
return nil, fmt.Errorf("cannot store swap: %v", err) return nil, fmt.Errorf("cannot store swap: %v", err)
} }
return swap, nil if swapResp.serverMessage != "" {
swap.log.Infof("Server message: %v", swapResp.serverMessage)
}
return &loopOutInitResult{
swap: swap,
serverMessage: swapResp.serverMessage,
}, nil
} }
// resumeLoopOutSwap returns a swap object representing a pending swap that has // resumeLoopOutSwap returns a swap object representing a pending swap that has

@ -54,12 +54,13 @@ func TestLoopOutPaymentParameters(t *testing.T) {
req := *testRequest req := *testRequest
req.OutgoingChanSet = loopdb.ChannelSet{2, 3} req.OutgoingChanSet = loopdb.ChannelSet{2, 3}
swap, err := newLoopOutSwap( initResult, err := newLoopOutSwap(
context.Background(), cfg, height, &req, context.Background(), cfg, height, &req,
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
swap := initResult.swap
// Execute the swap in its own goroutine. // Execute the swap in its own goroutine.
errChan := make(chan error) errChan := make(chan error)
@ -150,12 +151,13 @@ func TestLateHtlcPublish(t *testing.T) {
cfg := newSwapConfig(&lnd.LndServices, store, server) cfg := newSwapConfig(&lnd.LndServices, store, server)
swap, err := newLoopOutSwap( initResult, err := newLoopOutSwap(
context.Background(), cfg, height, testRequest, context.Background(), cfg, height, testRequest,
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
swap := initResult.swap
sweeper := &sweep.Sweeper{Lnd: &lnd.LndServices} sweeper := &sweep.Sweeper{Lnd: &lnd.LndServices}
@ -235,12 +237,13 @@ func TestCustomSweepConfTarget(t *testing.T) {
&lnd.LndServices, newStoreMock(t), server, &lnd.LndServices, newStoreMock(t), server,
) )
swap, err := newLoopOutSwap( initResult, err := newLoopOutSwap(
context.Background(), cfg, ctx.Lnd.Height, testRequest, context.Background(), cfg, ctx.Lnd.Height, testRequest,
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
swap := initResult.swap
// Set up the required dependencies to execute the swap. // Set up the required dependencies to execute the swap.
// //
@ -442,10 +445,11 @@ func TestPreimagePush(t *testing.T) {
&lnd.LndServices, newStoreMock(t), server, &lnd.LndServices, newStoreMock(t), server,
) )
swap, err := newLoopOutSwap( initResult, err := newLoopOutSwap(
context.Background(), cfg, ctx.Lnd.Height, testRequest, context.Background(), cfg, ctx.Lnd.Height, testRequest,
) )
require.NoError(t, err) require.NoError(t, err)
swap := initResult.swap
// Set up the required dependencies to execute the swap. // Set up the required dependencies to execute the swap.
sweeper := &sweep.Sweeper{Lnd: &lnd.LndServices} sweeper := &sweep.Sweeper{Lnd: &lnd.LndServices}

@ -411,7 +411,9 @@ type SwapResponse struct {
//* //*
//The native segwit address of the on-chain htlc. //The native segwit address of the on-chain htlc.
//Used for both loop-in and loop-out. //Used for both loop-in and loop-out.
HtlcAddressP2Wsh string `protobuf:"bytes,5,opt,name=htlc_address_p2wsh,json=htlcAddressP2wsh,proto3" json:"htlc_address_p2wsh,omitempty"` HtlcAddressP2Wsh string `protobuf:"bytes,5,opt,name=htlc_address_p2wsh,json=htlcAddressP2wsh,proto3" json:"htlc_address_p2wsh,omitempty"`
// A human-readable message received from the loop server.
ServerMessage string `protobuf:"bytes,6,opt,name=server_message,json=serverMessage,proto3" json:"server_message,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -479,6 +481,13 @@ func (m *SwapResponse) GetHtlcAddressP2Wsh() string {
return "" return ""
} }
func (m *SwapResponse) GetServerMessage() string {
if m != nil {
return m.ServerMessage
}
return ""
}
type MonitorRequest struct { type MonitorRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
@ -1251,103 +1260,104 @@ func init() {
func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) } func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) }
var fileDescriptor_014de31d7ac8c57c = []byte{ var fileDescriptor_014de31d7ac8c57c = []byte{
// 1533 bytes of a gzipped FileDescriptorProto // 1549 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x4d, 0x72, 0xdb, 0x38, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xcd, 0x72, 0xdb, 0xb6,
0x16, 0x0e, 0xf5, 0xaf, 0x27, 0x8a, 0xa2, 0xe0, 0xc4, 0x96, 0x35, 0x93, 0x8a, 0xc2, 0x99, 0xcc, 0x16, 0x0e, 0xf5, 0xaf, 0x23, 0x8a, 0xa2, 0xe0, 0xc4, 0x96, 0x75, 0x6f, 0x26, 0x0a, 0xef, 0x4d,
0x28, 0xae, 0x94, 0x35, 0x71, 0x56, 0x93, 0x9a, 0x9a, 0x2a, 0x47, 0x56, 0x62, 0xb9, 0xfc, 0xa3, 0xab, 0x78, 0x32, 0x56, 0xe3, 0xac, 0x9a, 0xe9, 0x74, 0xc6, 0x91, 0x95, 0x58, 0x1e, 0xff, 0xa8,
0xa1, 0xe4, 0x54, 0x25, 0x1b, 0x0e, 0x2c, 0xc2, 0x16, 0xab, 0x45, 0x82, 0x21, 0xa0, 0xd8, 0xae, 0x94, 0x9c, 0x99, 0x64, 0xc3, 0xc2, 0x22, 0x6c, 0x71, 0x2a, 0x12, 0x0c, 0x01, 0xc5, 0xf6, 0x64,
0x54, 0x36, 0x7d, 0x85, 0xbe, 0x41, 0xdf, 0xa0, 0xd7, 0xbd, 0xeb, 0x65, 0xef, 0xba, 0xfa, 0x00, 0xb2, 0xe9, 0x2b, 0xf4, 0x0d, 0xfa, 0x06, 0x5d, 0xf7, 0x0d, 0xba, 0xeb, 0xf4, 0x01, 0xba, 0xe9,
0xbd, 0xe9, 0x23, 0xf4, 0x01, 0xba, 0x00, 0x50, 0x14, 0x65, 0xcb, 0x59, 0x64, 0x27, 0x7e, 0xf8, 0xa6, 0xfb, 0x3e, 0x40, 0x07, 0x00, 0x45, 0x51, 0xfe, 0xc9, 0x22, 0x3b, 0xf1, 0xc3, 0x87, 0x0f,
0xf0, 0xe1, 0xe1, 0xbd, 0x87, 0x0f, 0x10, 0xe8, 0xe3, 0xa9, 0x47, 0x02, 0xbe, 0x1d, 0x46, 0x94, 0x07, 0xe7, 0x1c, 0x7c, 0x80, 0x40, 0x1f, 0x4f, 0x3d, 0x12, 0xf0, 0xcd, 0x30, 0xa2, 0x9c, 0xa2,
0x53, 0x54, 0x9c, 0x52, 0x1a, 0x46, 0xe1, 0xb8, 0xf9, 0xd7, 0x0b, 0x4a, 0x2f, 0xa6, 0xa4, 0x83, 0xe2, 0x94, 0xd2, 0x30, 0x0a, 0xc7, 0xcd, 0xff, 0x9e, 0x51, 0x7a, 0x36, 0x25, 0x1d, 0x1c, 0x7a,
0x43, 0xaf, 0x83, 0x83, 0x80, 0x72, 0xcc, 0x3d, 0x1a, 0x30, 0x45, 0xb3, 0x7e, 0xce, 0x82, 0x71, 0x1d, 0x1c, 0x04, 0x94, 0x63, 0xee, 0xd1, 0x80, 0x29, 0x9a, 0xf5, 0x5b, 0x16, 0x8c, 0x7d, 0x4a,
0x48, 0x69, 0x78, 0x32, 0xe3, 0x36, 0xf9, 0x30, 0x23, 0x8c, 0x23, 0x13, 0xb2, 0xd8, 0xe7, 0x0d, 0xc3, 0xa3, 0x19, 0xb7, 0xc9, 0xbb, 0x19, 0x61, 0x1c, 0x99, 0x90, 0xc5, 0x3e, 0x6f, 0x68, 0x2d,
0xad, 0xa5, 0xb5, 0xb3, 0xb6, 0xf8, 0x89, 0x10, 0xe4, 0x5c, 0xc2, 0x78, 0x23, 0xd3, 0xd2, 0xda, 0xad, 0x9d, 0xb5, 0xc5, 0x4f, 0x84, 0x20, 0xe7, 0x12, 0xc6, 0x1b, 0x99, 0x96, 0xd6, 0x2e, 0xdb,
0x65, 0x5b, 0xfe, 0x46, 0x1d, 0xb8, 0xef, 0xe3, 0x2b, 0x87, 0x5d, 0xe2, 0xd0, 0x89, 0xe8, 0x8c, 0xf2, 0x37, 0xea, 0xc0, 0x5d, 0x1f, 0x5f, 0x38, 0xec, 0x1c, 0x87, 0x4e, 0x44, 0x67, 0xdc, 0x0b,
0x7b, 0xc1, 0x85, 0x73, 0x4e, 0x48, 0x23, 0x2b, 0xa7, 0xd5, 0x7d, 0x7c, 0x35, 0xbc, 0xc4, 0xa1, 0xce, 0x9c, 0x53, 0x42, 0x1a, 0x59, 0x39, 0xad, 0xee, 0xe3, 0x8b, 0xe1, 0x39, 0x0e, 0x6d, 0x35,
0xad, 0x46, 0x5e, 0x13, 0x82, 0x5e, 0xc0, 0xba, 0x98, 0x10, 0x46, 0x24, 0xc4, 0xd7, 0x4b, 0x53, 0xf2, 0x92, 0x10, 0xf4, 0x0c, 0x56, 0xc5, 0x84, 0x30, 0x22, 0x21, 0xbe, 0x5c, 0x9a, 0x92, 0x93,
0x72, 0x72, 0xca, 0x9a, 0x8f, 0xaf, 0x06, 0x72, 0x30, 0x35, 0xa9, 0x05, 0x7a, 0xb2, 0x8a, 0xa0, 0x53, 0x56, 0x7c, 0x7c, 0x31, 0x90, 0x83, 0xa9, 0x49, 0x2d, 0xd0, 0x93, 0x55, 0x04, 0x35, 0x2f,
0xe6, 0x25, 0x15, 0x62, 0x75, 0xc1, 0xf8, 0x3b, 0x18, 0x29, 0x59, 0x11, 0x78, 0x41, 0x72, 0xf4, 0xa9, 0x10, 0xab, 0x0b, 0xc6, 0xff, 0xc1, 0x48, 0xc9, 0x8a, 0xc0, 0x0b, 0x92, 0xa3, 0x27, 0x72,
0x44, 0x6e, 0xd7, 0xe7, 0xc8, 0x82, 0xaa, 0x60, 0xf9, 0x5e, 0x40, 0x22, 0x29, 0x54, 0x94, 0xa4, 0xdb, 0x3e, 0x47, 0x16, 0x54, 0x05, 0xcb, 0xf7, 0x02, 0x12, 0x49, 0xa1, 0xa2, 0x24, 0x55, 0x7c,
0x8a, 0x8f, 0xaf, 0x8e, 0x04, 0x26, 0x94, 0x9e, 0x81, 0x29, 0x72, 0xe6, 0xd0, 0x19, 0x77, 0xc6, 0x7c, 0x71, 0x20, 0x30, 0xa1, 0xf4, 0x04, 0x4c, 0x91, 0x33, 0x87, 0xce, 0xb8, 0x33, 0x9e, 0xe0,
0x13, 0x1c, 0x04, 0x64, 0xda, 0x28, 0xb5, 0xb4, 0x76, 0xee, 0x55, 0xa6, 0xa1, 0xd9, 0xc6, 0x54, 0x20, 0x20, 0xd3, 0x46, 0xa9, 0xa5, 0xb5, 0x73, 0x2f, 0x32, 0x0d, 0xcd, 0x36, 0xa6, 0x2a, 0x4b,
0x65, 0xa9, 0xab, 0x46, 0xd0, 0x16, 0xd4, 0xe9, 0x8c, 0x5f, 0x50, 0xb1, 0x09, 0xc1, 0x76, 0x18, 0x5d, 0x35, 0x82, 0x36, 0xa0, 0x4e, 0x67, 0xfc, 0x8c, 0x8a, 0x4d, 0x08, 0xb6, 0xc3, 0x08, 0x6f,
0xe1, 0x8d, 0x4a, 0x2b, 0xdb, 0xce, 0xd9, 0xb5, 0xf9, 0x80, 0xe0, 0x0e, 0x09, 0x17, 0x5c, 0x76, 0x54, 0x5a, 0xd9, 0x76, 0xce, 0xae, 0xcd, 0x07, 0x04, 0x77, 0x48, 0xb8, 0xe0, 0xb2, 0x73, 0x42,
0x49, 0x48, 0xe8, 0x8c, 0x69, 0x70, 0xee, 0x70, 0x1c, 0x5d, 0x10, 0xde, 0x28, 0xb7, 0xb4, 0x76, 0x42, 0x67, 0x4c, 0x83, 0x53, 0x87, 0xe3, 0xe8, 0x8c, 0xf0, 0x46, 0xb9, 0xa5, 0xb5, 0xf3, 0x76,
0xde, 0xae, 0xc9, 0x81, 0x2e, 0x0d, 0xce, 0x47, 0x12, 0x46, 0x2f, 0x61, 0x53, 0xee, 0x36, 0x9c, 0x4d, 0x0e, 0x74, 0x69, 0x70, 0x3a, 0x92, 0x30, 0x7a, 0x0e, 0xeb, 0x72, 0xb7, 0xe1, 0xec, 0x64,
0x9d, 0x4d, 0xbd, 0xb1, 0xac, 0x95, 0xe3, 0x12, 0xec, 0x4e, 0xbd, 0x80, 0x34, 0x40, 0x84, 0x63, 0xea, 0x8d, 0x65, 0xad, 0x1c, 0x97, 0x60, 0x77, 0xea, 0x05, 0xa4, 0x01, 0x22, 0x1c, 0x7b, 0x4d,
0x6f, 0x08, 0xc2, 0x60, 0x31, 0xbe, 0x17, 0x0f, 0x5b, 0xbf, 0x68, 0x50, 0x15, 0xc5, 0xec, 0x07, 0x10, 0x06, 0x8b, 0xf1, 0x9d, 0x78, 0xd8, 0xfa, 0x5d, 0x83, 0xaa, 0x28, 0x66, 0x3f, 0xb8, 0xbd,
0x77, 0xd7, 0xf2, 0x66, 0x46, 0x33, 0xb7, 0x32, 0x7a, 0x2b, 0x57, 0xd9, 0xdb, 0xb9, 0xda, 0x84, 0x96, 0x57, 0x33, 0x9a, 0xb9, 0x96, 0xd1, 0x6b, 0xb9, 0xca, 0x5e, 0xcf, 0xd5, 0x3a, 0x94, 0xa6,
0xd2, 0x14, 0x33, 0xee, 0x4c, 0x68, 0x28, 0xcb, 0xa7, 0xdb, 0x45, 0xf1, 0xbd, 0x4f, 0x43, 0xf4, 0x98, 0x71, 0x67, 0x42, 0x43, 0x59, 0x3e, 0xdd, 0x2e, 0x8a, 0xef, 0x5d, 0x1a, 0xa2, 0xff, 0x41,
0x37, 0xa8, 0x92, 0x2b, 0x4e, 0xa2, 0x00, 0x4f, 0x9d, 0x09, 0x9f, 0x8e, 0x65, 0xcd, 0x4a, 0xb6, 0x95, 0x5c, 0x70, 0x12, 0x05, 0x78, 0xea, 0x4c, 0xf8, 0x74, 0x2c, 0x6b, 0x56, 0xb2, 0xf5, 0x39,
0x3e, 0x07, 0xf7, 0xf9, 0x74, 0x8c, 0xda, 0x60, 0x8a, 0xb1, 0xa5, 0x84, 0x14, 0x64, 0x42, 0x0c, 0xb8, 0xcb, 0xa7, 0x63, 0xd4, 0x06, 0x53, 0x8c, 0x2d, 0x25, 0xa4, 0x20, 0x13, 0x62, 0x08, 0x7c,
0x81, 0x2f, 0xf2, 0x61, 0xfd, 0xa4, 0x81, 0x2e, 0x3b, 0x89, 0xb0, 0x90, 0x06, 0x8c, 0x20, 0x04, 0x91, 0x0f, 0xeb, 0x6f, 0x0d, 0x74, 0xd9, 0x49, 0x84, 0x85, 0x34, 0x60, 0x04, 0x21, 0xc8, 0x78,
0x19, 0xcf, 0x95, 0x3b, 0x2a, 0xcb, 0xc2, 0x64, 0x3c, 0x57, 0x84, 0xe3, 0xb9, 0xce, 0xd9, 0x35, 0xae, 0xdc, 0x51, 0x59, 0x16, 0x26, 0xe3, 0xb9, 0x22, 0x1c, 0xcf, 0x75, 0x4e, 0x2e, 0x39, 0x61,
0x27, 0x4c, 0x46, 0xab, 0xdb, 0x45, 0xcf, 0x7d, 0x25, 0x3e, 0xd1, 0x13, 0xd0, 0xe5, 0x4a, 0xd8, 0x32, 0x5a, 0xdd, 0x2e, 0x7a, 0xee, 0x0b, 0xf1, 0x89, 0x1e, 0x81, 0x2e, 0x57, 0xc2, 0xae, 0x1b,
0x75, 0x23, 0xc2, 0x98, 0xea, 0x61, 0x39, 0xb1, 0x22, 0xf0, 0x5d, 0x05, 0xa3, 0x6d, 0x58, 0x4b, 0x11, 0xc6, 0x54, 0x0f, 0xcb, 0x89, 0x15, 0x81, 0x6f, 0x2b, 0x18, 0x6d, 0xc2, 0x4a, 0x9a, 0xe6,
0xd3, 0x9c, 0x20, 0xdc, 0xb9, 0x64, 0x13, 0xb9, 0xb7, 0xb2, 0x5d, 0x4f, 0x31, 0x8f, 0xe5, 0x00, 0x04, 0xe1, 0xd6, 0x39, 0x9b, 0xc8, 0xbd, 0x95, 0xed, 0x7a, 0x8a, 0x79, 0x28, 0x07, 0xd0, 0x13,
0x7a, 0x06, 0x68, 0x89, 0xaf, 0xe8, 0x79, 0x49, 0x37, 0x53, 0xf4, 0x81, 0xc0, 0x2d, 0x13, 0x8c, 0x40, 0x4b, 0x7c, 0x45, 0xcf, 0x4b, 0xba, 0x99, 0xa2, 0x0f, 0x24, 0xfb, 0x11, 0x18, 0x8c, 0x44,
0x23, 0x1a, 0x78, 0x9c, 0x46, 0x71, 0x61, 0xac, 0xdf, 0xb2, 0x00, 0x62, 0x5b, 0x43, 0x8e, 0xf9, 0xef, 0x49, 0xe4, 0xf8, 0x84, 0x31, 0x7c, 0x46, 0xe4, 0x66, 0xcb, 0x76, 0x55, 0xa1, 0x07, 0x0a,
0x8c, 0xad, 0x3c, 0x73, 0x62, 0x9b, 0x99, 0x3b, 0xb7, 0x59, 0xb9, 0xb9, 0xcd, 0x1c, 0xbf, 0x0e, 0xb4, 0x4c, 0x30, 0x0e, 0x68, 0xe0, 0x71, 0x1a, 0xc5, 0xf5, 0xb3, 0xfe, 0xcc, 0x02, 0x88, 0xdd,
0x55, 0xad, 0x8c, 0x9d, 0xfa, 0x76, 0x7c, 0xfa, 0xb7, 0xc5, 0x1a, 0xa3, 0xeb, 0x90, 0xd8, 0x72, 0x0f, 0x39, 0xe6, 0x33, 0x76, 0xe3, 0xd1, 0x14, 0xd9, 0xc8, 0xdc, 0x9a, 0x8d, 0xca, 0xd5, 0x6c,
0x18, 0xb5, 0x21, 0xcf, 0x38, 0xe6, 0xea, 0xcc, 0x19, 0x3b, 0x68, 0x89, 0x27, 0x62, 0x21, 0xb6, 0xe4, 0xf8, 0x65, 0xa8, 0x4a, 0x6a, 0x6c, 0xd5, 0x37, 0x63, 0x93, 0xd8, 0x14, 0x6b, 0x8c, 0x2e,
0x22, 0xa0, 0x7f, 0x42, 0xcd, 0x0b, 0x3c, 0xee, 0xa9, 0x0e, 0xe4, 0x9e, 0x3f, 0x3f, 0x7c, 0xc6, 0x43, 0x62, 0xcb, 0x61, 0xd4, 0x86, 0x3c, 0xe3, 0x98, 0xab, 0xa3, 0x69, 0x6c, 0xa1, 0x25, 0x9e,
0x02, 0x1e, 0x79, 0xbe, 0x90, 0x34, 0x65, 0x2b, 0xcc, 0x42, 0x17, 0x73, 0xa2, 0x98, 0xea, 0x08, 0x88, 0x85, 0xd8, 0x8a, 0x80, 0xbe, 0x84, 0x9a, 0x17, 0x78, 0xdc, 0x53, 0x8d, 0xca, 0x3d, 0x7f,
0x1a, 0x02, 0x3f, 0x95, 0xb0, 0x64, 0xde, 0x2c, 0x45, 0x71, 0x75, 0x29, 0x56, 0xa7, 0x56, 0x5f, 0x7e, 0x46, 0x8d, 0x05, 0x3c, 0xf2, 0x7c, 0x21, 0x69, 0xca, 0x8e, 0x99, 0x85, 0x2e, 0xe6, 0x44,
0x9d, 0xda, 0xbb, 0x0a, 0x57, 0xbd, 0xab, 0x70, 0x8f, 0xa0, 0x32, 0xa6, 0x8c, 0x3b, 0x8c, 0x44, 0x31, 0xd5, 0x49, 0x35, 0x04, 0x7e, 0x2c, 0x61, 0xc9, 0xbc, 0x5a, 0xb1, 0xe2, 0xcd, 0x15, 0xbb,
0x1f, 0x49, 0x24, 0x0f, 0x78, 0xd6, 0x06, 0x01, 0x0d, 0x25, 0x82, 0x1e, 0x83, 0x2e, 0x09, 0x34, 0xb9, 0x02, 0xfa, 0x2d, 0x15, 0xb8, 0xa5, 0xbe, 0xd5, 0xdb, 0xea, 0xfb, 0x00, 0x2a, 0x63, 0xca,
0x18, 0x4f, 0xb0, 0x17, 0xc8, 0x73, 0x9a, 0xb5, 0xe5, 0xa4, 0x13, 0x05, 0x89, 0x16, 0x57, 0x94, 0xb8, 0xa3, 0x0a, 0x24, 0x7d, 0x20, 0x6b, 0x83, 0x80, 0x86, 0x12, 0x41, 0x0f, 0x41, 0x97, 0x04,
0xf3, 0x73, 0xc5, 0x01, 0x65, 0x39, 0x92, 0x13, 0x63, 0x16, 0x02, 0xf3, 0xd0, 0x63, 0x5c, 0x24, 0x1a, 0x8c, 0x27, 0xd8, 0x0b, 0xe4, 0x71, 0xce, 0xda, 0x72, 0xd2, 0x91, 0x82, 0xc4, 0x49, 0x50,
0x96, 0xcd, 0xab, 0xfe, 0x5f, 0xa8, 0xa7, 0xb0, 0xb8, 0xa1, 0x9f, 0x42, 0x5e, 0x9c, 0x46, 0xd6, 0x94, 0xd3, 0x53, 0xc5, 0x01, 0xe5, 0x4c, 0x92, 0x13, 0x63, 0x16, 0x02, 0x73, 0xdf, 0x63, 0x5c,
0xd0, 0x5a, 0xd9, 0x76, 0x65, 0x67, 0xed, 0x56, 0x4d, 0x66, 0xcc, 0x56, 0x0c, 0xeb, 0x31, 0xd4, 0x24, 0x96, 0xcd, 0xab, 0xfe, 0x2d, 0xd4, 0x53, 0x58, 0xdc, 0xf7, 0x8f, 0x21, 0x2f, 0x0e, 0x2d,
0x04, 0xd8, 0x0f, 0xce, 0xe9, 0xfc, 0x84, 0x1b, 0xc9, 0x71, 0xd0, 0x45, 0x8f, 0x58, 0x06, 0xe8, 0x6b, 0x68, 0xad, 0x6c, 0xbb, 0xb2, 0xb5, 0x72, 0xad, 0x26, 0x33, 0x66, 0x2b, 0x86, 0xf5, 0x10,
0x23, 0x12, 0xf9, 0xc9, 0x92, 0x9f, 0xa1, 0x1a, 0x7f, 0xc7, 0xcb, 0xfd, 0x03, 0x6a, 0xbe, 0x17, 0x6a, 0x02, 0xec, 0x07, 0xa7, 0x74, 0x6e, 0x04, 0x46, 0x72, 0x6a, 0x74, 0xd1, 0x23, 0x96, 0x01,
0x28, 0x03, 0xc0, 0x3e, 0x9d, 0x05, 0x3c, 0x2e, 0x6c, 0xd5, 0xf7, 0x02, 0xa1, 0xbe, 0x2b, 0x41, 0xfa, 0x88, 0x44, 0x7e, 0xb2, 0xe4, 0x47, 0xa8, 0xc6, 0xdf, 0xf1, 0x72, 0x5f, 0x40, 0xcd, 0xf7,
0xc9, 0x9b, 0x1b, 0x45, 0xcc, 0x2b, 0xc4, 0x3c, 0xe5, 0x15, 0x8a, 0x77, 0x90, 0x2b, 0x69, 0x66, 0x02, 0xe5, 0x13, 0xd8, 0xa7, 0xb3, 0x80, 0xc7, 0x85, 0xad, 0xfa, 0x5e, 0x20, 0xd4, 0xb7, 0x25,
0xe6, 0x20, 0x57, 0xca, 0x98, 0xd9, 0x83, 0x5c, 0x29, 0x6b, 0xe6, 0x0e, 0x72, 0xa5, 0x9c, 0x99, 0x28, 0x79, 0x73, 0x3f, 0x89, 0x79, 0x85, 0x98, 0xa7, 0x2c, 0x45, 0xf1, 0xf6, 0x72, 0x25, 0xcd,
0x3f, 0xc8, 0x95, 0x8a, 0x66, 0xc9, 0xfa, 0x5e, 0x03, 0xfd, 0x7f, 0x33, 0xca, 0xc9, 0xdd, 0x8e, 0xcc, 0xec, 0xe5, 0x4a, 0x19, 0x33, 0xbb, 0x97, 0x2b, 0x65, 0xcd, 0xdc, 0x5e, 0xae, 0x94, 0x33,
0x24, 0x2b, 0xb2, 0xb0, 0x81, 0x8c, 0xb4, 0x01, 0x18, 0x2f, 0x2c, 0xf1, 0x96, 0xa3, 0x64, 0x57, 0xf3, 0x7b, 0xb9, 0x52, 0xd1, 0x2c, 0x59, 0x3f, 0x6b, 0xa0, 0x7f, 0x37, 0xa3, 0x9c, 0xdc, 0x6e,
0x38, 0xca, 0x17, 0x7d, 0x33, 0xf7, 0x65, 0xdf, 0xfc, 0x41, 0x83, 0x6a, 0x1c, 0x64, 0x9c, 0xa4, 0x5c, 0xb2, 0x22, 0x0b, 0xb7, 0xc8, 0x48, 0xb7, 0x80, 0xf1, 0xc2, 0x39, 0xaf, 0x19, 0x4f, 0xf6,
0x4d, 0x28, 0x25, 0x0e, 0xa9, 0x42, 0x2d, 0xb2, 0xd8, 0x1e, 0x1f, 0x02, 0xa4, 0x2e, 0x1b, 0x65, 0x06, 0xe3, 0xf9, 0xa4, 0xbd, 0xe6, 0x3e, 0x6d, 0xaf, 0xbf, 0x68, 0x50, 0x8d, 0x83, 0x8c, 0x93,
0x9f, 0xe5, 0x30, 0xb9, 0x69, 0xfe, 0x02, 0xe5, 0x9b, 0xce, 0x59, 0xf2, 0xe7, 0xb6, 0x29, 0x2f, 0xb4, 0x0e, 0xa5, 0xc4, 0x48, 0x55, 0xa8, 0x45, 0x16, 0xbb, 0xe8, 0x7d, 0x80, 0xd4, 0x9d, 0xa4,
0x02, 0x11, 0x24, 0xbe, 0xf6, 0x49, 0xc0, 0x1d, 0x79, 0xab, 0x2a, 0xff, 0xac, 0xc9, 0xe0, 0x14, 0x5c, 0xb6, 0x1c, 0x26, 0x17, 0xd2, 0x7f, 0xa0, 0x7c, 0xd5, 0x60, 0x4b, 0xfe, 0xdc, 0x5d, 0xe5,
0xbe, 0x27, 0x12, 0xf5, 0x10, 0x60, 0x3c, 0xe5, 0x1f, 0x1d, 0x97, 0x4c, 0x39, 0x96, 0x25, 0xca, 0x7d, 0x21, 0x82, 0xc4, 0x97, 0x3e, 0x09, 0xb8, 0x23, 0x2f, 0x5f, 0x65, 0xb3, 0x35, 0x19, 0x9c,
0xdb, 0x65, 0x81, 0xec, 0x09, 0xc0, 0xaa, 0x41, 0x75, 0x44, 0xbf, 0x21, 0x41, 0x52, 0xe8, 0xff, 0xc2, 0x77, 0x44, 0xa2, 0xee, 0x03, 0x8c, 0xa7, 0xfc, 0xbd, 0xe3, 0x92, 0x29, 0xc7, 0xb2, 0x44,
0x80, 0x31, 0x07, 0xe2, 0x4d, 0x6c, 0x41, 0x81, 0x4b, 0x24, 0xee, 0xac, 0xc5, 0x69, 0x3f, 0x64, 0x79, 0xbb, 0x2c, 0x90, 0x1d, 0x01, 0x58, 0x35, 0xa8, 0x8e, 0xe8, 0x0f, 0x24, 0x48, 0x0a, 0xfd,
0x98, 0x4b, 0xb2, 0x1d, 0x33, 0xac, 0x1f, 0x33, 0x50, 0x4e, 0x50, 0x91, 0xf1, 0x33, 0xcc, 0x88, 0x0d, 0x18, 0x73, 0x20, 0xde, 0xc4, 0x06, 0x14, 0xb8, 0x44, 0xe2, 0xce, 0x5a, 0x9c, 0xf6, 0x7d,
0xe3, 0xe3, 0x31, 0x8e, 0x28, 0x0d, 0xe2, 0xfe, 0xd2, 0x05, 0x78, 0x14, 0x63, 0xe2, 0xa0, 0xcc, 0x86, 0xb9, 0x24, 0xdb, 0x31, 0xc3, 0xfa, 0x35, 0x03, 0xe5, 0x04, 0x15, 0x19, 0x3f, 0xc1, 0x8c,
0xf7, 0x31, 0xc1, 0x6c, 0x22, 0x53, 0xa1, 0xdb, 0x95, 0x18, 0xdb, 0xc7, 0x6c, 0x82, 0x9e, 0x82, 0x38, 0x3e, 0x1e, 0xe3, 0x88, 0xd2, 0x20, 0xee, 0x2f, 0x5d, 0x80, 0x07, 0x31, 0x26, 0x0e, 0xca,
0x39, 0xa7, 0x84, 0x11, 0xf1, 0x7c, 0x7c, 0x41, 0x62, 0x7f, 0xae, 0xc5, 0xf8, 0x20, 0x86, 0x85, 0x7c, 0x1f, 0x13, 0xcc, 0x26, 0x32, 0x15, 0xba, 0x5d, 0x89, 0xb1, 0x5d, 0xcc, 0x26, 0xe8, 0x31,
0x8d, 0xa8, 0x2e, 0x73, 0x42, 0xec, 0xb9, 0x8e, 0xcf, 0x30, 0x8f, 0x1f, 0x06, 0x86, 0xc2, 0x07, 0x98, 0x73, 0x4a, 0x18, 0x11, 0xcf, 0x17, 0x06, 0xa9, 0x6c, 0xbc, 0x16, 0xe3, 0x83, 0x18, 0x16,
0xd8, 0x73, 0x8f, 0x18, 0xe6, 0xe8, 0x39, 0x3c, 0x48, 0xbd, 0x1e, 0x52, 0x74, 0xd5, 0xc6, 0x28, 0x36, 0xa2, 0xba, 0xcc, 0x09, 0xb1, 0xe7, 0x3a, 0x3e, 0xc3, 0x3c, 0x7e, 0x3f, 0x18, 0x0a, 0x1f,
0x4a, 0x9e, 0x0f, 0xc9, 0x94, 0xc7, 0xa0, 0x0b, 0x5f, 0x72, 0xc6, 0x11, 0xc1, 0x9c, 0xb8, 0x71, 0x60, 0xcf, 0x3d, 0x60, 0x98, 0xa3, 0xa7, 0x70, 0x2f, 0xf5, 0xc8, 0x48, 0xd1, 0x55, 0x1b, 0xa3,
0x23, 0x57, 0x04, 0xd6, 0x55, 0x10, 0x6a, 0x40, 0x91, 0x5c, 0x85, 0x5e, 0x44, 0x5c, 0xe9, 0x4b, 0x28, 0x79, 0x65, 0x24, 0x53, 0x1e, 0x82, 0x2e, 0x7c, 0xc9, 0x19, 0x47, 0x04, 0x73, 0xe2, 0xc6,
0x25, 0x7b, 0xfe, 0x29, 0x26, 0x33, 0x4e, 0x23, 0x7c, 0x41, 0x9c, 0x00, 0xfb, 0x44, 0x5a, 0x46, 0x8d, 0x5c, 0x11, 0x58, 0x57, 0x41, 0xa8, 0x01, 0x45, 0x72, 0x11, 0x7a, 0x11, 0x71, 0xa5, 0x2f,
0xd9, 0xae, 0xc4, 0xd8, 0x31, 0xf6, 0xc9, 0xd6, 0x13, 0x28, 0xcd, 0x8d, 0x16, 0xe9, 0x50, 0x3a, 0x95, 0xec, 0xf9, 0xa7, 0x98, 0xcc, 0x38, 0x8d, 0xf0, 0x19, 0x71, 0x02, 0xec, 0x13, 0x69, 0x19,
0x3c, 0x39, 0x19, 0x38, 0x27, 0xa7, 0x23, 0xf3, 0x1e, 0xaa, 0x40, 0x51, 0x7e, 0xf5, 0x8f, 0x4d, 0x65, 0xbb, 0x12, 0x63, 0x87, 0xd8, 0x27, 0x1b, 0x8f, 0xa0, 0x34, 0x37, 0x5a, 0xa4, 0x43, 0x69,
0x6d, 0x8b, 0x41, 0x39, 0xf1, 0x59, 0x54, 0x85, 0x72, 0xff, 0xb8, 0x3f, 0xea, 0xef, 0x8e, 0x7a, 0xff, 0xe8, 0x68, 0xe0, 0x1c, 0x1d, 0x8f, 0xcc, 0x3b, 0xa8, 0x02, 0x45, 0xf9, 0xd5, 0x3f, 0x34,
0x7b, 0xe6, 0x3d, 0xf4, 0x00, 0xea, 0x03, 0xbb, 0xd7, 0x3f, 0xda, 0x7d, 0xd3, 0x73, 0xec, 0xde, 0xb5, 0x0d, 0x06, 0xe5, 0xc4, 0x67, 0x51, 0x15, 0xca, 0xfd, 0xc3, 0xfe, 0xa8, 0xbf, 0x3d, 0xea,
0xdb, 0xde, 0xee, 0x61, 0x6f, 0xcf, 0xd4, 0x10, 0x02, 0x63, 0x7f, 0x74, 0xd8, 0x75, 0x06, 0xa7, 0xed, 0x98, 0x77, 0xd0, 0x3d, 0xa8, 0x0f, 0xec, 0x5e, 0xff, 0x60, 0xfb, 0x55, 0xcf, 0xb1, 0x7b,
0xaf, 0x0e, 0xfb, 0xc3, 0xfd, 0xde, 0x9e, 0x99, 0x11, 0x9a, 0xc3, 0xd3, 0x6e, 0xb7, 0x37, 0x1c, 0xaf, 0x7b, 0xdb, 0xfb, 0xbd, 0x1d, 0x53, 0x43, 0x08, 0x8c, 0xdd, 0xd1, 0x7e, 0xd7, 0x19, 0x1c,
0x9a, 0x59, 0x04, 0x50, 0x78, 0xbd, 0xdb, 0x17, 0xe4, 0x1c, 0x5a, 0x83, 0x5a, 0xff, 0xf8, 0xed, 0xbf, 0xd8, 0xef, 0x0f, 0x77, 0x7b, 0x3b, 0x66, 0x46, 0x68, 0x0e, 0x8f, 0xbb, 0xdd, 0xde, 0x70,
0x49, 0xbf, 0xdb, 0x73, 0x86, 0xbd, 0xd1, 0x48, 0x80, 0xf9, 0x9d, 0x3f, 0x0a, 0xea, 0xa6, 0xe9, 0x68, 0x66, 0x11, 0x40, 0xe1, 0xe5, 0x76, 0x5f, 0x90, 0x73, 0x68, 0x05, 0x6a, 0xfd, 0xc3, 0xd7,
0xca, 0xd7, 0x21, 0xb2, 0xa1, 0x18, 0xbf, 0xf7, 0xd0, 0xc6, 0xa2, 0x1f, 0x96, 0x5e, 0x80, 0xcd, 0x47, 0xfd, 0x6e, 0xcf, 0x19, 0xf6, 0x46, 0x23, 0x01, 0xe6, 0xb7, 0xfe, 0x29, 0xa8, 0x9b, 0xa6,
0x07, 0x4b, 0x16, 0x34, 0xef, 0x27, 0x6b, 0xe3, 0xdb, 0x5f, 0x7f, 0xff, 0x2e, 0x53, 0xb7, 0xf4, 0x2b, 0x1f, 0x91, 0xc8, 0x86, 0x62, 0xfc, 0x2c, 0x44, 0x6b, 0x8b, 0x7e, 0x58, 0x7a, 0x28, 0x36,
0xce, 0xc7, 0xe7, 0x1d, 0xc1, 0xe8, 0xd0, 0x19, 0x7f, 0xa9, 0x6d, 0xa1, 0x13, 0x28, 0xa8, 0x67, 0xef, 0x2d, 0x59, 0xd0, 0xbc, 0x9f, 0xac, 0xb5, 0x1f, 0xff, 0xf8, 0xeb, 0xa7, 0x4c, 0xdd, 0xd2,
0x07, 0x5a, 0x5f, 0x92, 0x4c, 0xde, 0x21, 0x77, 0x29, 0xae, 0x4b, 0x45, 0xd3, 0xaa, 0x24, 0x8a, 0x3b, 0xef, 0x9f, 0x76, 0x04, 0xa3, 0x43, 0x67, 0xfc, 0xb9, 0xb6, 0x81, 0x8e, 0xa0, 0xa0, 0x5e,
0x5e, 0x20, 0x04, 0xff, 0x0d, 0xc5, 0xf8, 0xbe, 0x4c, 0x05, 0xb9, 0x7c, 0x83, 0x36, 0x57, 0xf9, 0x27, 0x68, 0x75, 0x49, 0x32, 0x79, 0xae, 0xdc, 0xa6, 0xb8, 0x2a, 0x15, 0x4d, 0xab, 0x92, 0x28,
0xe4, 0xbf, 0x34, 0xf4, 0x1e, 0xca, 0x89, 0xc5, 0xa2, 0xcd, 0x45, 0x38, 0x37, 0xac, 0xb8, 0xd9, 0x7a, 0x81, 0x10, 0xfc, 0x1a, 0x8a, 0xf1, 0x7d, 0x99, 0x0a, 0x72, 0xf9, 0x06, 0x6d, 0xde, 0xe4,
0x5c, 0x35, 0xb4, 0x1c, 0x16, 0x32, 0x92, 0xb0, 0xa4, 0xfd, 0xa2, 0x53, 0x55, 0x66, 0x61, 0xbf, 0x93, 0x5f, 0x69, 0xe8, 0x2d, 0x94, 0x13, 0x8b, 0x45, 0xeb, 0x8b, 0x70, 0xae, 0x58, 0x71, 0xb3,
0xa8, 0xb1, 0xb4, 0x7c, 0xca, 0x91, 0x57, 0x06, 0x66, 0x35, 0xa5, 0xe4, 0x7d, 0x84, 0x96, 0x24, 0x79, 0xd3, 0xd0, 0x72, 0x58, 0xc8, 0x48, 0xc2, 0x92, 0xf6, 0x8b, 0x8e, 0x55, 0x99, 0x85, 0xfd,
0x3b, 0x9f, 0x3c, 0xf7, 0x33, 0x7a, 0x07, 0x7a, 0x5c, 0x00, 0xe9, 0xd4, 0x68, 0x91, 0xac, 0xb4, 0xa2, 0xc6, 0xd2, 0xf2, 0x29, 0x47, 0xbe, 0x31, 0x30, 0xab, 0x29, 0x25, 0xef, 0x22, 0xb4, 0x24,
0x93, 0x37, 0xd7, 0x6f, 0xc2, 0x71, 0xb4, 0xb7, 0xa5, 0xe9, 0x8c, 0x77, 0xb8, 0x94, 0x72, 0x12, 0xd9, 0xf9, 0xe0, 0xb9, 0x1f, 0xd1, 0x1b, 0xd0, 0xe3, 0x02, 0x48, 0xa7, 0x46, 0x8b, 0x64, 0xa5,
0x69, 0xe9, 0x6f, 0x29, 0xe9, 0xb4, 0x29, 0xa7, 0xa4, 0x97, 0x6c, 0xd0, 0x6a, 0x49, 0xe9, 0x26, 0x9d, 0xbc, 0xb9, 0x7a, 0x15, 0x8e, 0xa3, 0xbd, 0x2e, 0x4d, 0x67, 0xbc, 0xc3, 0xa5, 0x94, 0x93,
0x6a, 0x2c, 0x49, 0x7f, 0x10, 0x9c, 0xce, 0x27, 0xec, 0xf3, 0xcf, 0xe8, 0x3d, 0x18, 0x6f, 0x08, 0x48, 0x4b, 0x7f, 0x4b, 0x49, 0xa7, 0x4d, 0x39, 0x25, 0xbd, 0x64, 0x83, 0x56, 0x4b, 0x4a, 0x37,
0x57, 0xc5, 0xfe, 0xaa, 0xe8, 0x37, 0xe5, 0x12, 0x6b, 0xa8, 0x9e, 0x6a, 0x81, 0x38, 0xf8, 0xff, 0x51, 0x63, 0x49, 0xfa, 0x9d, 0xe0, 0x74, 0x3e, 0x60, 0x9f, 0x7f, 0x44, 0x6f, 0xc1, 0x78, 0x45,
0xa7, 0xb4, 0xbf, 0x2a, 0xfc, 0x47, 0x52, 0x7b, 0x13, 0x6d, 0xa4, 0xb5, 0xd3, 0xd1, 0xbf, 0x83, 0xb8, 0x2a, 0xf6, 0x67, 0x45, 0xbf, 0x2e, 0x97, 0x58, 0x41, 0xf5, 0x54, 0x0b, 0xc4, 0xc1, 0x7f,
0xaa, 0x58, 0x61, 0xee, 0x7b, 0x2c, 0xd5, 0xbf, 0x4b, 0xe6, 0xda, 0xdc, 0xb8, 0x85, 0x2f, 0x9f, 0x9f, 0xd2, 0xfe, 0xac, 0xf0, 0x1f, 0x48, 0xed, 0x75, 0xb4, 0x96, 0xd6, 0x4e, 0x47, 0xff, 0x06,
0x09, 0x54, 0x93, 0x4b, 0x30, 0xcc, 0x3b, 0xca, 0x50, 0xcf, 0x0a, 0xf2, 0xff, 0xd5, 0x8b, 0x3f, 0xaa, 0x62, 0x85, 0xb9, 0xef, 0xb1, 0x54, 0xff, 0x2e, 0x99, 0x6b, 0x73, 0xed, 0x1a, 0xbe, 0x7c,
0x03, 0x00, 0x00, 0xff, 0xff, 0x8e, 0x9f, 0xce, 0xa4, 0x96, 0x0d, 0x00, 0x00, 0x26, 0x50, 0x4d, 0x2e, 0xc1, 0x30, 0xef, 0x28, 0x43, 0x3d, 0x29, 0xc8, 0xbf, 0x61, 0xcf, 0xfe,
0x0d, 0x00, 0x00, 0xff, 0xff, 0xba, 0x8f, 0xd4, 0xd8, 0xbd, 0x0d, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -272,6 +272,9 @@ message SwapResponse {
Used for both loop-in and loop-out. Used for both loop-in and loop-out.
*/ */
string htlc_address_p2wsh = 5; string htlc_address_p2wsh = 5;
// A human-readable message received from the loop server.
string server_message = 6;
} }
message MonitorRequest { message MonitorRequest {

@ -524,6 +524,10 @@
"htlc_address_p2wsh": { "htlc_address_p2wsh": {
"type": "string", "type": "string",
"description": "*\nThe native segwit address of the on-chain htlc.\nUsed for both loop-in and loop-out." "description": "*\nThe native segwit address of the on-chain htlc.\nUsed for both loop-in and loop-out."
},
"server_message": {
"type": "string",
"description": "A human-readable message received from the loop server."
} }
} }
}, },

@ -145,10 +145,12 @@ func (m *ServerLoopOutRequest) GetProtocolVersion() ProtocolVersion {
} }
type ServerLoopOutResponse struct { type ServerLoopOutResponse struct {
SwapInvoice string `protobuf:"bytes,1,opt,name=swap_invoice,json=swapInvoice,proto3" json:"swap_invoice,omitempty"` SwapInvoice string `protobuf:"bytes,1,opt,name=swap_invoice,json=swapInvoice,proto3" json:"swap_invoice,omitempty"`
PrepayInvoice string `protobuf:"bytes,2,opt,name=prepay_invoice,json=prepayInvoice,proto3" json:"prepay_invoice,omitempty"` PrepayInvoice string `protobuf:"bytes,2,opt,name=prepay_invoice,json=prepayInvoice,proto3" json:"prepay_invoice,omitempty"`
SenderKey []byte `protobuf:"bytes,3,opt,name=sender_key,json=senderKey,proto3" json:"sender_key,omitempty"` SenderKey []byte `protobuf:"bytes,3,opt,name=sender_key,json=senderKey,proto3" json:"sender_key,omitempty"`
Expiry int32 `protobuf:"varint,4,opt,name=expiry,proto3" json:"expiry,omitempty"` Expiry int32 `protobuf:"varint,4,opt,name=expiry,proto3" json:"expiry,omitempty"`
// A human-readable message from the loop server.
ServerMessage string `protobuf:"bytes,5,opt,name=server_message,json=serverMessage,proto3" json:"server_message,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -207,6 +209,13 @@ func (m *ServerLoopOutResponse) GetExpiry() int32 {
return 0 return 0
} }
func (m *ServerLoopOutResponse) GetServerMessage() string {
if m != nil {
return m.ServerMessage
}
return ""
}
type ServerLoopOutQuoteRequest struct { type ServerLoopOutQuoteRequest struct {
/// The swap amount. If zero, a quote for a maximum amt swap will be given. /// The swap amount. If zero, a quote for a maximum amt swap will be given.
Amt uint64 `protobuf:"varint,1,opt,name=amt,proto3" json:"amt,omitempty"` Amt uint64 `protobuf:"varint,1,opt,name=amt,proto3" json:"amt,omitempty"`
@ -525,8 +534,10 @@ func (m *ServerLoopInRequest) GetProtocolVersion() ProtocolVersion {
} }
type ServerLoopInResponse struct { type ServerLoopInResponse struct {
ReceiverKey []byte `protobuf:"bytes,1,opt,name=receiver_key,json=receiverKey,proto3" json:"receiver_key,omitempty"` ReceiverKey []byte `protobuf:"bytes,1,opt,name=receiver_key,json=receiverKey,proto3" json:"receiver_key,omitempty"`
Expiry int32 `protobuf:"varint,2,opt,name=expiry,proto3" json:"expiry,omitempty"` Expiry int32 `protobuf:"varint,2,opt,name=expiry,proto3" json:"expiry,omitempty"`
// A human-readable message from the loop server.
ServerMessage string `protobuf:"bytes,3,opt,name=server_message,json=serverMessage,proto3" json:"server_message,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -571,6 +582,13 @@ func (m *ServerLoopInResponse) GetExpiry() int32 {
return 0 return 0
} }
func (m *ServerLoopInResponse) GetServerMessage() string {
if m != nil {
return m.ServerMessage
}
return ""
}
type ServerLoopInQuoteRequest struct { type ServerLoopInQuoteRequest struct {
/// The swap amount. If zero, a quote for a maximum amt swap will be given. /// The swap amount. If zero, a quote for a maximum amt swap will be given.
Amt uint64 `protobuf:"varint,1,opt,name=amt,proto3" json:"amt,omitempty"` Amt uint64 `protobuf:"varint,1,opt,name=amt,proto3" json:"amt,omitempty"`
@ -887,63 +905,64 @@ func init() {
func init() { proto.RegisterFile("server.proto", fileDescriptor_ad098daeda4239f7) } func init() { proto.RegisterFile("server.proto", fileDescriptor_ad098daeda4239f7) }
var fileDescriptor_ad098daeda4239f7 = []byte{ var fileDescriptor_ad098daeda4239f7 = []byte{
// 884 bytes of a gzipped FileDescriptorProto // 906 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x41, 0x73, 0xda, 0x46, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xdd, 0x72, 0xda, 0x56,
0x14, 0xae, 0x04, 0xc6, 0xe6, 0x19, 0xdb, 0x64, 0xd3, 0xa4, 0x82, 0xc4, 0x1d, 0x4c, 0xa7, 0x1e, 0x10, 0xae, 0x04, 0xc6, 0x66, 0x0d, 0x36, 0x39, 0x69, 0x52, 0x41, 0xe2, 0x0e, 0xa6, 0x53, 0x8f,
0xd7, 0x07, 0x67, 0x26, 0xbd, 0xf5, 0x46, 0x63, 0x62, 0x33, 0x25, 0x86, 0x08, 0x9c, 0x4e, 0x4f, 0xeb, 0x0b, 0x67, 0x26, 0xbd, 0xeb, 0x1d, 0x8d, 0x89, 0xcd, 0x14, 0x1b, 0x2a, 0xe3, 0x74, 0x7a,
0xea, 0x06, 0x5e, 0x8d, 0xa6, 0x42, 0xbb, 0x91, 0x16, 0x6c, 0xce, 0xfd, 0x13, 0xed, 0x9f, 0xe8, 0xa5, 0x9e, 0xc0, 0xd6, 0x68, 0x2a, 0xe9, 0x28, 0xd2, 0x01, 0x9b, 0xeb, 0x3e, 0x45, 0x5f, 0xa2,
0xbf, 0xe9, 0xb9, 0xb7, 0xce, 0xf4, 0x5f, 0x64, 0xb4, 0xbb, 0x32, 0x48, 0x08, 0xdb, 0xcc, 0xf8, 0xaf, 0xd0, 0xa7, 0xe8, 0x75, 0xef, 0x3a, 0xd3, 0xb7, 0xe8, 0x9c, 0x1f, 0x19, 0x04, 0xc2, 0x36,
0xc6, 0xbe, 0xf7, 0xe9, 0xed, 0xfb, 0xbe, 0xb7, 0xdf, 0x03, 0x4a, 0x21, 0x06, 0x53, 0x0c, 0x4e, 0x33, 0xbe, 0x43, 0xbb, 0x9f, 0x76, 0xf7, 0xfb, 0x56, 0xdf, 0x02, 0xa5, 0x18, 0xa3, 0x09, 0x46,
0x78, 0xc0, 0x04, 0x23, 0x9b, 0x1e, 0x63, 0x3c, 0xe0, 0x83, 0xea, 0xcb, 0x2b, 0xc6, 0xae, 0x3c, 0xc7, 0x61, 0xc4, 0x38, 0x23, 0x9b, 0x1e, 0x63, 0x61, 0x14, 0x0e, 0x6a, 0xaf, 0xaf, 0x19, 0xbb,
0x7c, 0x45, 0xb9, 0xfb, 0x8a, 0xfa, 0x3e, 0x13, 0x54, 0xb8, 0xcc, 0x0f, 0x15, 0xac, 0xfe, 0xbf, 0xf6, 0xf0, 0x0d, 0x0d, 0xdd, 0x37, 0x34, 0x08, 0x18, 0xa7, 0xdc, 0x65, 0x41, 0xac, 0x60, 0x8d,
0x01, 0x5f, 0xf6, 0xe4, 0x77, 0x6d, 0xc6, 0x78, 0x67, 0x22, 0x6c, 0xfc, 0x34, 0xc1, 0x50, 0x90, 0xff, 0x0c, 0xf8, 0xfc, 0x52, 0xbe, 0xd7, 0x61, 0x2c, 0xec, 0x8e, 0xb9, 0x8d, 0x9f, 0xc6, 0x18,
0x03, 0x28, 0x05, 0x38, 0x40, 0x77, 0x8a, 0x81, 0xf3, 0x3b, 0xce, 0x2c, 0xa3, 0x66, 0x1c, 0x95, 0x73, 0xb2, 0x0f, 0xa5, 0x08, 0x07, 0xe8, 0x4e, 0x30, 0x72, 0x7e, 0xc3, 0xa9, 0x65, 0xd4, 0x8d,
0xec, 0xed, 0x38, 0xf6, 0x13, 0xce, 0xc8, 0x0b, 0x28, 0x86, 0xd7, 0x94, 0x3b, 0x23, 0x1a, 0x8e, 0xc3, 0x92, 0xbd, 0x9d, 0xc4, 0x7e, 0xc0, 0x29, 0x79, 0x05, 0xc5, 0xf8, 0x86, 0x86, 0xce, 0x88,
0x2c, 0x53, 0xe6, 0xb7, 0xa2, 0xc0, 0x39, 0x0d, 0x47, 0xa4, 0x0c, 0x39, 0x3a, 0x16, 0x56, 0xae, 0xc6, 0x23, 0xcb, 0x94, 0xf9, 0x2d, 0x11, 0x38, 0xa3, 0xf1, 0x88, 0x54, 0x20, 0x47, 0x7d, 0x6e,
0x66, 0x1c, 0xe5, 0xed, 0xe8, 0x27, 0xf9, 0x01, 0x2a, 0x12, 0xce, 0x27, 0x1f, 0x3d, 0x77, 0x20, 0xe5, 0xea, 0xc6, 0x61, 0xde, 0x16, 0x3f, 0xc9, 0x77, 0x50, 0x95, 0xf0, 0x70, 0xfc, 0xd1, 0x73,
0xbb, 0x70, 0x86, 0x48, 0x87, 0x9e, 0xeb, 0xa3, 0x95, 0xaf, 0x19, 0x47, 0x39, 0xfb, 0xab, 0x08, 0x07, 0x72, 0x0a, 0x67, 0x88, 0x74, 0xe8, 0xb9, 0x01, 0x5a, 0xf9, 0xba, 0x71, 0x98, 0xb3, 0xbf,
0xd0, 0x9d, 0xe7, 0x4f, 0x75, 0x9a, 0xbc, 0x81, 0xb2, 0xec, 0x77, 0xc0, 0x3c, 0x67, 0x8a, 0x41, 0x10, 0x80, 0xde, 0x2c, 0x7f, 0xa2, 0xd3, 0xe4, 0x1d, 0x54, 0xe4, 0xbc, 0x03, 0xe6, 0x39, 0x13,
0xe8, 0x32, 0xdf, 0xda, 0xa8, 0x19, 0x47, 0xbb, 0xaf, 0xad, 0x13, 0x4d, 0xf4, 0xa4, 0xab, 0x01, 0x8c, 0x62, 0x97, 0x05, 0xd6, 0x46, 0xdd, 0x38, 0xdc, 0x79, 0x6b, 0x1d, 0x6b, 0xa2, 0xc7, 0x3d,
0x1f, 0x54, 0xde, 0xde, 0xe3, 0xc9, 0x40, 0xfd, 0x4f, 0x03, 0x9e, 0xa5, 0xb8, 0x86, 0x9c, 0xf9, 0x0d, 0xf8, 0xa0, 0xf2, 0xf6, 0x6e, 0x98, 0x0e, 0x34, 0xfe, 0x32, 0xe0, 0xc5, 0x02, 0xd7, 0x38,
0x21, 0x46, 0x64, 0x65, 0x6b, 0xae, 0x3f, 0x65, 0xee, 0x00, 0x25, 0xd9, 0xa2, 0xbd, 0x1d, 0xc5, 0x64, 0x41, 0x8c, 0x82, 0xac, 0x1c, 0xcd, 0x0d, 0x26, 0xcc, 0x1d, 0xa0, 0x24, 0x5b, 0xb4, 0xb7,
0x5a, 0x2a, 0x44, 0xbe, 0x85, 0x5d, 0x1e, 0x20, 0xa7, 0xb3, 0x5b, 0x90, 0x29, 0x41, 0x3b, 0x2a, 0x45, 0xac, 0xad, 0x42, 0xe4, 0x6b, 0xd8, 0x09, 0x23, 0x0c, 0xe9, 0xf4, 0x0e, 0x64, 0x4a, 0x50,
0x1a, 0xc3, 0xf6, 0x01, 0x42, 0xf4, 0x87, 0x5a, 0xb4, 0x9c, 0x14, 0xa5, 0xa8, 0x22, 0x91, 0x64, 0x59, 0x45, 0x13, 0xd8, 0x1e, 0x40, 0x8c, 0xc1, 0x50, 0x8b, 0x96, 0x93, 0xa2, 0x14, 0x55, 0x44,
0xcf, 0xa1, 0x80, 0x37, 0xdc, 0x0d, 0x66, 0x92, 0xf0, 0x86, 0xad, 0x4f, 0xf5, 0xbf, 0x0d, 0xa8, 0x48, 0xf6, 0x12, 0x0a, 0x78, 0x1b, 0xba, 0xd1, 0x54, 0x12, 0xde, 0xb0, 0xf5, 0x93, 0xa8, 0xae,
0x24, 0x5a, 0x7b, 0x3f, 0x61, 0x02, 0xe3, 0x59, 0x68, 0x2d, 0x8d, 0x07, 0x6a, 0x69, 0xae, 0xaf, 0xb6, 0xe7, 0xf8, 0x18, 0xc7, 0xf4, 0x1a, 0x25, 0xbb, 0xa2, 0x5d, 0x56, 0xd1, 0x73, 0x15, 0x6c,
0x65, 0x6e, 0x5d, 0x2d, 0xff, 0x32, 0x81, 0x2c, 0x37, 0x4c, 0x8e, 0xe1, 0x89, 0xea, 0x8b, 0xce, 0xfc, 0x69, 0x40, 0x35, 0xc5, 0xe0, 0xc7, 0x31, 0xe3, 0x98, 0xac, 0x4c, 0x4b, 0x6e, 0x3c, 0x52,
0xc6, 0xe8, 0x0b, 0x67, 0x88, 0xa1, 0xd0, 0x6a, 0xee, 0xc9, 0x7e, 0x54, 0xfc, 0x34, 0x62, 0x55, 0x72, 0x73, 0x7d, 0xc9, 0x73, 0xeb, 0x4a, 0xfe, 0x87, 0x09, 0x64, 0x79, 0x60, 0x72, 0x04, 0xcf,
0x01, 0xf9, 0x5a, 0x9c, 0xdf, 0x30, 0x6e, 0x79, 0x33, 0x3a, 0xbf, 0x45, 0x24, 0x87, 0xb0, 0x13, 0xd4, 0x5c, 0x74, 0xea, 0x63, 0xc0, 0x9d, 0x21, 0xc6, 0x5c, 0x8b, 0xbe, 0x2b, 0xe7, 0x51, 0xf1,
0xa7, 0x9c, 0x80, 0x0a, 0x94, 0xfd, 0xe5, 0x7e, 0x34, 0x2d, 0x43, 0x0d, 0xe5, 0x2d, 0xa2, 0x4d, 0x13, 0xc1, 0xaa, 0x0a, 0xf2, 0xa3, 0x72, 0x7e, 0xc5, 0x64, 0xe4, 0x4d, 0xf1, 0xfc, 0x1e, 0x91,
0x85, 0x54, 0x5b, 0x0f, 0x25, 0xd2, 0x27, 0x2f, 0xf5, 0x29, 0xaa, 0x48, 0x63, 0x2c, 0xc8, 0x31, 0x1c, 0x40, 0x39, 0x49, 0x39, 0x11, 0xe5, 0x28, 0xe7, 0xcb, 0x7d, 0x6f, 0x5a, 0x86, 0xda, 0xdd,
0xec, 0x8d, 0x5d, 0xdf, 0x91, 0xa5, 0xe8, 0x98, 0x4d, 0x7c, 0x21, 0x1f, 0x4d, 0x5e, 0x16, 0xda, 0x7b, 0x44, 0x9b, 0x72, 0xb9, 0x14, 0xbd, 0x3b, 0xa1, 0x4f, 0x5e, 0xea, 0x53, 0x54, 0x91, 0xa6,
0x19, 0xbb, 0x7e, 0xef, 0x9a, 0xf2, 0x86, 0x4c, 0x48, 0x2c, 0xbd, 0x49, 0x60, 0x0b, 0x0b, 0x58, 0xcf, 0xc9, 0x11, 0xec, 0xfa, 0x6e, 0xe0, 0xc8, 0x52, 0xd4, 0x67, 0xe3, 0x80, 0x4b, 0xf5, 0xf3,
0x7a, 0xb3, 0x80, 0xdd, 0x07, 0x18, 0x78, 0x62, 0xea, 0x0c, 0xd1, 0x13, 0xd4, 0xda, 0x94, 0x93, 0xb2, 0x50, 0xd9, 0x77, 0x83, 0xcb, 0x1b, 0x1a, 0x36, 0x65, 0x42, 0x62, 0xe9, 0x6d, 0x0a, 0x5b,
0x2c, 0x46, 0x91, 0xd3, 0x28, 0x50, 0xff, 0x35, 0x35, 0xcb, 0x3e, 0x06, 0xe3, 0x30, 0x9e, 0x65, 0x98, 0xc3, 0xd2, 0xdb, 0x39, 0xec, 0x1e, 0xc0, 0xc0, 0xe3, 0x13, 0x67, 0x88, 0x1e, 0xa7, 0xd6,
0x96, 0xfa, 0xc6, 0xba, 0xea, 0x0f, 0x53, 0xe2, 0xcb, 0x1b, 0xc8, 0xe1, 0x32, 0x5d, 0xf5, 0x64, 0xa6, 0x5c, 0x78, 0x51, 0x44, 0x4e, 0x44, 0xa0, 0xf1, 0xcb, 0xc2, 0x2e, 0xfb, 0x18, 0xf9, 0x71,
0x52, 0x54, 0x0f, 0x97, 0xa9, 0x9a, 0x1a, 0xb7, 0x48, 0xb3, 0xfe, 0x9f, 0x01, 0x4f, 0xe7, 0xd7, 0xb2, 0xcb, 0x2c, 0xf5, 0x8d, 0x75, 0xd5, 0x1f, 0x2e, 0x88, 0x2f, 0x3b, 0x90, 0x83, 0x65, 0xba,
0xb4, 0xfc, 0x98, 0x42, 0xf2, 0x8d, 0x1b, 0xe9, 0x37, 0xbe, 0xe6, 0x5a, 0x48, 0x7b, 0x2f, 0xbf, 0xea, 0x93, 0x59, 0xa0, 0x7a, 0xb0, 0x4c, 0xd5, 0xd4, 0xb8, 0x79, 0x9a, 0x8d, 0x7f, 0x0d, 0x78,
0xec, 0xbd, 0x0a, 0x6c, 0x79, 0x34, 0x14, 0xce, 0x88, 0x71, 0x39, 0xc0, 0x92, 0xbd, 0x19, 0x9d, 0x3e, 0x6b, 0xd3, 0x0e, 0x12, 0x0a, 0x69, 0x2b, 0x18, 0x8b, 0x56, 0x58, 0xf3, 0x7a, 0x2c, 0x5a,
0xcf, 0x19, 0xcf, 0x94, 0xb3, 0xb0, 0xae, 0x9c, 0xef, 0x17, 0x77, 0x60, 0xc4, 0x73, 0xbe, 0x16, 0x34, 0xbf, 0x6c, 0xd1, 0x2a, 0x6c, 0x79, 0x34, 0xe6, 0xce, 0x88, 0x85, 0x72, 0x81, 0x25, 0x7b,
0xee, 0xdb, 0x81, 0x73, 0x43, 0x9b, 0x09, 0x43, 0x7f, 0x02, 0x6b, 0xb1, 0xe4, 0x3d, 0x76, 0xce, 0x53, 0x3c, 0x9f, 0xb1, 0x30, 0x53, 0xce, 0xc2, 0xba, 0x72, 0xde, 0xce, 0x9f, 0x4a, 0xc1, 0x73,
0x62, 0x61, 0xae, 0xcb, 0xe2, 0x9f, 0xc4, 0x0e, 0xb9, 0xbd, 0x53, 0x73, 0x59, 0x74, 0x9b, 0x71, 0x76, 0x3d, 0x1e, 0x3a, 0x95, 0x33, 0xdf, 0x9b, 0x0f, 0xf8, 0x3e, 0x97, 0xe5, 0xfb, 0x4f, 0x60,
0x8f, 0xdb, 0xcc, 0x6c, 0xb7, 0x65, 0xd8, 0x29, 0xbf, 0x86, 0x9d, 0x36, 0x1e, 0x66, 0xa7, 0x42, 0xcd, 0x77, 0x7e, 0xc0, 0xf5, 0x59, 0x64, 0xcd, 0x75, 0xc9, 0xfe, 0x9d, 0x3a, 0x35, 0x77, 0x3d,
0xda, 0x4e, 0x4e, 0x52, 0xca, 0xc7, 0x77, 0xd3, 0x00, 0x9e, 0x2c, 0x5d, 0xf0, 0xe8, 0x66, 0xfa, 0x35, 0xe5, 0x79, 0x53, 0x1a, 0x0f, 0x98, 0xd2, 0xcc, 0x36, 0x65, 0x86, 0xeb, 0xf2, 0x6b, 0xb8,
0xc3, 0x80, 0x5a, 0xc2, 0xb3, 0xdd, 0x49, 0x38, 0xea, 0x06, 0xe8, 0x8e, 0xe9, 0x15, 0x3e, 0x26, 0x6e, 0xe3, 0x71, 0xae, 0x2b, 0x2c, 0xba, 0xce, 0x49, 0x4b, 0xf9, 0xf4, 0xa6, 0x1b, 0xc0, 0xb3,
0x1d, 0x52, 0x85, 0x2d, 0xae, 0xeb, 0xc6, 0xf6, 0x8b, 0xcf, 0xf5, 0x6f, 0xe0, 0xe0, 0x8e, 0x26, 0xa5, 0x06, 0x4f, 0xee, 0xb9, 0xdf, 0x0d, 0xa8, 0xa7, 0xac, 0xdd, 0x1b, 0xc7, 0xa3, 0x5e, 0x84,
0xd4, 0x53, 0x39, 0x1e, 0xc1, 0x5e, 0xea, 0x12, 0x02, 0x50, 0x68, 0x37, 0xcf, 0x1a, 0x6f, 0x7e, 0xae, 0x4f, 0xaf, 0xf1, 0x29, 0xe9, 0x90, 0x1a, 0x6c, 0x85, 0xba, 0x6e, 0xe2, 0xd2, 0xe4, 0xb9,
0x29, 0x7f, 0x41, 0x08, 0xec, 0xbe, 0xbb, 0x6c, 0xf7, 0x5b, 0x4e, 0xbb, 0xd3, 0xe9, 0x3a, 0x9d, 0xf1, 0x15, 0xec, 0xdf, 0x33, 0x84, 0xfa, 0x54, 0x8e, 0x46, 0xb0, 0xbb, 0xd0, 0x84, 0x00, 0x14,
0xcb, 0x7e, 0xd9, 0x20, 0x15, 0x78, 0x76, 0xd1, 0xe8, 0xb7, 0x3e, 0x34, 0x9d, 0x5e, 0xf3, 0xec, 0x3a, 0xad, 0xd3, 0xe6, 0xbb, 0x9f, 0x2b, 0x9f, 0x11, 0x02, 0x3b, 0xe7, 0x57, 0x9d, 0x7e, 0xdb,
0xe7, 0x56, 0x5f, 0xe5, 0x5a, 0x17, 0x65, 0x93, 0x54, 0xe1, 0x79, 0xd7, 0x6e, 0xb6, 0xde, 0x35, 0xe9, 0x74, 0xbb, 0x3d, 0xa7, 0x7b, 0xd5, 0xaf, 0x18, 0xa4, 0x0a, 0x2f, 0x2e, 0x9a, 0xfd, 0xf6,
0xce, 0x9a, 0x4e, 0xf7, 0xb2, 0x77, 0x3e, 0xff, 0x2c, 0xf7, 0xfa, 0xdf, 0x3c, 0x40, 0xa4, 0x91, 0x87, 0x96, 0x73, 0xd9, 0x3a, 0xfd, 0xa9, 0xdd, 0x57, 0xb9, 0xf6, 0x45, 0xc5, 0x24, 0x35, 0x78,
0xea, 0x89, 0x74, 0xa0, 0x94, 0x58, 0x68, 0xf5, 0x5b, 0xd2, 0x2b, 0xf7, 0x69, 0xf5, 0xc5, 0x1d, 0xd9, 0xb3, 0x5b, 0xed, 0xf3, 0xe6, 0x69, 0xcb, 0xe9, 0x5d, 0x5d, 0x9e, 0xcd, 0x5e, 0xcb, 0xbd,
0x18, 0xd2, 0x81, 0xdd, 0x0b, 0xbc, 0xd6, 0xa1, 0xe8, 0x22, 0xb2, 0x9f, 0x0d, 0x8f, 0xab, 0x7d, 0xfd, 0x27, 0x0f, 0x20, 0x34, 0x52, 0x33, 0x91, 0x2e, 0x94, 0x52, 0x77, 0xaf, 0x71, 0x47, 0x7a,
0xbd, 0x2a, 0xad, 0x5d, 0xe4, 0xc1, 0xd3, 0x0c, 0xe5, 0xc8, 0x77, 0xd9, 0x9f, 0x65, 0x8c, 0xb8, 0xe5, 0xd9, 0xad, 0xbd, 0xba, 0x07, 0x43, 0xba, 0xb0, 0x73, 0x81, 0x37, 0x3a, 0x24, 0x1a, 0x91,
0x7a, 0xfc, 0x10, 0xa8, 0xbe, 0x6d, 0xae, 0x87, 0xfa, 0x77, 0x5d, 0xa1, 0xc7, 0xe2, 0x72, 0x59, 0xbd, 0x6c, 0x78, 0x52, 0xed, 0xcb, 0x55, 0x69, 0xed, 0x22, 0x0f, 0x9e, 0x67, 0x28, 0x47, 0xbe,
0xa5, 0x87, 0x2a, 0xd0, 0x86, 0xed, 0xc5, 0x37, 0x7e, 0x90, 0x81, 0x4d, 0x1a, 0xac, 0x5a, 0x5d, 0xc9, 0x7e, 0x2d, 0x63, 0xc5, 0xb5, 0xa3, 0xc7, 0x40, 0x75, 0xb7, 0x99, 0x1e, 0xea, 0x4f, 0x78,
0x0d, 0x21, 0x6d, 0xd8, 0xd1, 0xea, 0xb6, 0xa4, 0x23, 0xc8, 0xcb, 0x4c, 0x70, 0x5c, 0x6a, 0x7f, 0x85, 0x1e, 0xf3, 0xc7, 0x65, 0x95, 0x1e, 0xaa, 0x40, 0x07, 0xb6, 0xe7, 0xbf, 0xf1, 0xfd, 0x0c,
0x45, 0x56, 0x93, 0xed, 0xc7, 0xbd, 0xa9, 0x56, 0xb3, 0x7b, 0x4b, 0x50, 0xad, 0xdf, 0x05, 0x51, 0x6c, 0xda, 0x60, 0xb5, 0xda, 0x6a, 0x08, 0xe9, 0x40, 0x59, 0xab, 0xdb, 0x96, 0x8e, 0x20, 0xaf,
0x55, 0x3f, 0x16, 0xa4, 0x3b, 0xbe, 0xff, 0x1c, 0x00, 0x00, 0xff, 0xff, 0x76, 0xc4, 0xb9, 0x29, 0x33, 0xc1, 0x49, 0xa9, 0xbd, 0x15, 0x59, 0x4d, 0xb6, 0x9f, 0xcc, 0xa6, 0x46, 0xcd, 0x9e, 0x2d,
0x1d, 0x0b, 0x00, 0x00, 0x45, 0xb5, 0x71, 0x1f, 0x44, 0x55, 0xfd, 0x58, 0x90, 0xee, 0xf8, 0xf6, 0xff, 0x00, 0x00, 0x00,
0xff, 0xff, 0x52, 0x9a, 0x24, 0x73, 0x6b, 0x0b, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -72,6 +72,9 @@ message ServerLoopOutResponse {
bytes sender_key = 3; bytes sender_key = 3;
int32 expiry = 4; int32 expiry = 4;
// A human-readable message from the loop server.
string server_message = 5;
} }
message ServerLoopOutQuoteRequest { message ServerLoopOutQuoteRequest {
@ -127,6 +130,9 @@ message ServerLoopInRequest {
message ServerLoopInResponse { message ServerLoopInResponse {
bytes receiver_key = 1; bytes receiver_key = 1;
int32 expiry = 2; int32 expiry = 2;
// A human-readable message from the loop server.
string server_message = 3;
} }
message ServerLoopInQuoteRequest { message ServerLoopInQuoteRequest {

@ -215,6 +215,7 @@ func (s *grpcSwapServerClient) NewLoopOutSwap(ctx context.Context,
prepayInvoice: swapResp.PrepayInvoice, prepayInvoice: swapResp.PrepayInvoice,
senderKey: senderKey, senderKey: senderKey,
expiry: swapResp.Expiry, expiry: swapResp.Expiry,
serverMessage: swapResp.ServerMessage,
}, nil }, nil
} }
@ -268,8 +269,9 @@ func (s *grpcSwapServerClient) NewLoopInSwap(ctx context.Context,
} }
return &newLoopInResponse{ return &newLoopInResponse{
receiverKey: receiverKey, receiverKey: receiverKey,
expiry: swapResp.Expiry, expiry: swapResp.Expiry,
serverMessage: swapResp.ServerMessage,
}, nil }, nil
} }
@ -334,9 +336,11 @@ type newLoopOutResponse struct {
prepayInvoice string prepayInvoice string
senderKey [33]byte senderKey [33]byte
expiry int32 expiry int32
serverMessage string
} }
type newLoopInResponse struct { type newLoopInResponse struct {
receiverKey [33]byte receiverKey [33]byte
expiry int32 expiry int32
serverMessage string
} }

Loading…
Cancel
Save