From fc1f29aaf82e30e0b05d091c13fbdece2e54f675 Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar Date: Thu, 16 Dec 2021 20:22:09 +0530 Subject: [PATCH] added support for btc taproot addresses Signed-off-by: Soumya Ghosh Dastidar --- chain/bitcoin/address.go | 19 ++++++++++++++++++- chain/ethereum/gas.go | 2 +- go.mod | 4 ++-- go.sum | 6 ++++++ infra/bitcoin/Dockerfile | 4 ++-- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/chain/bitcoin/address.go b/chain/bitcoin/address.go index 1bed45c4..84a477dc 100644 --- a/chain/bitcoin/address.go +++ b/chain/bitcoin/address.go @@ -3,6 +3,8 @@ package bitcoin import ( "fmt" + "github.com/renproject/surge" + "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil/base58" @@ -67,7 +69,19 @@ func (encoder AddressEncoder) encodeBech32(rawAddr address.RawAddress) (address. } return address.Address(addr.EncodeAddress()), nil case 33: - addr, err := btcutil.NewAddressWitnessScriptHash(rawAddr[1:], encoder.params) + rawAddrBytes, err := surge.ToBinary(rawAddr) + if err != nil { + return address.Address(""), fmt.Errorf("failed to convert raw address to bytes: %v", err) + } + var ( + addr btcutil.Address + ) + if rawAddrBytes[0] == 1 { + addr, err = btcutil.NewAddressTaproot(rawAddr[1:], encoder.params) + + } else { + addr, err = btcutil.NewAddressWitnessScriptHash(rawAddr[1:], encoder.params) + } if err != nil { return address.Address(""), fmt.Errorf("new address witness script hash: %v", err) } @@ -112,6 +126,9 @@ func (decoder AddressDecoder) DecodeAddress(addr address.Address) (address.RawAd case *btcutil.AddressWitnessScriptHash: rawAddr := append([]byte{a.WitnessVersion()}, a.WitnessProgram()...) return address.RawAddress(rawAddr), nil + case *btcutil.AddressTaproot: + rawAddr := append([]byte{a.WitnessVersion()}, a.WitnessProgram()...) + return address.RawAddress(rawAddr), nil default: return nil, fmt.Errorf("non-exhaustive pattern: address %T", a) } diff --git a/chain/ethereum/gas.go b/chain/ethereum/gas.go index 917b6afe..914a9dc3 100644 --- a/chain/ethereum/gas.go +++ b/chain/ethereum/gas.go @@ -29,7 +29,7 @@ var ( ) type feeHistoryResult struct { - Reward [][]string `json:"reward"` + Reward [][]string `json:"reward"` } // GasOptions allow a user to configure the parameters used while heuristically recommending diff --git a/go.mod b/go.mod index 4a64a33c..2721eda1 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/btcsuite/btcd v0.22.0-beta - github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce + github.com/btcsuite/btcutil v1.0.3-0.20211129182920-9c4bbabe7acd github.com/cosmos/cosmos-sdk v0.44.0 github.com/dchest/blake2b v1.0.0 github.com/ethereum/go-ethereum v1.10.6 @@ -26,7 +26,7 @@ require ( github.com/terra-money/core v0.5.5 github.com/tyler-smith/go-bip39 v1.1.0 go.uber.org/zap v1.17.0 - golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 + golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 ) replace github.com/filecoin-project/filecoin-ffi => ./chain/filecoin/filecoin-ffi diff --git a/go.sum b/go.sum index e305270a..d4e7f907 100644 --- a/go.sum +++ b/go.sum @@ -190,6 +190,8 @@ github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+q github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/btcsuite/btcutil v1.0.3-0.20211129182920-9c4bbabe7acd h1:vAwk2PCYxzUUGAXXtw66PyY2IMCwWBnm8GR5aLIxS3Q= +github.com/btcsuite/btcutil v1.0.3-0.20211129182920-9c4bbabe7acd/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= 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= @@ -2075,6 +2077,8 @@ golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2190,6 +2194,7 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2320,6 +2325,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/infra/bitcoin/Dockerfile b/infra/bitcoin/Dockerfile index 927a354a..0a42eda7 100644 --- a/infra/bitcoin/Dockerfile +++ b/infra/bitcoin/Dockerfile @@ -6,8 +6,8 @@ RUN apt-get install --yes curl # bitcoind PPA is unmaintained, so we download it from the bitcoincore website. # This can sometimes stall, which can be fixed by killing and restarting the # build. -RUN curl https://bitcoincore.org/bin/bitcoin-core-0.21.0/bitcoin-0.21.0-x86_64-linux-gnu.tar.gz | tar -xz -RUN mv ./bitcoin-0.21.0 /app +RUN curl https://bitcoincore.org/bin/bitcoin-core-22.0/bitcoin-22.0-x86_64-linux-gnu.tar.gz | tar -xz +RUN mv ./bitcoin-22.0 /app RUN chmod +x /app/bin/bitcoind RUN chmod +x /app/bin/bitcoin-cli