Skip to content

Commit 4afa6c7

Browse files
committed
fix taproot address generation
1 parent d4c40bf commit 4afa6c7

File tree

3 files changed

+54
-18
lines changed

3 files changed

+54
-18
lines changed

go.mod

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/sideprotocol/side
22

3-
go 1.22
3+
go 1.22.2
44

55
toolchain go1.22.3
66

@@ -18,6 +18,7 @@ require (
1818
github.com/btcsuite/btcd/btcutil/psbt v1.1.9
1919
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
2020
github.com/bufbuild/buf v1.34.0
21+
github.com/bytemare/hash2curve v0.3.1-0.20241029002722-6917d1f78dda
2122
github.com/cometbft/cometbft v0.38.11
2223
github.com/cosmos/btcutil v1.0.5
2324
github.com/cosmos/cosmos-db v1.0.2
@@ -61,6 +62,7 @@ require (
6162
github.com/bufbuild/protoplugin v0.0.0-20240323223605-e2735f6c31ee // indirect
6263
github.com/bufbuild/protovalidate-go v0.6.2 // indirect
6364
github.com/bufbuild/protoyaml-go v0.1.9 // indirect
65+
github.com/bytemare/hash v0.4.0 // indirect
6466
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
6567
github.com/cockroachdb/pebble v1.1.1 // indirect
6668
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
@@ -133,7 +135,7 @@ require (
133135
cosmossdk.io/x/feegrant v0.1.1
134136
cosmossdk.io/x/tx v0.13.5
135137
cosmossdk.io/x/upgrade v0.1.4
136-
filippo.io/edwards25519 v1.0.0 // indirect
138+
filippo.io/edwards25519 v1.1.0 // indirect
137139
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
138140
github.com/99designs/keyring v1.2.1 // indirect
139141
github.com/aead/siphash v1.0.1 // indirect
@@ -248,14 +250,14 @@ require (
248250
go.opentelemetry.io/otel v1.31.0 // indirect
249251
go.opentelemetry.io/otel/metric v1.31.0 // indirect
250252
go.opentelemetry.io/otel/trace v1.31.0 // indirect
251-
golang.org/x/crypto v0.26.0 // indirect
253+
golang.org/x/crypto v0.28.0 // indirect
252254
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect
253255
golang.org/x/net v0.28.0 // indirect
254256
golang.org/x/oauth2 v0.21.0 // indirect
255257
golang.org/x/sync v0.8.0 // indirect
256258
golang.org/x/sys v0.26.0 // indirect
257-
golang.org/x/term v0.23.0 // indirect
258-
golang.org/x/text v0.17.0 // indirect
259+
golang.org/x/term v0.25.0 // indirect
260+
golang.org/x/text v0.19.0 // indirect
259261
google.golang.org/api v0.171.0 // indirect
260262
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
261263
google.golang.org/genproto/googleapis/rpc v0.0.0-20240709173604-40e1e62336c5 // indirect

go.sum

+12-8
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@ cosmossdk.io/x/tx v0.13.5/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w=
225225
cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38=
226226
cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo=
227227
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
228-
filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek=
229-
filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
228+
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
229+
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
230230
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
231231
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
232232
github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o=
@@ -334,6 +334,10 @@ github.com/bufbuild/protoyaml-go v0.1.9/go.mod h1:KCBItkvZOK/zwGueLdH1Wx1RLyFn5r
334334
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
335335
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
336336
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
337+
github.com/bytemare/hash v0.4.0 h1:1eqsPEe4J7m7xAaf32+2RKdxZslUSaJT7pezLbLOusg=
338+
github.com/bytemare/hash v0.4.0/go.mod h1:5iEyBKNz+gBzvj7ermjXTrXz64fQUHVc2WjisGTk4Xk=
339+
github.com/bytemare/hash2curve v0.3.1-0.20241029002722-6917d1f78dda h1:kMhrVX5K6usVsOPkbKNo/9D7DOYltOmhlEgdYFzG1Ug=
340+
github.com/bytemare/hash2curve v0.3.1-0.20241029002722-6917d1f78dda/go.mod h1:nCMz//0hZY4/JPmG6mdNkzI9UPa6NjiWunlaO+ANrTs=
337341
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
338342
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
339343
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
@@ -1256,8 +1260,8 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh
12561260
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
12571261
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
12581262
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
1259-
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
1260-
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
1263+
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
1264+
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
12611265
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
12621266
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
12631267
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1518,8 +1522,8 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
15181522
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
15191523
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
15201524
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
1521-
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
1522-
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
1525+
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
1526+
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
15231527
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
15241528
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
15251529
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1534,8 +1538,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
15341538
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
15351539
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
15361540
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
1537-
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
1538-
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
1541+
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
1542+
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
15391543
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
15401544
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
15411545
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

x/lending/types/taproot.go

+35-5
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,34 @@ package types
33
import (
44
"encoding/hex"
55

6-
sdk "github.com/cosmos/cosmos-sdk/types"
6+
h2c "github.com/bytemare/hash2curve/secp256k1"
77

8+
"github.com/btcsuite/btcd/btcec/v2"
89
"github.com/btcsuite/btcd/btcutil"
910
"github.com/btcsuite/btcd/chaincfg"
1011
"github.com/btcsuite/btcd/txscript"
12+
13+
sdk "github.com/cosmos/cosmos-sdk/types"
14+
15+
"github.com/sideprotocol/side/crypto/adaptor"
16+
"github.com/sideprotocol/side/crypto/hash"
17+
"github.com/sideprotocol/side/x/dlc/types"
1118
)
1219

20+
// HashLoanSecret hashes the given secret
21+
// Assume that the secret is a valid hex string
1322
func HashLoanSecret(secret string) string {
14-
// Todo later
15-
return secret
23+
secretBytes, _ := hex.DecodeString(secret)
24+
25+
return hex.EncodeToString(hash.Sha256(secretBytes))
1626
}
1727

28+
// AdaptorPoint gets the corresponding adaptor point from the given secret
29+
// Assume that the secret is a valid hex string
1830
func AdaptorPoint(secret string) string {
19-
return secret
31+
secretBytes, _ := hex.DecodeString(secret)
32+
33+
return hex.EncodeToString(adaptor.SecretToPubKey(secretBytes))
2034
}
2135

2236
func GetTaprootAddress(script []byte) (*btcutil.AddressTaproot, error) {
@@ -103,8 +117,9 @@ func createTaprootAddress(branches [][]byte, params *chaincfg.Params) (string, e
103117
if err != nil {
104118
return "", err
105119
}
120+
106121
// Derive Taproot output key
107-
taprootPubKey := txscript.ComputeTaprootOutputKey(nil, scriptRoot)
122+
taprootPubKey := txscript.ComputeTaprootOutputKey(GetInternalKey(), scriptRoot)
108123
// Generate Taproot address
109124
address, err := btcutil.NewAddressTaproot(taprootPubKey.SerializeCompressed(), params)
110125
if err != nil {
@@ -138,3 +153,18 @@ func CreateVaultAddress(borrowerPubkey string, dcaPubkey string, loanSecretHash
138153
}
139154
return taprootAddress, nil
140155
}
156+
157+
// GetInternalKey gets the pub key used for taproot address generation
158+
// Generated by hashToCurve("lending") for now
159+
func GetInternalKey() *btcec.PublicKey {
160+
input := types.ModuleName
161+
domain := "side.lending.vault"
162+
163+
p := h2c.HashToCurve([]byte(input), []byte(domain))
164+
165+
var X, Y btcec.FieldVal
166+
X.SetByteSlice(p.X.Bytes())
167+
Y.SetByteSlice(p.Y.Bytes())
168+
169+
return btcec.NewPublicKey(&X, &Y)
170+
}

0 commit comments

Comments
 (0)