From bc17a3b423fd25bdf2c87e0f64961b34e794dc88 Mon Sep 17 00:00:00 2001 From: Turtle Date: Thu, 8 Apr 2021 18:34:29 -0400 Subject: [PATCH 1/6] Add CustomMacaroonHex as a config option --- lnd_services.go | 54 +++++++++++++++++++++++++++++++++++------------ macaroon_pouch.go | 16 ++++++++++---- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/lnd_services.go b/lnd_services.go index eae7c64..490b344 100644 --- a/lnd_services.go +++ b/lnd_services.go @@ -85,13 +85,20 @@ type LndServicesConfig struct { Network Network // MacaroonDir is the directory where all lnd macaroons can be found. - // Either this or CustomMacaroonPath can be specified but not both. + // Either this, CustomMacaroonPath, or CustomMacaroonHex should be set, + // but only one of them, depending on macaroon preferences. MacaroonDir string // CustomMacaroonPath is the full path to a custom macaroon file. Either - // this or MacaroonDir can be specified but not both. + // this, MacaroonDir, or CustomMacaroonHex should be set, but only one + // of them. CustomMacaroonPath string + // CustomMacaroonHex is a hexadecimal encoded macaroon string. Either + // this, MacaroonDir, or CustomMacaroonPath should be set, but only + // one of them. + CustomMacaroonHex string + // TLSPath is the path to lnd's TLS certificate file. TLSPath string @@ -173,12 +180,24 @@ func NewLndServices(cfg *LndServicesConfig) (*GrpcLndServices, error) { cfg.CheckVersion = minimalCompatibleVersion } - // We don't allow setting both the macaroon directory and the custom - // macaroon path. If both are empty, that's fine, the default behavior - // is to use lnd's default directory to try to locate the macaroons. - if cfg.MacaroonDir != "" && cfg.CustomMacaroonPath != "" { - return nil, fmt.Errorf("must set either MacaroonDir or " + - "CustomMacaroonPath but not both") + // Of the macaroon directory, the custom macaroon path, and the custom + // macaroon hex, we only allow one to be set at once. If all are empty, + // that's fine, the default behavior is to use lnd's default directory + // to try to locate the macaroons. + macaroonOptions := []string{ + cfg.MacaroonDir, + cfg.CustomMacaroonPath, + cfg.CustomMacaroonHex, + } + macOptionCount := 0 + for _, option := range macaroonOptions { + if option != "" { + macOptionCount++ + } + } + if macOptionCount > 1 { + return nil, fmt.Errorf("must set only one: MacaroonDir, " + + "CustomMacaroonPath, or CustomMacaroonHex") } // Based on the network, if the macaroon directory isn't set, then @@ -236,11 +255,16 @@ func NewLndServices(cfg *LndServicesConfig) (*GrpcLndServices, error) { // macaroon. We don't use the pouch yet because if not all subservers // are enabled, then not all macaroons might be there and the user would // get a more cryptic error message. - readonlyMac, err := loadMacaroon( - macaroonDir, readonlyMacFilename, cfg.CustomMacaroonPath, - ) - if err != nil { - return nil, err + var readonlyMac serializedMacaroon + if cfg.CustomMacaroonHex != "" { + readonlyMac = serializedMacaroon(cfg.CustomMacaroonHex) + } else { + readonlyMac, err = loadMacaroon( + macaroonDir, readonlyMacFilename, cfg.CustomMacaroonPath, + ) + if err != nil { + return nil, err + } } timeout := defaultRPCTimeout @@ -279,7 +303,9 @@ func NewLndServices(cfg *LndServicesConfig) (*GrpcLndServices, error) { // Now that we've ensured our macaroon directory is set properly, we // can retrieve our full macaroon pouch from the directory. - macaroons, err := newMacaroonPouch(macaroonDir, cfg.CustomMacaroonPath) + macaroons, err := newMacaroonPouch( + macaroonDir, cfg.CustomMacaroonPath, cfg.CustomMacaroonHex, + ) if err != nil { cleanupConn() return nil, fmt.Errorf("unable to obtain macaroons: %v", err) diff --git a/macaroon_pouch.go b/macaroon_pouch.go index c6a02d3..6f77dd8 100644 --- a/macaroon_pouch.go +++ b/macaroon_pouch.go @@ -72,18 +72,27 @@ type macaroonPouch map[string]serializedMacaroon // newMacaroonPouch returns a new instance of a fully populated macaroonPouch // given the directory where all the macaroons are stored. -func newMacaroonPouch(macaroonDir, customMacPath string) (macaroonPouch, +func newMacaroonPouch(macaroonDir, customMacPath, customMacHex string) (macaroonPouch, error) { // If a custom macaroon is specified, we assume it contains all // permissions needed for the different subservers to function and we // use it for all of them. + var ( + mac serializedMacaroon + err error + ) + if customMacPath != "" { - mac, err := loadMacaroon("", "", customMacPath) + mac, err = loadMacaroon("", "", customMacPath) if err != nil { return nil, err } + } else if customMacHex != "" { + mac = serializedMacaroon(customMacHex) + } + if mac != "" { return macaroonPouch{ invoiceMacFilename: mac, chainMacFilename: mac, @@ -96,8 +105,7 @@ func newMacaroonPouch(macaroonDir, customMacPath string) (macaroonPouch, } var ( - m = make(macaroonPouch) - err error + m = make(macaroonPouch) ) for _, macFileName := range defaultMacaroonFileNames { From 692d8ab9a5d94589db2bd353b224c7715f66abda Mon Sep 17 00:00:00 2001 From: Turtle Date: Fri, 23 Apr 2021 00:17:55 -0400 Subject: [PATCH 2/6] Test that new CustomMacaroonHex option works properly --- lnd_services_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lnd_services_test.go b/lnd_services_test.go index e874adc..6e9cdc0 100644 --- a/lnd_services_test.go +++ b/lnd_services_test.go @@ -326,3 +326,31 @@ func TestGetLndInfo(t *testing.T) { }) } } + +// TestCustomMacaroonHex tests that the macaroon pouch properly takes in a +// macaroon provided in hex string format. +func TestCustomMacaroonHex(t *testing.T) { + dummyMacStr := "0201047465737402067788991234560000062052d26ed139ea5af8" + + "3e675500c4ccb2471f62191b745bab820f129e5588a255d2" + + // Test that MacaroonPouch adds the macaroon hex string properly. + macaroons, err := newMacaroonPouch( + "", "", dummyMacStr, + ) + require.NoError(t, err) + + require.Equal( + t, macaroons[invoiceMacFilename], serializedMacaroon(dummyMacStr), + "macaroon hex string not set correctly", + ) + + // If both CustomMacaroonHex and MacaroonDir are set, creating + // NewLndServices should fail. + testCfg := &LndServicesConfig{ + MacaroonDir: "/testdir", + CustomMacaroonHex: dummyMacStr, + } + + _, err = NewLndServices(testCfg) + require.Error(t, err, "must set only one") +} From 3a5ec2db45b60b648435a9a6ec1291ee7667c335 Mon Sep 17 00:00:00 2001 From: Turtle Date: Mon, 3 May 2021 19:24:24 -0400 Subject: [PATCH 3/6] Allow passing in tls certificate as data --- lnd_services.go | 107 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 10 deletions(-) diff --git a/lnd_services.go b/lnd_services.go index 490b344..ca10a7c 100644 --- a/lnd_services.go +++ b/lnd_services.go @@ -2,9 +2,13 @@ package lndclient import ( "context" + "crypto/tls" + "crypto/x509" + "encoding/pem" "errors" "fmt" "net" + "os" "path/filepath" "strings" "time" @@ -99,9 +103,22 @@ type LndServicesConfig struct { // one of them. CustomMacaroonHex string - // TLSPath is the path to lnd's TLS certificate file. + // TLSPath is the path to lnd's TLS certificate file. Only this or + // TLSData can be set, not both. TLSPath string + // TLSData holds the TLS certificate data. Only this or TLSPath can be + // set, not both. + TLSData string + + // Insecure can be checked if we don't need to use tls, such as if + // we're connecting to lnd via a bufconn, then we'll skip verification. + Insecure bool + + // SystemCert specifies whether we'll fallback to a system cert pool + // for tls. + SystemCert bool + // CheckVersion is the minimum version the connected lnd node needs to // be in order to be compatible. The node will be checked against this // when connecting. If no version is supplied, the default minimum @@ -739,16 +756,11 @@ var ( ) func getClientConn(cfg *LndServicesConfig) (*grpc.ClientConn, error) { - // Load the specified TLS certificate and build transport credentials - // with it. - tlsPath := cfg.TLSPath - if tlsPath == "" { - tlsPath = defaultTLSCertPath - } - - creds, err := credentials.NewClientTLSFromFile(tlsPath, "") + creds, err := GetTLSCredentials( + cfg.TLSData, cfg.TLSPath, cfg.Insecure, cfg.SystemCert, + ) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get tls creds: %v", err) } // Create a dial options array. @@ -769,3 +781,78 @@ func getClientConn(cfg *LndServicesConfig) (*grpc.ClientConn, error) { return conn, nil } + +// GetTLSCredentials gets the tls credentials, whether provided as straight-up +// data or a path to a certificate file. +func GetTLSCredentials(tlsData, tlsPath string, insecure, systemCert bool) ( + credentials.TransportCredentials, error) { + + if tlsPath != "" && tlsData != "" { + return nil, fmt.Errorf("must set only one: TLSPath or TLSData") + } + + var creds credentials.TransportCredentials + var err error + + // We'll determine if the tls certificate is passed in directly as + // data, by a path, or try the system's certificate chain, and then + // load it. + switch { + case insecure: + // If we don't need to use tls, such as if we're connecting to + // lnd via a bufconn, then we'll skip verification. + creds = credentials.NewTLS(&tls.Config{ + InsecureSkipVerify: true, // nolint:gosec + }) + + case systemCert: + // Fallback to the system pool. Using an empty tls config is an + // alternative to x509.SystemCertPool(), which is not supported + // on Windows. + creds = credentials.NewTLS(&tls.Config{}) + + case tlsData != "": + tlsBytes := []byte(tlsData) + + block, _ := pem.Decode(tlsBytes) + if block == nil || block.Type != "CERTIFICATE" { + return nil, errors.New("failed to decode PEM block " + + "containing tls certificate") + } + + cert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, err + } + + pool := x509.NewCertPool() + pool.AddCert(cert) + + // Load the specified TLS certificate and build transport + // credentials. + creds = credentials.NewClientTLSFromCert(pool, "") + + case tlsPath != "": + creds, err = credentials.NewClientTLSFromFile(tlsPath, "") + if err != nil { + return nil, err + } + + default: + // If neither tlsData nor tlsPath were set, we'll try the default + // lnd tls cert path. + if _, err := os.Stat(defaultTLSCertPath); err == nil { + creds, err = credentials.NewClientTLSFromFile( + defaultTLSCertPath, "", + ) + if err != nil { + return nil, err + } + + } else { + return nil, err + } + } + + return creds, err +} From f374c88f658af754ec57d47fe148f462476b8fee Mon Sep 17 00:00:00 2001 From: Turtle Date: Mon, 3 May 2021 19:25:37 -0400 Subject: [PATCH 4/6] Add support for passing in macaroons/tls cert as data to basic client --- basic_client.go | 105 ++++++++++++++++++++++++++----------------- basic_client_test.go | 72 +++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 40 deletions(-) create mode 100644 basic_client_test.go diff --git a/basic_client.go b/basic_client.go index 7ce35d2..0e40253 100644 --- a/basic_client.go +++ b/basic_client.go @@ -1,6 +1,7 @@ package lndclient import ( + "encoding/hex" "fmt" "io/ioutil" "path/filepath" @@ -52,13 +53,14 @@ func (bc *basicClientOptions) applyBasicClientOptions(options ...BasicClientOpti // NewBasicClient creates a new basic gRPC client to lnd. We call this client // "basic" as it falls back to expected defaults if the arguments aren't // provided. -func NewBasicClient(lndHost, tlsPath, macDir, network string, - basicOptions ...BasicClientOption) ( +func NewBasicClient(lndHost, tlsPath, macDir, tlsData, macData, network string, + insecure, systemCert bool, basicOptions ...BasicClientOption) ( lnrpc.LightningClient, error) { conn, err := NewBasicConn( - lndHost, tlsPath, macDir, network, basicOptions..., + lndHost, tlsPath, macDir, tlsData, macData, network, insecure, + systemCert, basicOptions..., ) if err != nil { return nil, err @@ -70,54 +72,28 @@ func NewBasicClient(lndHost, tlsPath, macDir, network string, // NewBasicConn creates a new basic gRPC connection to lnd. We call this // connection "basic" as it falls back to expected defaults if the arguments // aren't provided. -func NewBasicConn(lndHost, tlsPath, macDir, network string, +func NewBasicConn(lndHost string, tlsPath, macDir, tlsData, macData, + network string, insecure, systemCert bool, basicOptions ...BasicClientOption) ( *grpc.ClientConn, error) { - if tlsPath == "" { - tlsPath = defaultTLSCertPath - } - - // Load the specified TLS certificate and build transport credentials - creds, err := credentials.NewClientTLSFromFile(tlsPath, "") + creds, mac, err := parseTLSAndMacaroon( + tlsPath, macDir, tlsData, macData, network, insecure, + systemCert, basicOptions..., + ) if err != nil { return nil, err } + // Now we append the macaroon credentials to the dial options. + cred := macaroons.NewMacaroonCredential(mac) + // Create a dial options array. opts := []grpc.DialOption{ grpc.WithTransportCredentials(creds), - } - - if macDir == "" { - macDir = filepath.Join( - defaultLndDir, defaultDataDir, defaultChainSubDir, - "bitcoin", network, - ) - } - - // Starting with the set of default options, we'll apply any specified - // functional options to the basic client. - bco := defaultBasicClientOptions() - bco.applyBasicClientOptions(basicOptions...) - - macPath := filepath.Join(macDir, bco.macFilename) - - // Load the specified macaroon file. - macBytes, err := ioutil.ReadFile(macPath) - if err == nil { - // Only if file is found - mac := &macaroon.Macaroon{} - if err = mac.UnmarshalBinary(macBytes); err != nil { - return nil, fmt.Errorf("unable to decode macaroon: %v", - err) - } - - // Now we append the macaroon credentials to the dial options. - cred := macaroons.NewMacaroonCredential(mac) - opts = append(opts, grpc.WithPerRPCCredentials(cred)) - opts = append(opts, grpc.WithDefaultCallOptions(maxMsgRecvSize)) + grpc.WithPerRPCCredentials(cred), + grpc.WithDefaultCallOptions(maxMsgRecvSize), } // We need to use a custom dialer so we can also connect to unix sockets @@ -134,3 +110,52 @@ func NewBasicConn(lndHost, tlsPath, macDir, network string, return conn, nil } + +// parseTLSAndMacaroon looks to see if the TLS certificate and macaroon were +// passed in as a path or as straight-up data, and processes it accordingly so +// it can be passed into grpc to establish a connection with LND. +func parseTLSAndMacaroon(tlsPath, macDir, tlsData, macData, network string, + insecure, systemCert bool, basicOptions ...BasicClientOption) ( + credentials.TransportCredentials, *macaroon.Macaroon, error) { + + creds, err := GetTLSCredentials(tlsData, tlsPath, insecure, systemCert) + if err != nil { + return nil, nil, err + } + + // Starting with the set of default options, we'll apply any specified + // functional options to the basic client. + bco := defaultBasicClientOptions() + bco.applyBasicClientOptions(basicOptions...) + + var macBytes []byte + mac := &macaroon.Macaroon{} + if macData != "" { + macBytes, err = hex.DecodeString(macData) + if err != nil { + return nil, nil, err + } + } else { + if macDir == "" { + macDir = filepath.Join( + defaultLndDir, defaultDataDir, defaultChainSubDir, + "bitcoin", network, + ) + } + + macPath := filepath.Join(macDir, bco.macFilename) + + // Load the specified macaroon file. + macBytes, err = ioutil.ReadFile(macPath) + if err != nil { + return nil, nil, err + } + } + + if err = mac.UnmarshalBinary(macBytes); err != nil { + return nil, nil, fmt.Errorf("unable to decode macaroon: %v", + err) + } + + return creds, mac, nil +} diff --git a/basic_client_test.go b/basic_client_test.go new file mode 100644 index 0000000..cf3b78e --- /dev/null +++ b/basic_client_test.go @@ -0,0 +1,72 @@ +package lndclient + +import ( + "encoding/hex" + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +// Tests that NewBasicConn works correctly when macaroon and TLS certificate +// data are passed in directly instead of being supplied as file paths. +func TestParseTLSAndMacaroon(t *testing.T) { + + tlsData := `-----BEGIN CERTIFICATE----- +MIIDhzCCAm+gAwIBAgIUEkmdMOVPL92AwgsSYFFBvz4ilmUwDQYJKoZIhvcNAQEL +BQAwUzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1OMRQwEgYDVQQHDAtNaW5uZWFw +b2xpczEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4XDTIxMDQy +MzA2NDkyNVoXDTIxMDUyMzA2NDkyNVowUzELMAkGA1UEBhMCVVMxCzAJBgNVBAgM +Ak1OMRQwEgYDVQQHDAtNaW5uZWFwb2xpczEhMB8GA1UECgwYSW50ZXJuZXQgV2lk +Z2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnK21 +qJmWWs4Nwz2f2ZbTsDxJAumgDJdZ9JKsJBrqjFf7+25ip+1hIB15P1UHHPhtW5Yp +P9Xm50z8W2RP2pHyCFB09cwKgdqPsS8Q2tzr5DINt+eNYa5JpxnWXM5ZqmYD7Zg0 +wSMVW3FuAWFpjlzNWs/UHSuDShiQLoMhl2xAjiGSsHbY9plV438/kypSKS+7wjxe +0TJaTv/kWlHhQkXvnLqIMhD8J+ScGVSSk0OFgWiRmcCGDsLZgEGklHklC7ZKrr+Q +Am2MGbvUaGuwW+R5d2ZaQRbQ5UVhHcna2MxUn6MzSjbEhpIsMKZoYVXCb0GFObcq +UsLUOrIqpIyngd4G9wIDAQABo1MwUTAdBgNVHQ4EFgQU0lZJ2gp/RM79oAegXr/H +sU+GU3YwHwYDVR0jBBgwFoAU0lZJ2gp/RM79oAegXr/HsU+GU3YwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAly744gq/LPuL0EnEbfxXrVqmvWh6 +t9kNljXybVjQNTZ00e4zGknOA3VM29JWOEYyQ7ut/tP+kquWLdfOq/Lehe7vnBSn +lPR6IYbba9ck5AvPZgGG9fEncKxeUoI0ltI/luycmWL7Eb9j3128diIwljf9JXNT +I/LThs8Nl5RSiMOuGer0e934vLlZlrEEI4rWs3DKK56WjrMeVf5dhvYK44usNwUh +vKgMVFsUeyLLTN0EuZjGoFdi3lfLQo3vRwLD6h/EDa5uWK14pZXDQ30+fT2RjuVD +XhkpT5dliEGFLNe6OOgeWTU1JpEXfCud/GImtNMHQi4EDWQfvWuCNGhOoQ== +-----END CERTIFICATE-----` + + macData := "0201047465737402067788991234560000062052d26ed139ea5af8" + + "3e675500c4ccb2471f62191b745bab820f129e5588a255d2" + + // Make sure it works when data is passed in. + _, _, err := parseTLSAndMacaroon( + "", "", tlsData, macData, "mainnet", false, false, + MacFilename(""), + ) + require.NoError(t, err) + + // Now let's write the data to a file to make sure parseTLSAndMacaroon + // parses that properly as well. + tempDirPath, err := ioutil.TempDir("", ".testCreds") + require.NoError(t, err) + defer os.RemoveAll(tempDirPath) + + certPath := tempDirPath + "/tls.cert" + tlsPEMBytes := []byte(tlsData) + + err = ioutil.WriteFile(certPath, tlsPEMBytes, 0644) + require.NoError(t, err) + + macPath := tempDirPath + "/test.macaroon" + macBytes, err := hex.DecodeString(macData) + require.NoError(t, err) + + err = ioutil.WriteFile(macPath, macBytes, 0644) + require.NoError(t, err) + + _, _, err = parseTLSAndMacaroon( + certPath, macPath, "", "", "mainnet", false, false, + MacFilename(""), + ) + require.NoError(t, err) +} From 577f81980099cd80c6cd0627d9a9b930c1cb9f9f Mon Sep 17 00:00:00 2001 From: Turtle Date: Mon, 10 May 2021 23:48:15 -0400 Subject: [PATCH 5/6] Add CheckMacaroonPermissions command to client --- lightning_client.go | 37 +++++++++++++++++++++++++++++++++++++ macaroon_recipes_test.go | 2 +- testdata/permissions.json | 8 ++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lightning_client.go b/lightning_client.go index e01d110..9fd875d 100644 --- a/lightning_client.go +++ b/lightning_client.go @@ -181,6 +181,12 @@ type LightningClient interface { // vertices. QueryRoutes(ctx context.Context, req QueryRoutesRequest) ( *QueryRoutesResponse, error) + + // CheckMacaroonPermissions allows a client to check the validity of a + // macaroon. + CheckMacaroonPermissions(ctx context.Context, macaroon []byte, + permissions []MacaroonPermission, fullMethod string) (bool, + error) } // Info contains info about the connected lnd node. @@ -3527,3 +3533,34 @@ func (s *lightningClient) QueryRoutes(ctx context.Context, TotalAmtMsat: lnwire.MilliSatoshi(route.TotalAmtMsat), }, nil } + +// CheckMacaroonPermissions allows a client to check the validity of a macaroon. +func (s *lightningClient) CheckMacaroonPermissions(ctx context.Context, + macaroon []byte, permissions []MacaroonPermission, fullMethod string) (bool, + error) { + + rpcPermissions := make([]*lnrpc.MacaroonPermission, len(permissions)) + for idx, perm := range permissions { + rpcPermissions[idx] = &lnrpc.MacaroonPermission{ + Entity: perm.Entity, + Action: perm.Action, + } + } + + ctx = s.adminMac.WithMacaroonAuth(ctx) + rpcCtx, cancel := context.WithTimeout(ctx, s.timeout) + defer cancel() + + res, err := s.client.CheckMacaroonPermissions( + rpcCtx, &lnrpc.CheckMacPermRequest{ + Macaroon: macaroon, + Permissions: rpcPermissions, + FullMethod: fullMethod, + }, + ) + if err != nil { + return false, err + } + + return res.Valid, nil +} diff --git a/macaroon_recipes_test.go b/macaroon_recipes_test.go index 6154aaf..1425e5e 100644 --- a/macaroon_recipes_test.go +++ b/macaroon_recipes_test.go @@ -12,7 +12,7 @@ import ( var ( expectedPermissions = map[string]int{ - "lnrpc": 9, + "lnrpc": 10, "chainrpc": 1, "invoicesrpc": 2, "routerrpc": 2, diff --git a/testdata/permissions.json b/testdata/permissions.json index 4f5bda6..a4a8062 100644 --- a/testdata/permissions.json +++ b/testdata/permissions.json @@ -140,6 +140,14 @@ } ] }, + "/lnrpc.Lightning/CheckMacaroonPermissions": { + "permissions": [ + { + "entity": "macaroon", + "action": "read" + } + ] + }, "/lnrpc.Lightning/CloseChannel": { "permissions": [ { From bd95f286d7b5672eca948b73c4bb9b18a284bbc4 Mon Sep 17 00:00:00 2001 From: Turtle Date: Sun, 12 Sep 2021 23:38:01 -0500 Subject: [PATCH 6/6] Update dependencies with required change to lnd --- go.mod | 6 +++--- go.sum | 51 ++++++++++++++++++++++++++------------------------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 0fa0445..9ad3c50 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module github.com/lightninglabs/lndclient require ( - github.com/btcsuite/btcd v0.21.0-beta.0.20210513141527-ee5896bad5be + github.com/btcsuite/btcd v0.22.0-beta.0.20210803133449-f5a1fb9965e4 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f github.com/btcsuite/btcutil v1.0.3-0.20210527170813-e2ba6805a890 - github.com/btcsuite/btcwallet/wtxmgr v1.3.1-0.20210706234807-aaf03fee735a - github.com/lightningnetwork/lnd v0.13.0-beta.rc5.0.20210802115842-44971f0c46c9 + github.com/btcsuite/btcwallet/wtxmgr v1.3.1-0.20210822222949-9b5a201c344c + github.com/lightningnetwork/lnd v0.13.0-beta.rc5.0.20210920062527-d9f0f07142ea github.com/stretchr/testify v1.7.0 google.golang.org/grpc v1.38.0 gopkg.in/macaroon.v2 v2.1.0 diff --git a/go.sum b/go.sum index 3f68f42..0686418 100644 --- a/go.sum +++ b/go.sum @@ -67,9 +67,8 @@ github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta.0.20201208033208-6bd4c64a54fa/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= -github.com/btcsuite/btcd v0.21.0-beta.0.20210426180113-7eba688b65e5/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btcd v0.21.0-beta.0.20210513141527-ee5896bad5be h1:vDD/JWWS2v4GJUG/RZE/50wT6Saerbujijd7mFqgsKI= -github.com/btcsuite/btcd v0.21.0-beta.0.20210513141527-ee5896bad5be/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd v0.22.0-beta.0.20210803133449-f5a1fb9965e4 h1:EmyLrldY44jDVa3dQ2iscj1S6ExuVJhRzCZBOXo93r0= +github.com/btcsuite/btcd v0.22.0-beta.0.20210803133449-f5a1fb9965e4/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -80,23 +79,24 @@ github.com/btcsuite/btcutil v1.0.3-0.20210527170813-e2ba6805a890/go.mod h1:0DVlH github.com/btcsuite/btcutil/psbt v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:LVveMu4VaNSkIRTZu2+ut0HDBRuYjqGocxDMNS1KuGQ= github.com/btcsuite/btcutil/psbt v1.0.3-0.20210527170813-e2ba6805a890 h1:0xUNvvwJ7RjzBs4nCF+YrK28S5P/b4uHkpPxY1ovGY4= github.com/btcsuite/btcutil/psbt v1.0.3-0.20210527170813-e2ba6805a890/go.mod h1:LVveMu4VaNSkIRTZu2+ut0HDBRuYjqGocxDMNS1KuGQ= -github.com/btcsuite/btcwallet v0.12.1-0.20210519225359-6ab9b615576f h1:Me6OOQP2ZYttZuViKXHVegXPKz2n42zNbHI3ljPeqwU= -github.com/btcsuite/btcwallet v0.12.1-0.20210519225359-6ab9b615576f/go.mod h1:f1HuBGov5+OTp40Gh1vA+tvF6d7bbuLFTceJMRB7fXw= +github.com/btcsuite/btcwallet v0.12.1-0.20210826004415-4ef582f76b02 h1:Q8Scm1SXNRyiXzD3a7O1C6bLFIUxUQSnWAd9aat8Xd0= +github.com/btcsuite/btcwallet v0.12.1-0.20210826004415-4ef582f76b02/go.mod h1:SdqXKJoEEi5LJq6zU67PcKiyqF97AcUOfBfyQHC7rqQ= github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= -github.com/btcsuite/btcwallet/wallet/txauthor v1.0.1-0.20210519225359-6ab9b615576f h1:uzCtWqLJ6dlufUhpmoNgaegF87Pb9kOwPmpFYEi2up4= -github.com/btcsuite/btcwallet/wallet/txauthor v1.0.1-0.20210519225359-6ab9b615576f/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= +github.com/btcsuite/btcwallet/wallet/txauthor v1.0.1-0.20210329233242-e0607006dce6/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= +github.com/btcsuite/btcwallet/wallet/txauthor v1.0.2-0.20210803004036-eebed51155ec h1:nuO8goa4gbgDM4iegCztF7mTq8io9NT1DAMoPrEI6S4= +github.com/btcsuite/btcwallet/wallet/txauthor v1.0.2-0.20210803004036-eebed51155ec/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= github.com/btcsuite/btcwallet/wallet/txrules v1.0.0 h1:2VsfS0sBedcM5KmDzRMT3+b6xobqWveZGvjb+jFez5w= github.com/btcsuite/btcwallet/wallet/txrules v1.0.0/go.mod h1:UwQE78yCerZ313EXZwEiu3jNAtfXj2n2+c8RWiE/WNA= github.com/btcsuite/btcwallet/wallet/txsizes v1.0.0/go.mod h1:pauEU8UuMFiThe5PB3EO+gO5kx87Me5NvdQDsTuq6cs= github.com/btcsuite/btcwallet/wallet/txsizes v1.0.1-0.20210519225359-6ab9b615576f h1:bzrmHuQ3ZGWWhGDyTL0OqihQWXGXSXNuBPkDoDB8SS4= github.com/btcsuite/btcwallet/wallet/txsizes v1.0.1-0.20210519225359-6ab9b615576f/go.mod h1:pauEU8UuMFiThe5PB3EO+gO5kx87Me5NvdQDsTuq6cs= github.com/btcsuite/btcwallet/walletdb v1.3.4/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= -github.com/btcsuite/btcwallet/walletdb v1.3.5-0.20210513043850-3a2f12e3a954/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= -github.com/btcsuite/btcwallet/walletdb v1.3.5 h1:SoxUPLgJUkyO1XqON6X7x+rjHJoIpRQov8o8X6gNoz8= github.com/btcsuite/btcwallet/walletdb v1.3.5/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= +github.com/btcsuite/btcwallet/walletdb v1.3.6-0.20210803004036-eebed51155ec h1:zcAU3Ij8SmqaE+ITtS76fua2Niq7DRNp46sJRhi8PiI= +github.com/btcsuite/btcwallet/walletdb v1.3.6-0.20210803004036-eebed51155ec/go.mod h1:oJDxAEUHVtnmIIBaa22wSBPTVcs6hUp5NKWmI8xDwwU= github.com/btcsuite/btcwallet/wtxmgr v1.3.0/go.mod h1:awQsh1n/0ZrEQ+JZgWvHeo153ubzEisf/FyNtwI0dDk= -github.com/btcsuite/btcwallet/wtxmgr v1.3.1-0.20210706234807-aaf03fee735a h1:25oMK8eFUTVMyKGHc2xX7pNkU4u208Dpf6IPVh5E+cA= -github.com/btcsuite/btcwallet/wtxmgr v1.3.1-0.20210706234807-aaf03fee735a/go.mod h1:UM38ixX8VwJ9qey4umf//0H3ndn5kSImFZ46V54Nd5Q= +github.com/btcsuite/btcwallet/wtxmgr v1.3.1-0.20210822222949-9b5a201c344c h1:owWPexGfK4eSK4/Zy+XK2lET5qsnW7FRAc8OCOdD0Fg= +github.com/btcsuite/btcwallet/wtxmgr v1.3.1-0.20210822222949-9b5a201c344c/go.mod h1:UM38ixX8VwJ9qey4umf//0H3ndn5kSImFZ46V54Nd5Q= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8/go.mod h1:tYvUd8KLhm/oXvUeSEs2VlLghFjQt9+ZaF9ghH0JNjc= @@ -348,16 +348,16 @@ github.com/lightninglabs/neutrino v0.12.1/go.mod h1:GlKninWpRBbL7b8G0oQ36/8downf github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display/go.mod h1:2oKOBU042GKFHrdbgGiKax4xVrFiZu51lhacUZQ9MnE= github.com/lightningnetwork/lightning-onion v1.0.2-0.20210520211913-522b799e65b1 h1:h1BsjPzWea790mAXISoiT/qr0JRcixTCDNLmjsDThSw= github.com/lightningnetwork/lightning-onion v1.0.2-0.20210520211913-522b799e65b1/go.mod h1:rigfi6Af/KqsF7Za0hOgcyq2PNH4AN70AaMRxcJkff4= -github.com/lightningnetwork/lnd v0.13.0-beta.rc5.0.20210802115842-44971f0c46c9 h1:kFyyJRNFAUnQl5G7b3stUF2KIfdUJu/KCKXvPlBJqNA= -github.com/lightningnetwork/lnd v0.13.0-beta.rc5.0.20210802115842-44971f0c46c9/go.mod h1:3cmukt9wR4PX1va9Q78gmqSPYd6yhV1wcFemM5F+kT8= +github.com/lightningnetwork/lnd v0.13.0-beta.rc5.0.20210920062527-d9f0f07142ea h1:qqVtJ2cQ10k3FtjgZGaqsXgOfImhS1S8eElW3eLg8Ek= +github.com/lightningnetwork/lnd v0.13.0-beta.rc5.0.20210920062527-d9f0f07142ea/go.mod h1:jhZ9v/UO0iB24qOPYKuEUeukJ0XGw3DqKPFtNL62zhw= github.com/lightningnetwork/lnd/cert v1.0.3/go.mod h1:3MWXVLLPI0Mg0XETm9fT4N9Vyy/8qQLmaM5589bEggM= github.com/lightningnetwork/lnd/clock v1.0.1 h1:QQod8+m3KgqHdvVMV+2DRNNZS1GRFir8mHZYA+Z2hFo= github.com/lightningnetwork/lnd/clock v1.0.1/go.mod h1:KnQudQ6w0IAMZi1SgvecLZQZ43ra2vpDNj7H/aasemg= github.com/lightningnetwork/lnd/healthcheck v1.0.0/go.mod h1:u92p1JGFJNMSkMvztKEwmt1P3TRnLeJBXZ3M85xkU1E= github.com/lightningnetwork/lnd/healthcheck v1.0.2 h1:NJsm4l5tKKDDf/6Wb3OeptY09GLUA6w5C1TnDgthCdY= github.com/lightningnetwork/lnd/healthcheck v1.0.2/go.mod h1:u92p1JGFJNMSkMvztKEwmt1P3TRnLeJBXZ3M85xkU1E= -github.com/lightningnetwork/lnd/kvdb v1.0.1 h1:bSWigxPkvfkTznH4gHBAuealvs3woT0sIt9Tte04Z8w= -github.com/lightningnetwork/lnd/kvdb v1.0.1/go.mod h1:XYnpYUhtYCY+5dxU90VXWn/DxlGAgGejEgfqU+F9h98= +github.com/lightningnetwork/lnd/kvdb v1.0.2 h1:UZd/Mrv0zOCaeC/rS4HKRcv6Y+YLYmjOqmzGfkTcAmg= +github.com/lightningnetwork/lnd/kvdb v1.0.2/go.mod h1:ef6Lq422YY6q7jPvgXFbeQq5iP+YHVheblXDvLYDzoE= github.com/lightningnetwork/lnd/queue v1.0.1/go.mod h1:vaQwexir73flPW43Mrm7JOgJHmcEFBWWSl9HlyASoms= github.com/lightningnetwork/lnd/queue v1.0.4 h1:8Dq3vxAFSACPy+pKN88oPFhuCpCoAAChPBwa4BJxH4k= github.com/lightningnetwork/lnd/queue v1.0.4/go.mod h1:YTkTVZCxz8tAYreH27EO3s8572ODumWrNdYW2E/YKxg= @@ -373,8 +373,8 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.25 h1:dFwPR6SfLtrSwgDcIq2bcU/gVutB4sNApq2HBdqcakg= -github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -548,7 +548,6 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -611,7 +610,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -629,8 +627,10 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210913180222-943fd674d43e h1:+b/22bPvDYt4NPDcy4xAGCmON713ONAWFeY3Z7I3tR8= +golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -668,8 +668,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -695,20 +693,24 @@ golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210915083310-ed5796bab164 h1:7ZDGnxgHAMw7thfC5bEos0RDAccZKxioiWBhfIe+tvw= +golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -731,7 +733,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=