Skip to content

Commit 78c2acd

Browse files
authored
fix bug with address during compilation (#168)
1 parent f99c836 commit 78c2acd

File tree

5 files changed

+76
-19
lines changed

5 files changed

+76
-19
lines changed

helpers/types/address.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package types
2+
3+
import (
4+
"encoding/hex"
5+
"fmt"
6+
7+
sdk "github.com/cosmos/cosmos-sdk/types"
8+
)
9+
10+
// Parse string address representation (both libra hex and bech32).
11+
func GetAccAddressFromHexOrBech32(strAddr string) (address sdk.AccAddress, err error) {
12+
address, err = hex.DecodeString(strAddr)
13+
if err != nil {
14+
address, err = sdk.AccAddressFromBech32(strAddr)
15+
if err != nil {
16+
err = fmt.Errorf("can't parse address %q (should be libra hex or bech32): %v", strAddr, err)
17+
}
18+
}
19+
20+
return
21+
}

helpers/types/address_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// +build unit
2+
3+
package types
4+
5+
import (
6+
"encoding/hex"
7+
"testing"
8+
9+
sdk "github.com/cosmos/cosmos-sdk/types"
10+
"github.com/stretchr/testify/require"
11+
"github.com/tendermint/tendermint/crypto/secp256k1"
12+
)
13+
14+
func Test_GetAccAddressFromHexOrBech32(t *testing.T) {
15+
bech32 := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address())
16+
17+
addr, err := GetAccAddressFromHexOrBech32(bech32.String())
18+
require.NoError(t, err)
19+
20+
require.Truef(t, bech32.Equals(addr), "bech32 addresses doesn't match", bech32, addr)
21+
22+
libraAddr := hex.EncodeToString(bech32)
23+
24+
addr, err = GetAccAddressFromHexOrBech32(libraAddr)
25+
require.NoError(t, err)
26+
27+
require.Truef(t, addr.Equals(bech32), "libra hex addresses doesn't match", libraAddr, addr)
28+
}

helpers/types/str_filters_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// +build unit
2+
13
package types
24

35
import (

x/vm/client/cli/queries.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/dfinance/dvm-proto/go/vm_grpc"
1919

2020
"github.com/dfinance/dnode/cmd/config"
21+
addrHelper "github.com/dfinance/dnode/helpers/types"
2122
"github.com/dfinance/dnode/x/common_vm"
2223
vmClient "github.com/dfinance/dnode/x/vm/client"
2324
"github.com/dfinance/dnode/x/vm/internal/types"
@@ -99,12 +100,9 @@ func GetData(queryRoute string, cdc *codec.Codec) *cobra.Command {
99100
// extract data
100101
rawAddress := args[0]
101102
var address sdk.AccAddress
102-
address, err := hex.DecodeString(rawAddress)
103+
address, err := addrHelper.GetAccAddressFromHexOrBech32(rawAddress)
103104
if err != nil {
104-
address, err = sdk.AccAddressFromBech32(rawAddress)
105-
if err != nil {
106-
return fmt.Errorf("can't parse address: %s\n, check address format, it could be libra hex or bech32", rawAddress)
107-
}
105+
return fmt.Errorf("error parsing address: %v", err)
108106
}
109107

110108
path, err := hex.DecodeString(args[1])

x/vm/client/rest/rest.go

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import (
77
"strings"
88

99
"github.com/cosmos/cosmos-sdk/client/context"
10-
sdk "github.com/cosmos/cosmos-sdk/types"
1110
"github.com/cosmos/cosmos-sdk/types/rest"
1211
"github.com/cosmos/cosmos-sdk/x/auth/client/utils"
1312
"github.com/dfinance/dvm-proto/go/vm_grpc"
1413
"github.com/gorilla/mux"
1514
"github.com/spf13/viper"
1615

16+
addrHelper "github.com/dfinance/dnode/helpers/types"
1717
"github.com/dfinance/dnode/x/common_vm"
1818
vmClient "github.com/dfinance/dnode/x/vm/client"
1919
"github.com/dfinance/dnode/x/vm/internal/types"
@@ -36,6 +36,7 @@ func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router) {
3636
r.HandleFunc(fmt.Sprintf("/%s/data/{%s}/{%s}", types.ModuleName, accountAddrName, vmPathName), getData(cliCtx)).Methods("GET")
3737
r.HandleFunc(fmt.Sprintf("/%s/tx/{%s}", types.ModuleName, txHash), getTxVMStatus(cliCtx)).Methods("GET")
3838
}
39+
3940
// Compile godoc
4041
// @Tags vm
4142
// @Summary Get compiled byteCode
@@ -57,9 +58,20 @@ func compile(cliCtx context.CLIContext) http.HandlerFunc {
5758
}
5859

5960
compilerAddr := viper.GetString(vmClient.FlagCompilerAddr)
61+
62+
address, err := addrHelper.GetAccAddressFromHexOrBech32(req.Account)
63+
if err != nil {
64+
rest.WriteErrorResponse(
65+
w,
66+
http.StatusUnprocessableEntity,
67+
fmt.Sprintf("error parsing address: %v", err),
68+
)
69+
return
70+
}
71+
6072
sourceFile := &vm_grpc.SourceFile{
6173
Text: req.Code,
62-
Address: []byte(req.Account),
74+
Address: common_vm.Bech32ToLibra(address),
6375
}
6476

6577
byteCode, err := vmClient.Compile(compilerAddr, sourceFile)
@@ -82,7 +94,7 @@ func compile(cliCtx context.CLIContext) http.HandlerFunc {
8294
// @ID vmGetData
8395
// @Accept json
8496
// @Produce json
85-
// @Param accountAddr path string true "account address (Libra HEX Bech32)"
97+
// @Param accountAddr path string true "account address (Libra HEX / Bech32)"
8698
// @Param vmPath path string true "VM path (HEX string)"
8799
// @Success 200 {object} VmData
88100
// @Failure 422 {object} rest.ErrorResponse "Returned if the request doesn't have valid path params"
@@ -94,18 +106,14 @@ func getData(cliCtx context.CLIContext) http.HandlerFunc {
94106
rawAddress := vars[accountAddrName]
95107
rawPath := vars[vmPathName]
96108

97-
var address sdk.AccAddress
98-
address, err := hex.DecodeString(rawAddress)
109+
address, err := addrHelper.GetAccAddressFromHexOrBech32(rawAddress)
99110
if err != nil {
100-
address, err = sdk.AccAddressFromBech32(rawAddress)
101-
if err != nil {
102-
rest.WriteErrorResponse(
103-
w,
104-
http.StatusUnprocessableEntity,
105-
fmt.Sprintf("can't parse address %q (should be libra hex or bech32): %v", rawAddress, err),
106-
)
107-
return
108-
}
111+
rest.WriteErrorResponse(
112+
w,
113+
http.StatusUnprocessableEntity,
114+
fmt.Sprintf("address parsing error: %v", err),
115+
)
116+
return
109117
}
110118

111119
path, err := hex.DecodeString(rawPath)

0 commit comments

Comments
 (0)