Skip to content

Commit bf7c02b

Browse files
author
Lazy Luis
authored
Merge pull request #56 from sideprotocol/bitcoin-address-refactor
Bitcoin address refactor
2 parents 4105165 + fede24a commit bf7c02b

13 files changed

Lines changed: 113 additions & 239 deletions

File tree

app/app.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ import (
156156

157157
// this line is used by starport scaffolding # stargate/app/moduleImport
158158
btccodec "github.com/sideprotocol/side/bitcoin/crypto/codec"
159-
bitcoinkeys "github.com/sideprotocol/side/bitcoin/keys"
160159
)
161160

162161
const (
@@ -339,7 +338,7 @@ func New(
339338
SigningOptions: signing.Options{
340339
AddressCodec: btcbridgecodec.NewBech32Codec(
341340
sdk.GetConfig().GetBech32AccountAddrPrefix(),
342-
bitcoinkeys.Network.Bech32HRPSegwit,
341+
bitcoin.Network.Bech32HRPSegwit,
343342
),
344343
ValidatorAddressCodec: address.Bech32Codec{
345344
Bech32Prefix: sdk.GetConfig().GetBech32ValidatorAddrPrefix(),
@@ -445,7 +444,7 @@ func New(
445444
maccPerms,
446445
btcbridgecodec.NewBech32Codec(
447446
sdk.GetConfig().GetBech32AccountAddrPrefix(),
448-
bitcoinkeys.Network.Bech32HRPSegwit,
447+
bitcoin.Network.Bech32HRPSegwit,
449448
),
450449
sdk.GetConfig().GetBech32AccountAddrPrefix(),
451450
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
@@ -1142,7 +1141,7 @@ func (app *App) AutoCliOpts() autocli.AppOptions {
11421141
ModuleOptions: runtimeservices.ExtractAutoCLIOptions(app.ModuleManager.Modules),
11431142
AddressCodec: btcbridgecodec.NewBech32Codec(
11441143
sdk.GetConfig().GetBech32AccountAddrPrefix(),
1145-
bitcoinkeys.Network.Bech32HRPSegwit,
1144+
bitcoin.Network.Bech32HRPSegwit,
11461145
),
11471146
ValidatorAddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()),
11481147
ConsensusAddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()),

app/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"github.com/cosmos/btcutil/bech32"
55
sdk "github.com/cosmos/cosmos-sdk/types"
66

7-
"github.com/sideprotocol/side/bitcoin/keys"
7+
"github.com/sideprotocol/side/bitcoin"
88
)
99

1010
func init() {
@@ -23,6 +23,6 @@ func init() {
2323
// config.SetBtcChainCfg(&chaincfg.TestNet3Params)
2424
config.Seal()
2525

26-
bech32.BITCOIN_HRP = keys.Network.Bech32HRPSegwit
26+
bech32.BITCOIN_HRP = bitcoin.Network.Bech32HRPSegwit
2727
bech32.SIDE_HRP = AccountAddressPrefix
2828
}

bitcoin/address_test.go

Lines changed: 57 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import (
55
"testing"
66

77
"github.com/btcsuite/btcd/btcutil"
8-
"github.com/btcsuite/btcd/btcutil/bech32"
98
"github.com/btcsuite/btcd/chaincfg"
109
sdk "github.com/cosmos/cosmos-sdk/types"
10+
"github.com/sideprotocol/side/bitcoin"
1111
"github.com/sideprotocol/side/bitcoin/keys/segwit"
1212
"github.com/sideprotocol/side/bitcoin/keys/taproot"
1313
"github.com/stretchr/testify/assert"
@@ -37,7 +37,7 @@ func TestAddressEncodeDecode(t *testing.T) {
3737
} else if strings.HasPrefix(a, "bc1q") {
3838
assert.Equal(t, 33, len(addr.Bytes()), a)
3939
} else {
40-
assert.Equal(t, 53, len(addr.Bytes()), a)
40+
assert.Equal(t, 32, len(addr.Bytes()), a)
4141
}
4242

4343
text_addr := addr.String()
@@ -52,42 +52,60 @@ func TestGenKeys(t *testing.T) {
5252
conf := sdk.GetConfig()
5353
conf.SetBech32PrefixForAccount("side", "side")
5454
conf.Seal()
55+
bitcoin.Network = &chaincfg.MainNetParams
5556

5657
// hash := btcutil.Hash160([]byte{0, 3, 3, 3, 3, 3})
5758
hash := make([]byte, 32, 32)
5859
assert.Equal(t, 32, len(hash))
5960

6061
// sh, err := btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.MainNetParams)
6162
// assert.NoError(t, err)
62-
std, err := btcutil.NewAddressTaproot(hash, &chaincfg.MainNetParams)
63+
std, err := btcutil.NewAddressTaproot(hash, bitcoin.Network)
6364
assert.NoError(t, err)
6465
assert.Equal(t, 32, len(std.AddressSegWit.ScriptAddress()))
6566
// println(std.ScriptAddress())
66-
text := std.AddressSegWit.EncodeAddress()
67-
_, bte, err := bech32.Decode(text)
68-
assert.NoError(t, err)
69-
assert.Equal(t, 53, len(bte), text)
70-
a_str := sdk.MustAccAddressFromBech32(text)
71-
assert.Equal(t, 53, len(a_str.Bytes()), text)
72-
assert.Equal(t, bte, a_str.Bytes())
73-
74-
addrs := []sdk.Address{sdk.AccAddress(taproot.GenPrivKey().PubKey().Address()), sdk.AccAddress(segwit.GenPrivKey().PubKey().Address())}
75-
76-
for _, a := range addrs {
77-
assert.Equal(t, true, strings.HasPrefix(a.String(), "bc"), a.String())
78-
if strings.HasPrefix(a.String(), "bc1p") {
79-
assert.Equal(t, 53, len(a.Bytes()), a.String())
80-
a2, err := sdk.AccAddressFromBech32(a.String())
81-
assert.NoError(t, err)
82-
assert.Equal(t, 53, len(a2.Bytes()))
83-
} else {
84-
assert.Equal(t, 33, len(a.Bytes()), a.String())
85-
}
86-
// a2, err := sdk.AccAddressFromBech32(a.String())
87-
// assert.Equal(t, 53, len(a2.Bytes()))
88-
// assert.NoError(t, err, a.String())
89-
// assert.Equal(t, a.Bytes(), a2.Bytes(), a.String())
90-
}
67+
// text := std.AddressSegWit.EncodeAddress()
68+
// _, bte, err := bech32.Decode(text)
69+
// assert.NoError(t, err)
70+
// assert.Equal(t, 53, len(bte), text)
71+
// a_str := sdk.MustAccAddressFromBech32(text)
72+
// assert.Equal(t, 53, len(a_str.Bytes()), text)
73+
// assert.Equal(t, bte, a_str.Bytes())
74+
75+
// btcutil.DecodeAddress()
76+
// println("taproot:", len(taproot.GenPrivKey().PubKey().Address()))
77+
a := segwit.GenPrivKey().PubKey().Address()
78+
t.Log("segwit:", len(a), sdk.AccAddress(a).String())
79+
80+
// aa, _ := btcutil.NewAddressWitnessPubKeyHash(a.Bytes(), keys.Network)
81+
// t.Log("aa", aa.EncodeAddress())
82+
83+
b := taproot.GenPrivKey().PubKey().Address()
84+
t.Log("taproot:", len(b), sdk.AccAddress(b).String())
85+
bb, _ := btcutil.NewAddressTaproot(b.Bytes(), bitcoin.Network)
86+
t.Log("bb", bb.EncodeAddress())
87+
88+
// println("bech32:", text)
89+
assert.Equal(t, sdk.AccAddress(b).String(), bb.EncodeAddress(), "bech32 address should be equal")
90+
91+
// addrs := []sdk.Address{sdk.AccAddress(taproot.GenPrivKey().PubKey().Address()), sdk.AccAddress(segwit.GenPrivKey().PubKey().Address())}
92+
93+
// for _, a := range addrs {
94+
// println(len(a.Bytes()), a.String())
95+
// assert.Equal(t, true, strings.HasPrefix(a.String(), "bc"), a.String())
96+
// if strings.HasPrefix(a.String(), "bc1p") {
97+
// assert.Equal(t, 32, len(a.Bytes()), a.String())
98+
// a2, err := sdk.AccAddressFromBech32(a.String())
99+
// assert.NoError(t, err)
100+
// assert.Equal(t, 32, len(a2.Bytes()))
101+
// } else {
102+
// assert.Equal(t, 33, len(a.Bytes()), a.String())
103+
// }
104+
// // a2, err := sdk.AccAddressFromBech32(a.String())
105+
// // assert.Equal(t, 53, len(a2.Bytes()))
106+
// // assert.NoError(t, err, a.String())
107+
// // assert.Equal(t, a.Bytes(), a2.Bytes(), a.String())
108+
// }
91109
}
92110

93111
func TestValAddressEncodeDecode(t *testing.T) {
@@ -100,19 +118,25 @@ func TestValAddressEncodeDecode(t *testing.T) {
100118
vals := []string{
101119
// "sidevaloper1qqwpwrc0qs0pvrc6rvrsxrc2p583vqstpgdqxxsmzgp3y9gfpvqp7srxm9c", // error case
102120
// "sidevaloper1qqgsc9gfrqfsyrgtp5wpjqgkqct3cqq4rq8pj9cspcgszzqtzv2ssmdxyv7",
103-
"sidevaloper1pfakusycd3aful428aqm6ljclu36vk6rzxqvu72g9e7jzaukswgnqd7xhsc",
104-
"sidevaloper1p8990duvf0d23jelthdl2qgwfrrylny5zul0awymk7j45cjtm52eqqq7yxc",
105-
"sidevaloper1qfwqngtkrmlytqkqsd54k9t4htufp0hw9sndewh",
121+
"sidevaloper1qq9qjpswp5t3j9c8pq93xrc7zsysqpq6r5dqvpczpqz3yzqfrqwsc0aalqh",
122+
"sidevaloper1l90rhzz8tka095tpvhjgzamvsvxyqhu34e9335l9npy2zx83lmcq9y82l7",
123+
"sidevaloper1qqy3sqqmpv83xqcfry8qvyqazvqp6qqgru23y9q2q52swxggqg8sya58uzu",
124+
"sidevaloper1qq0pkzghzcvsz8qwzcqq6xs6rv8qwxctzyzqq8shzy9qu8qhrcgsq8gftvt",
125+
"sidevaloper1qqr3wzgzqvpqxycjzyr3kzcequxskxqxzydsjqgeqygq2xqxqgtpuaaajmf",
126+
"sidevaloper1yezttrzdh00zmtzzfau9vuy360hxkjnl3gfxw2jzfqz67d8t8myq79pv5g",
106127
}
107128

108129
for _, a := range vals {
109130

110131
addr, err := sdk.ValAddressFromBech32(a)
111132
assert.NoError(t, err, "invalid address "+a)
133+
t.Log("addr", addr.String())
112134
if strings.HasPrefix(a, "sidevaloper1p") {
113-
assert.Equal(t, 53, len(addr))
114-
} else {
115135
assert.Equal(t, 33, len(addr))
136+
} else if strings.HasPrefix(a, "sidevaloper1q") {
137+
assert.Equal(t, 33, len(addr))
138+
} else {
139+
assert.Equal(t, 32, len(addr))
116140
}
117141

118142
text_addr := addr.String()

bitcoin/bech32/bech32.go

Lines changed: 0 additions & 119 deletions
This file was deleted.

bitcoin/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package bitcoin
22

33
import (
44
storetypes "cosmossdk.io/store/types"
5+
"github.com/btcsuite/btcd/chaincfg"
56
"github.com/cosmos/cosmos-sdk/crypto/hd"
67
"github.com/cosmos/cosmos-sdk/crypto/keyring"
78
"github.com/cosmos/cosmos-sdk/types/tx/signing"
@@ -12,6 +13,7 @@ import (
1213
)
1314

1415
var (
16+
Network = &chaincfg.TestNet3Params
1517
KeyringOption = func(options *keyring.Options) {
1618
options.SupportedAlgos = keyring.SigningAlgoList{hd.Secp256k1, SegWit, Taproot}
1719
options.SupportedAlgosLedger = keyring.SigningAlgoList{hd.Secp256k1}

bitcoin/keys/chaincfg.go

Lines changed: 0 additions & 7 deletions
This file was deleted.

bitcoin/keys/segwit/segwit.go

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@ import (
1010

1111
secp256k1 "github.com/btcsuite/btcd/btcec/v2"
1212
"github.com/btcsuite/btcd/btcutil"
13-
"github.com/sideprotocol/side/bitcoin/keys"
13+
"github.com/btcsuite/btcd/btcutil/bech32"
1414

1515
"github.com/cometbft/cometbft/crypto"
1616

1717
errorsmod "cosmossdk.io/errors"
1818

1919
//nolint: staticcheck
2020

21-
"github.com/cosmos/btcutil/bech32"
2221
"github.com/cosmos/cosmos-sdk/codec"
2322
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
2423
"github.com/cosmos/cosmos-sdk/types/errors"
@@ -164,28 +163,19 @@ func (pubKey *PubKey) Address() crypto.Address {
164163

165164
witnessProg := btcutil.Hash160(pubKey.Bytes())
166165

167-
bech32Address, err := btcutil.NewAddressWitnessPubKeyHash(witnessProg, keys.Network)
166+
converted, err := bech32.ConvertBits(witnessProg, 8, 5, true)
168167
if err != nil {
169-
panic(err)
168+
panic(err) // Handle this as needed
170169
}
171-
_, bz, err1 := bech32.Decode(bech32Address.String(), 1023)
172-
if err1 != nil {
173-
panic(err1)
174-
}
175-
return crypto.Address(bz)
176170

177-
// converted, err := bech32.ConvertBits(witnessProgram, 8, 5, true)
178-
// if err != nil {
179-
// panic(err)
180-
// }
171+
// Concatenate the witness version and program, and encode the resulting
172+
// bytes using bech32 encoding.
173+
combined := make([]byte, len(converted)+1)
174+
combined[0] = 0x0
175+
copy(combined[1:], converted)
181176

182-
// // Concatenate the witness version and program, and encode the resulting
183-
// // bytes using bech32 encoding.
184-
// combined := make([]byte, len(converted)+1)
185-
// combined[0] = 0x0
186-
// copy(combined[1:], converted)
177+
return crypto.Address(combined)
187178

188-
// return crypto.Address(combined)
189179
}
190180

191181
// Bytes returns the pubkey byte format.

0 commit comments

Comments
 (0)