Skip to content

Commit 3746bd2

Browse files
author
Lazy Luis
authored
Merge pull request #51 from sideprotocol/feat/direct-cosmos-upstream
Feat/direct cosmos upstream
2 parents c688f61 + 8d10c1f commit 3746bd2

File tree

36 files changed

+4908
-608
lines changed

36 files changed

+4908
-608
lines changed

api/cosmos/crypto/segwit/keys.pulsar.go

Lines changed: 1058 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/cosmos/crypto/taproot/keys.pulsar.go

Lines changed: 1059 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/app.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ import (
116116
solomachine "github.com/cosmos/ibc-go/v8/modules/light-clients/06-solomachine"
117117
ibctm "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint"
118118
"github.com/prometheus/client_golang/prometheus"
119+
"github.com/sideprotocol/side/bitcoin"
119120
"github.com/spf13/cast"
120121

121122
"github.com/CosmWasm/wasmd/x/wasm"
@@ -136,7 +137,10 @@ import (
136137
lendingkeeper "github.com/sideprotocol/side/x/lending/keeper"
137138
lendingmodule "github.com/sideprotocol/side/x/lending/module"
138139
lendingtypes "github.com/sideprotocol/side/x/lending/types"
140+
139141
// this line is used by starport scaffolding # stargate/app/moduleImport
142+
143+
btccodec "github.com/sideprotocol/side/crypto/codec"
140144
)
141145

142146
const (
@@ -310,7 +314,7 @@ func New(
310314
SigningOptions: signing.Options{
311315
AddressCodec: btcbridgecodec.NewBech32Codec(
312316
sdk.GetConfig().GetBech32AccountAddrPrefix(),
313-
sdk.GetConfig().GetBtcChainCfg().Bech32HRPSegwit,
317+
bitcoin.Network.Bech32HRPSegwit,
314318
),
315319
ValidatorAddressCodec: address.Bech32Codec{
316320
Bech32Prefix: sdk.GetConfig().GetBech32ValidatorAddrPrefix(),
@@ -320,8 +324,14 @@ func New(
320324
if err != nil {
321325
panic(err)
322326
}
323-
appCodec := codec.NewProtoCodec(interfaceRegistry)
327+
324328
legacyAmino := codec.NewLegacyAmino()
329+
330+
btccodec.RegisterCrypto(legacyAmino)
331+
btccodec.RegisterInterfaces(interfaceRegistry)
332+
333+
appCodec := codec.NewProtoCodec(interfaceRegistry)
334+
325335
txConfig := authtx.NewTxConfig(appCodec, authtx.DefaultSignModes)
326336

327337
std.RegisterLegacyAminoCodec(legacyAmino)
@@ -409,7 +419,7 @@ func New(
409419
maccPerms,
410420
btcbridgecodec.NewBech32Codec(
411421
sdk.GetConfig().GetBech32AccountAddrPrefix(),
412-
sdk.GetConfig().GetBtcChainCfg().Bech32HRPSegwit,
422+
bitcoin.Network.Bech32HRPSegwit,
413423
),
414424
sdk.GetConfig().GetBech32AccountAddrPrefix(),
415425
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
@@ -928,7 +938,7 @@ func New(
928938
BankKeeper: app.BankKeeper,
929939
SignModeHandler: txConfig.SignModeHandler(),
930940
FeegrantKeeper: app.FeeGrantKeeper,
931-
SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
941+
SigGasConsumer: bitcoin.DefaultSigVerificationGasConsumer,
932942
},
933943
)
934944
if err != nil {
@@ -1039,7 +1049,7 @@ func (app *App) AutoCliOpts() autocli.AppOptions {
10391049
ModuleOptions: runtimeservices.ExtractAutoCLIOptions(app.ModuleManager.Modules),
10401050
AddressCodec: btcbridgecodec.NewBech32Codec(
10411051
sdk.GetConfig().GetBech32AccountAddrPrefix(),
1042-
sdk.GetConfig().GetBtcChainCfg().Bech32HRPSegwit,
1052+
bitcoin.Network.Bech32HRPSegwit,
10431053
),
10441054
ValidatorAddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()),
10451055
ConsensusAddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()),

app/config.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package app
22

33
import (
4-
"github.com/btcsuite/btcd/chaincfg"
5-
64
sdk "github.com/cosmos/cosmos-sdk/types"
75
)
86

@@ -19,6 +17,6 @@ func init() {
1917
config.SetBech32PrefixForAccount(AccountAddressPrefix, accountPubKeyPrefix)
2018
config.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix)
2119
config.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix)
22-
config.SetBtcChainCfg(&chaincfg.SigNetParams)
20+
// config.SetBtcChainCfg(&chaincfg.TestNet3Params)
2321
config.Seal()
2422
}

bitcoin/address_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package bitcoin_test
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/btcsuite/btcd/btcutil"
8+
"github.com/btcsuite/btcd/btcutil/bech32"
9+
"github.com/btcsuite/btcd/chaincfg"
10+
sdk "github.com/cosmos/cosmos-sdk/types"
11+
"github.com/sideprotocol/side/crypto/keys/segwit"
12+
"github.com/sideprotocol/side/crypto/keys/taproot"
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestAddressEncodeDecode(t *testing.T) {
17+
18+
conf := sdk.GetConfig()
19+
conf.SetBech32PrefixForAccount("side", "side")
20+
conf.Seal()
21+
22+
adds := []string{
23+
"side10d07y265gmmuvt4z0w9aw880jnsr700jwrwlg5",
24+
"bc1qqs4cyfvr6fwlca38hvyrgwl08k7cxme6jw3rr6",
25+
"bc1q73ssvy27zd8kjhrzjalzjkfdya0kd9na8pz00n",
26+
"bc1q3v4fcnzdtduepkxhuq4cwehsw3pgtn4gakpc9t",
27+
"bc1pln2mzgrk689xfuacgmwpym95karxf8283qh9k7ze5ucc7crl6qrq4w30es",
28+
"bc1p93svdel208e2wva9gmnqsm3hd5p0k768a9pyg0ptd7r4lzl0sxvqeaw5gv",
29+
}
30+
31+
for _, a := range adds {
32+
33+
addr, err := sdk.AccAddressFromBech32(a)
34+
assert.NoError(t, err, "invalid address "+a)
35+
if strings.HasPrefix(a, "side") {
36+
assert.Equal(t, 20, len(addr.Bytes()), a)
37+
} else if strings.HasPrefix(a, "bc1q") {
38+
assert.Equal(t, 33, len(addr.Bytes()), a)
39+
} else {
40+
assert.Equal(t, 53, len(addr.Bytes()), a)
41+
}
42+
43+
text_addr := addr.String()
44+
assert.EqualValues(t, a, text_addr, "address should equals")
45+
46+
}
47+
48+
}
49+
50+
func TestGenKeys(t *testing.T) {
51+
52+
conf := sdk.GetConfig()
53+
conf.SetBech32PrefixForAccount("side", "side")
54+
conf.Seal()
55+
56+
// hash := btcutil.Hash160([]byte{0, 3, 3, 3, 3, 3})
57+
hash := make([]byte, 32, 32)
58+
assert.Equal(t, 32, len(hash))
59+
60+
// sh, err := btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.MainNetParams)
61+
// assert.NoError(t, err)
62+
std, err := btcutil.NewAddressTaproot(hash, &chaincfg.MainNetParams)
63+
assert.NoError(t, err)
64+
assert.Equal(t, 32, len(std.AddressSegWit.ScriptAddress()))
65+
// 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+
}
91+
}
92+
93+
func TestValAddressEncodeDecode(t *testing.T) {
94+
95+
conf := sdk.GetConfig()
96+
conf.SetBech32PrefixForAccount("side", "side")
97+
conf.SetBech32PrefixForValidator("sidevaloper", "sidevaloper")
98+
conf.Seal()
99+
100+
vals := []string{
101+
// "sidevaloper1qqwpwrc0qs0pvrc6rvrsxrc2p583vqstpgdqxxsmzgp3y9gfpvqp7srxm9c", // error case
102+
// "sidevaloper1qqgsc9gfrqfsyrgtp5wpjqgkqct3cqq4rq8pj9cspcgszzqtzv2ssmdxyv7",
103+
"sidevaloper1pfakusycd3aful428aqm6ljclu36vk6rzxqvu72g9e7jzaukswgnqd7xhsc",
104+
"sidevaloper1p8990duvf0d23jelthdl2qgwfrrylny5zul0awymk7j45cjtm52eqqq7yxc",
105+
"sidevaloper1qfwqngtkrmlytqkqsd54k9t4htufp0hw9sndewh",
106+
}
107+
108+
for _, a := range vals {
109+
110+
addr, err := sdk.ValAddressFromBech32(a)
111+
assert.NoError(t, err, "invalid address "+a)
112+
if strings.HasPrefix(a, "sidevaloper1p") {
113+
assert.Equal(t, 53, len(addr))
114+
} else {
115+
assert.Equal(t, 33, len(addr))
116+
}
117+
118+
text_addr := addr.String()
119+
assert.EqualValues(t, a, text_addr, "address should equals")
120+
121+
}
122+
123+
}

bitcoin/algo.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package bitcoin
2+
3+
import (
4+
"strings"
5+
6+
"github.com/cosmos/go-bip39"
7+
8+
"github.com/cosmos/cosmos-sdk/crypto/hd"
9+
"github.com/cosmos/cosmos-sdk/crypto/types"
10+
"github.com/sideprotocol/side/crypto/keys/segwit"
11+
"github.com/sideprotocol/side/crypto/keys/taproot"
12+
)
13+
14+
const (
15+
SegWitType = hd.PubKeyType("segwit")
16+
TaprootType = hd.PubKeyType("taproot")
17+
)
18+
19+
var SegWit = segWigAlgo{}
20+
var Taproot = taprootAlgo{}
21+
22+
type segWigAlgo struct{}
23+
24+
func (s segWigAlgo) Name() hd.PubKeyType {
25+
return SegWitType
26+
}
27+
28+
// Derive derives and returns the secp256k1 private key for the given seed and HD path.
29+
func (s segWigAlgo) Derive() hd.DeriveFn {
30+
return func(mnemonic string, bip39Passphrase, hdPath string) ([]byte, error) {
31+
if !strings.HasPrefix(hdPath, "m/84'") {
32+
sps := strings.Split(hdPath, "/")
33+
sps[1] = "84'" // replace purpose
34+
sps[2] = "0'"
35+
hdPath = strings.Join(sps, "/")
36+
}
37+
println("hdPath", hdPath)
38+
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, bip39Passphrase)
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
masterPriv, ch := hd.ComputeMastersFromSeed(seed)
44+
if len(hdPath) == 0 {
45+
return masterPriv[:], nil
46+
}
47+
derivedKey, err := hd.DerivePrivateKeyForPath(masterPriv, ch, hdPath)
48+
49+
return derivedKey, err
50+
}
51+
}
52+
53+
// Generate generates a secp256k1 private key from the given bytes.
54+
func (s segWigAlgo) Generate() hd.GenerateFn {
55+
return func(bz []byte) types.PrivKey {
56+
bzArr := make([]byte, segwit.PrivKeySize)
57+
copy(bzArr, bz)
58+
59+
return &segwit.PrivKey{Key: bzArr}
60+
}
61+
}
62+
63+
type taprootAlgo struct{}
64+
65+
func (s taprootAlgo) Name() hd.PubKeyType {
66+
return TaprootType
67+
}
68+
69+
// Derive derives and returns the secp256k1 private key for the given seed and HD path.
70+
func (s taprootAlgo) Derive() hd.DeriveFn {
71+
return func(mnemonic string, bip39Passphrase, hdPath string) ([]byte, error) {
72+
if !strings.HasPrefix(hdPath, "m/86'") {
73+
sps := strings.Split(hdPath, "/")
74+
sps[1] = "86'" // replace purpose
75+
sps[2] = "0'"
76+
hdPath = strings.Join(sps, "/")
77+
// panic("Invalid HD path for Taproot")
78+
}
79+
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, bip39Passphrase)
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
masterPriv, ch := hd.ComputeMastersFromSeed(seed)
85+
if len(hdPath) == 0 {
86+
return masterPriv[:], nil
87+
}
88+
derivedKey, err := hd.DerivePrivateKeyForPath(masterPriv, ch, hdPath)
89+
90+
return derivedKey, err
91+
}
92+
}
93+
94+
// Generate generates a secp256k1 private key from the given bytes.
95+
func (s taprootAlgo) Generate() hd.GenerateFn {
96+
return func(bz []byte) types.PrivKey {
97+
bzArr := make([]byte, taproot.PrivKeySize)
98+
copy(bzArr, bz)
99+
100+
return &taproot.PrivKey{Key: bzArr}
101+
}
102+
}

0 commit comments

Comments
 (0)