Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 45 additions & 25 deletions cmd/commands/walletrpc_active.go
Original file line number Diff line number Diff line change
Expand Up @@ -1954,14 +1954,20 @@ var signMessageWithAddrCommand = cli.Command{
Name: "signmessage",
Usage: "Sign a message with the private key of the provided " +
"address.",
ArgsUsage: "address msg",
ArgsUsage: "address msg [--bip322]",
Description: `
Sign a message with the private key of the specified address, and
return the signature. Signing is solely done in the ECDSA compact
signature format. This is also done when signing with a P2TR address
meaning that the private key of the P2TR address (internal key) is used
to sign the provided message with the ECDSA format. Only addresses are
accepted which are owned by the internal lnd wallet.
return the signature. By default, signing is done in the legacy ECDSA
compact signature format. This is also done when signing with a P2TR
address using the legacy format, meaning that the private key of the
P2TR address (internal key) is used to sign the provided message with
the ECDSA format.

Use the --bip322 flag to enable the standardized BIP-0322 Generic Signed
Message Format. This format is compatible with any address type but
might be less widely adopted by verifiers.

Only addresses that are owned by the internal lnd wallet are accepted.
`,
Flags: []cli.Flag{
cli.StringFlag{
Expand All @@ -1973,6 +1979,11 @@ var signMessageWithAddrCommand = cli.Command{
Name: "msg",
Usage: "the message to sign for",
},
cli.BoolFlag{
Name: "bip322",
Usage: "enable the standardized BIP-0322 Generic " +
"Signed Message Format",
},
},
Action: actionDecorator(signMessageWithAddr),
}
Expand All @@ -1982,7 +1993,7 @@ func signMessageWithAddr(ctx *cli.Context) error {

// Display the command's help message if we do not have the expected
// number of arguments/flags.
if ctx.NArg() > 2 || ctx.NumFlags() > 2 {
if ctx.NArg() > 2 || ctx.NumFlags() > 3 {
return cli.ShowCommandHelp(ctx, "signmessagewithaddr")
}

Expand Down Expand Up @@ -2019,10 +2030,10 @@ func signMessageWithAddr(ctx *cli.Context) error {
}

resp, err := walletClient.SignMessageWithAddr(
ctxc,
&walletrpc.SignMessageWithAddrRequest{
Msg: msg,
Addr: addr,
ctxc, &walletrpc.SignMessageWithAddrRequest{
Msg: msg,
Addr: addr,
Bip322: ctx.Bool("bip322"),
},
)
if err != nil {
Expand All @@ -2041,16 +2052,26 @@ var verifyMessageWithAddrCommand = cli.Command{
ArgsUsage: "address sig msg",
Description: `
Verify a message signed with the signature of the public key
of the provided address. The signature must be in compact ECDSA format
The verification is independent whether the address belongs to the
of the provided address. The signature must be in legacy compact ECDSA
format or the new BIP-0322 Generic Signed Message Format.
The verification is independent of whether the address belongs to the
wallet or not. This is achieved by only accepting ECDSA compacted
signatures. When verifying a signature with a taproot address, the
signature still has to be in the ECDSA compact format and no tapscript
has to be included in the P2TR address.
Supports address types P2PKH, P2WKH, NP2WKH, P2TR.

Besides whether the signature is valid or not, the recoverd public key
of the compact ECDSA signature is returned.
signatures where the public key can be reconstructed or by accepting
BIP-0322 standardized signatures. When verifying a legacy signature with
a taproot address, the signature still has to be in the ECDSA compact
format and no tapscript has to be included in the P2TR address.
Supports address types for legacy signatures are: P2PKH, P2WKH, NP2WKH,
P2TR.

Besides whether the signature is valid or not, the recovered public key
of the legacy compact ECDSA signature is returned.
In case of a BIP-0322 signature, the signature variant and optional
time constraint parameters are returned. Time constraints will only ever
be set on a BIP-0322 'full' or 'proof of funds' type signature that was
created for a scripted address that uses LockTime or Sequence check
opcodes. A verifier must decide themselves if they want to accept such a
time or age-based constraint on a signature. lnd does not interpret
these values, as checking the signature is a fully offline operation.
`,
Flags: []cli.Flag{
cli.StringFlag{
Expand All @@ -2060,12 +2081,12 @@ var verifyMessageWithAddrCommand = cli.Command{
},
cli.StringFlag{
Name: "sig",
Usage: "the base64 encoded compact signature " +
"of the message",
Usage: "the base64 encoded compact ECDSA or BIP-0322 " +
"signature of the message",
},
cli.StringFlag{
Name: "msg",
Usage: "the message to sign",
Usage: "the message to verify the signature of",
},
},
Action: actionDecorator(verifyMessageWithAddr),
Expand Down Expand Up @@ -2126,8 +2147,7 @@ func verifyMessageWithAddr(ctx *cli.Context) error {
}

resp, err := walletClient.VerifyMessageWithAddr(
ctxc,
&walletrpc.VerifyMessageWithAddrRequest{
ctxc, &walletrpc.VerifyMessageWithAddrRequest{
Msg: msg,
Signature: sig,
Addr: addr,
Expand Down
8 changes: 8 additions & 0 deletions docs/release-notes/release-notes-0.22.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@

## Functional Enhancements

* Signing a message for an address [now supports the recently finalized BIP-0322
Generic Signed Message
Format](https://github.com/lightningnetwork/lnd/pull/10798). The new format
can be invoked by setting `Bip322: true` on the `SignMessageWithAddr` RPC or
by specifying the `--bip322` flag on the `lncli wallet addresses signmessage`
subcommand. Verification of the new address format works without any new flag
because the new format can be automatically detected based on its prefix.

## RPC Additions

* The `routerrpc.EstimateRouteFee` RPC now supports [restricting fee estimates
Expand Down
25 changes: 17 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require (
github.com/andybalholm/brotli v1.0.4
github.com/btcsuite/btcd v0.26.0
github.com/btcsuite/btcd/address/v2 v2.0.0
github.com/btcsuite/btcd/bip322 v0.0.0
github.com/btcsuite/btcd/btcec/v2 v2.5.0
github.com/btcsuite/btcd/btcutil/v2 v2.0.0
github.com/btcsuite/btcd/chaincfg/v2 v2.0.0
Expand Down Expand Up @@ -56,11 +57,11 @@ require (
github.com/urfave/cli v1.22.14
go.etcd.io/etcd/client/pkg/v3 v3.5.12
go.etcd.io/etcd/client/v3 v3.5.12
golang.org/x/crypto v0.46.0
golang.org/x/crypto v0.51.0
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028
golang.org/x/sync v0.19.0
golang.org/x/term v0.38.0
golang.org/x/sync v0.20.0
golang.org/x/term v0.43.0
golang.org/x/time v0.3.0
google.golang.org/grpc v1.79.3
google.golang.org/protobuf v1.36.11
Expand Down Expand Up @@ -109,7 +110,7 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/protobuf v1.5.4
github.com/golang/snappy v1.0.0 // indirect
github.com/google/btree v1.0.1 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
Expand Down Expand Up @@ -184,11 +185,11 @@ require (
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.17.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/mod v0.30.0 // indirect
golang.org/x/net v0.48.0 // indirect
golang.org/x/mod v0.35.0 // indirect
golang.org/x/net v0.53.0 // indirect
golang.org/x/sys v0.45.0 // indirect
golang.org/x/text v0.32.0
golang.org/x/tools v0.39.0 // indirect
golang.org/x/text v0.37.0
golang.org/x/tools v0.44.0 // indirect
google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
Expand All @@ -213,6 +214,14 @@ replace github.com/lightningnetwork/lnd/sqldb => ./sqldb
// allows us to specify that as an option.
replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.36.11-hex-display

// TODO(guggero): Remove this when https://github.com/btcsuite/btcd/pull/2521 is
// merged.
replace (
github.com/btcsuite/btcd/bip322 => github.com/guggero/btcd/bip322 v0.0.0-20260625051046-976d195d6d89
github.com/btcsuite/btcd/psbt/v2 => github.com/guggero/btcd/psbt/v2 v2.0.0-20260625051046-976d195d6d89
github.com/btcsuite/btcd/txscript/v2 => github.com/guggero/btcd/txscript/v2 v2.0.0-20260625051046-976d195d6d89
)

// If you change this please also update docs/INSTALL.md and all other go.mod
// files. The release build toolchain version is tracked separately by
// GO_VERSION in Makefile.
Expand Down
38 changes: 20 additions & 18 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,6 @@ github.com/btcsuite/btcd/chaincfg/v2 v2.0.0 h1:M/RTtXfXA9odC1RUEOyZFXj/NXKVHPYZX
github.com/btcsuite/btcd/chaincfg/v2 v2.0.0/go.mod h1:rHgHIXYYfn70m25a+BJ9f9z7VZAsTiDQGB2XYaippGQ=
github.com/btcsuite/btcd/chainhash/v2 v2.0.0 h1:PMLlSloHJuEeB80XG9EjpXWNEKAZAMLl6YHZ6YsEuoA=
github.com/btcsuite/btcd/chainhash/v2 v2.0.0/go.mod h1:mKxcZ7oGTXE7IRV+sS9hP4EVBwc/SzfNR+52IsOP9j8=
github.com/btcsuite/btcd/psbt/v2 v2.0.0 h1:vKBfHGkxsplVExwCozfK9VuioZ6D6cRpAhcMia2kgrQ=
github.com/btcsuite/btcd/psbt/v2 v2.0.0/go.mod h1:WdHfpXJDXklnMU8u22YXz8o12q8hPYr4b8CxpKdjGYs=
github.com/btcsuite/btcd/txscript/v2 v2.0.0 h1:pEmmHaC8eRx6KSB63zSVJD7qrit9/c9cLSrw++XrYP8=
github.com/btcsuite/btcd/txscript/v2 v2.0.0/go.mod h1:pZXabc11Xr9nz/18kXY3yErdAajYc3gi28Zqb3KqlFo=
github.com/btcsuite/btcd/v2transport v1.0.1 h1:pIyyyBCPwd087K3Wdb/9tIvUubAQdzTJghjPgzTQVsE=
github.com/btcsuite/btcd/v2transport v1.0.1/go.mod h1:N6H0HGSElVVJKntzaYHYVbW71DtWDLMw2yhwVRO3ZOE=
github.com/btcsuite/btcd/wire/v2 v2.0.0 h1:mYSKzZZ0a1sK+aMhXzfDSVsSzRkWkU3x2U04TFRS2z8=
Expand Down Expand Up @@ -200,6 +196,12 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
github.com/guggero/btcd/bip322 v0.0.0-20260625051046-976d195d6d89 h1:NTyG4xi1bKx6VfwJQ+4pUOlZV1r2HcoMwwlZSE6309U=
github.com/guggero/btcd/bip322 v0.0.0-20260625051046-976d195d6d89/go.mod h1:S//Nmi6mBoNzmnMOnePDFmS+eW4gvSqI8tc0CHDnHXs=
github.com/guggero/btcd/psbt/v2 v2.0.0-20260625051046-976d195d6d89 h1:JrHNDHvLuHZMHLB+ejWNO+9q3NjTodwE5XHHFNhB2Ps=
github.com/guggero/btcd/psbt/v2 v2.0.0-20260625051046-976d195d6d89/go.mod h1:VGp4rjKPrvnRKAC4NHjrC63b9Eu7c53+zPG4pfpkTHw=
github.com/guggero/btcd/txscript/v2 v2.0.0-20260625051046-976d195d6d89 h1:6zU+47s3y6fOVOVh1uiA4pdk+wmX7hYac1G/tAhSP4o=
github.com/guggero/btcd/txscript/v2 v2.0.0-20260625051046-976d195d6d89/go.mod h1:Q30ltpfH/3PVz3lpq8v9GosWUJEOgyAN43UExHYlXxs=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
Expand Down Expand Up @@ -459,8 +461,8 @@ golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
Expand All @@ -473,8 +475,8 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
Expand All @@ -490,8 +492,8 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
Expand All @@ -503,8 +505,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -529,13 +531,13 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
golang.org/x/text v0.3.0/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.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Expand All @@ -546,8 +548,8 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Expand Down
Loading
Loading