What changed, and why it matters
This commit adds support for a new Bitcoin address type called Pay-to-Anchor (P2A). It is a feature addition that lets btcd recognize and encode/decode a specific kind of SegWit address used for transaction fee bumping. There is no indication in the commit that it fixes a security bug or introduces a vulnerability.
No security action required; treat as a normal feature addition. Reviewers may want to verify the P2A constants match txscript.PayToAnchorScript as noted in the code comment, and confirm dependency upgrades do not break downstream consumers.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch introduces AddressPayToAnchor in btcutil/address.go, implementing the BIP-141-like P2A output (OP_1 0x4e73) with a fixed 2-byte witness program. It wires DecodeAddress to recognize witness version 1 with program length 2 and the exact bytes 0x4e73, adds constructors, encoding, ScriptAddress, and IsForNet methods, plus unit tests. go.mod/go.sum are updated to Go 1.23.2, newer btcec and x/crypto, and a local replace directive. No security-relevant behavior changes are visible in the diff.
Changed components
btcutil/address.gobtcutil/p2a_address_test.gobtcutil/go.modbtcutil/go.sumgo.modgo.sumInspect captured patch +233 / −40
diff --git a/btcutil/address.go b/btcutil/address.go
index 95d3e6c..579367d 100644
--- a/btcutil/address.go
+++ b/btcutil/address.go
@@ -171,8 +171,20 @@ func DecodeAddress(addr string, defaultNet *chaincfg.Params) (Address, error) {
hrp := prefix[:len(prefix)-1]
switch len(witnessProg) {
+ case 2:
+ // Check if it's a P2A address (witness version
+ // 1, program 0x4e73).
+ if witnessVer == 1 && bytes.Equal(
+ witnessProg, []byte{0x4e, 0x73},
+ ) {
+ return newAddressPayToAnchor(hrp), nil
+ }
+
+ return nil, UnsupportedWitnessProgLenError(len(witnessProg))
+
case 20:
return newAddressWitnessPubKeyHash(hrp, witnessProg)
+
case 32:
if witnessVer == 1 {
return newAddressTaproot(hrp, witnessProg)
@@ -709,3 +721,81 @@ func newAddressTaproot(hrp string,
return addr, nil
}
+
+// payToAnchorScript is the fixed script bytes for a pay-to-anchor output:
+// OP_1 OP_DATA_2 0x4e73. This is defined here to avoid an import cycle with
+// txscript. The same constant is exported as txscript.PayToAnchorScript;
+// keep both definitions in sync.
+var payToAnchorScript = []byte{0x51, 0x02, 0x4e, 0x73}
+
+// payToAnchorWitnessProgram is the 2-byte witness program portion of a P2A
+// output (i.e. the bytes that follow the OP_1 / OP_DATA_2 prefix in
+// payToAnchorScript).
+var payToAnchorWitnessProgram = []byte{0x4e, 0x73}
+
+// AddressPayToAnchor is an Address for a pay-to-anchor (P2A) output. P2A
+// outputs use the fixed script OP_1 <0x4e73> and have specific bech32
+// addresses for each network.
+type AddressPayToAnchor struct {
+ hrp string
+}
+
+// NewAddressPayToAnchor returns a new AddressPayToAnchor for the given network.
+func NewAddressPayToAnchor(net *chaincfg.Params) (*AddressPayToAnchor, error) {
+ if net == nil {
+ return nil, errors.New("nil network")
+ }
+
+ return newAddressPayToAnchor(net.Bech32HRPSegwit), nil
+}
+
+// newAddressPayToAnchor is an internal helper function to create an
+// AddressPayToAnchor with a known human-readable part, rather than looking it
+// up through its parameters. The HRP is normalized to lowercase so that
+// addresses decoded from all-uppercase bech32 strings (which BIP 173 allows)
+// still compare equal to the lowercase network HRP in IsForNet.
+func newAddressPayToAnchor(hrp string) *AddressPayToAnchor {
+ return &AddressPayToAnchor{
+ hrp: strings.ToLower(hrp),
+ }
+}
+
+// String returns a human-readable string for the pay-to-anchor address. This
+// is equivalent to EncodeAddress, but is provided to satisfy the Stringer
+// interface.
+func (a *AddressPayToAnchor) String() string {
+ return a.EncodeAddress()
+}
+
+// EncodeAddress returns the bech32m string encoding of the pay-to-anchor
+// address. P2A addresses are encoded using witness version 1 with the program
+// bytes 0x4e73, resulting in these addresses per network:
+//
+// - Mainnet: bc1pfeessrawgf
+// - Testnet: tb1pfees9rn5nz
+// - Regtest: bcrt1pfeesnyr2tx
+// - Simnet: sb1pfeesxv0pfa
+func (a *AddressPayToAnchor) EncodeAddress() string {
+ // For unknown networks, generate the address from the anchor data.
+ // This shouldn't happen in practice.
+ anchorData := []byte{0x4e, 0x73}
+ addr, err := encodeSegWitAddress(a.hrp, 1, anchorData)
+ if err != nil {
+ return ""
+ }
+ return addr
+}
+
+// ScriptAddress returns the witness program portion of the P2A address (the
+// 2-byte program 0x4e73). This matches the convention used by other segwit
+// address types, where ScriptAddress returns the witness program and the
+// outer script wrapping (OP_1 OP_DATA_2 ...) is added by PayToAddrScript.
+func (a *AddressPayToAnchor) ScriptAddress() []byte {
+ return payToAnchorWitnessProgram
+}
+
+// IsForNet returns whether the address is associated with the passed
+// bitcoin network.
+func (a *AddressPayToAnchor) IsForNet(net *chaincfg.Params) bool {
+ return a.hrp == net.Bech32HRPSegwit
+}
diff --git a/btcutil/go.mod b/btcutil/go.mod
index b0b8597..723a9c9 100644
--- a/btcutil/go.mod
+++ b/btcutil/go.mod
@@ -1,20 +1,23 @@
module github.com/btcsuite/btcd/btcutil
-go 1.22
+go 1.23.2
require (
github.com/aead/siphash v1.0.1
github.com/btcsuite/btcd v0.24.2
- github.com/btcsuite/btcd/btcec/v2 v2.1.3
+ github.com/btcsuite/btcd/btcec/v2 v2.3.5
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
github.com/davecgh/go-spew v1.1.1
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23
- golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
+ github.com/stretchr/testify v1.8.4
+ golang.org/x/crypto v0.25.0
)
require (
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect
github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect
- golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect
+ github.com/pmezard/go-difflib v1.0.0 // indirect
+ golang.org/x/sys v0.22.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/btcutil/go.sum b/btcutil/go.sum
index 42dd458..fa59c6a 100644
--- a/btcutil/go.sum
+++ b/btcutil/go.sum
@@ -2,8 +2,8 @@ github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY=
github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg=
-github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE=
-github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
+github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU=
+github.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
@@ -24,14 +24,11 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ=
-golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
+golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
+golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
+golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/btcutil/p2a_address_test.go b/btcutil/p2a_address_test.go
new file mode 100644
index 0000000..d22f067
--- /dev/null
+++ b/btcutil/p2a_address_test.go
@@ -0,0 +1,126 @@
+package btcutil_test
+
+import (
+ "testing"
+
+ "github.com/btcsuite/btcd/btcutil"
+ "github.com/btcsuite/btcd/chaincfg"
+ "github.com/stretchr/testify/require"
+)
+
+// TestAddressPayToAnchor tests the AddressPayToAnchor type.
+func TestAddressPayToAnchor(t *testing.T) {
+ tests := []struct {
+ name string
+ net *chaincfg.Params
+ wantAddress string
+ }{
+ {
+ name: "mainnet",
+ net: &chaincfg.MainNetParams,
+ wantAddress: "bc1pfeessrawgf",
+ },
+ {
+ name: "testnet",
+ net: &chaincfg.TestNet3Params,
+ wantAddress: "tb1pfees9rn5nz",
+ },
+ {
+ name: "regtest",
+ net: &chaincfg.RegressionNetParams,
+ wantAddress: "bcrt1pfeesnyr2tx",
+ },
+ {
+ name: "simnet",
+ net: &chaincfg.SimNetParams,
+ wantAddress: "sb1pfeesxv0pfa",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ addr, err := btcutil.NewAddressPayToAnchor(tt.net)
+ require.NoError(t, err)
+
+ require.Equal(t, tt.wantAddress, addr.EncodeAddress())
+ require.Equal(t, tt.wantAddress, addr.String())
+ require.True(t, addr.IsForNet(tt.net))
+
+ // Verify it's not for a different network.
+ otherNet := &chaincfg.MainNetParams
+ if tt.net == &chaincfg.MainNetParams {
+ otherNet = &chaincfg.TestNet3Params
+ }
+ require.False(t, addr.IsForNet(otherNet))
+
+ // Verify ScriptAddress returns the 2-byte witness
+ // program portion of the P2A output (the bytes that
+ // follow the OP_1 OP_DATA_2 prefix).
+ wantWitnessProgram := []byte{0x4e, 0x73}
+ require.Equal(t, wantWitnessProgram, addr.ScriptAddress())
+ })
+ }
+}
+
+// TestDecodeAddressP2A tests decoding P2A addresses.
+func TestDecodeAddressP2A(t *testing.T) {
+ tests := []struct {
+ name string
+ address string
+ net *chaincfg.Params
+ wantErr bool
+ }{
+ {
+ name: "mainnet P2A",
+ address: "bc1pfeessrawgf",
+ net: &chaincfg.MainNetParams,
+ wantErr: false,
+ },
+ {
+ name: "testnet P2A",
+ address: "tb1pfees9rn5nz",
+ net: &chaincfg.TestNet3Params,
+ wantErr: false,
+ },
+ {
+ name: "regtest P2A",
+ address: "bcrt1pfeesnyr2tx",
+ net: &chaincfg.RegressionNetParams,
+ wantErr: false,
+ },
+ {
+ // BIP 173 permits all-uppercase bech32 encodings.
+ // Decoding must normalize the HRP so the resulting
+ // address still reports as belonging to its network.
+ name: "uppercase mainnet P2A",
+ address: "BC1PFEESSRAWGF",
+ net: &chaincfg.MainNetParams,
+ wantErr: false,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ addr, err := btcutil.DecodeAddress(tt.address, tt.net)
+ if tt.wantErr {
+ require.Error(t, err)
+ return
+ }
+ require.NoError(t, err)
+
+ // Ensure the decoded address is of the correct P2A type.
+ p2aAddr, ok := addr.(*btcutil.AddressPayToAnchor)
+ require.True(t, ok, "expected *AddressPayToAnchor, got %T", addr)
+
+ // Ensure round-trip encoding produces the canonical
+ // lowercase encoding for the address's network.
+ require.True(t, p2aAddr.IsForNet(tt.net))
+ })
+ }
+}
+
+// TestNewAddressPayToAnchorNilNetwork tests that nil network returns error.
+func TestNewAddressPayToAnchorNilNetwork(t *testing.T) {
+ _, err := btcutil.NewAddressPayToAnchor(nil)
+ require.Error(t, err)
+}
diff --git a/go.mod b/go.mod
index 2d543d8..9dd412c 100644
--- a/go.mod
+++ b/go.mod
@@ -66,3 +66,5 @@ retract (
)
go 1.23.2
+
+replace github.com/btcsuite/btcd/btcutil => ./btcutil
diff --git a/go.sum b/go.sum
index 58fc732..e4dfd19 100644
--- a/go.sum
+++ b/go.sum
@@ -1,36 +1,19 @@
github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
-github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
-github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
-github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A=
-github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
-github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU=
github.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ=
-github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=
-github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=
-github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8=
-github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
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/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=
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/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
-github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
-github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
-github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
-github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -58,7 +41,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI=
@@ -68,12 +50,9 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
@@ -83,19 +62,16 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
-golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
-golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
@@ -134,7 +110,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.