Skip to content

Commit

Permalink
chore: adding sdk.Msg impl for ics27 MsgRegisterAccount (#2081)
Browse files Browse the repository at this point in the history
* adding new controller msg service, register account types, register interfaces and boilerplate

* fixing typo

* fixing protodoc and regenerate godocs

* adding channel id to MsgRegisterAccountResponse

* adding sdk.Msg impl for MsgRegisterAccount

* formatting imports

* adding additional tests with multiple versions, creating TestAccAddress const
  • Loading branch information
damiannolan authored Aug 24, 2022
1 parent 0fa2978 commit 94d0840
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 2 deletions.
26 changes: 25 additions & 1 deletion modules/apps/27-interchain-accounts/controller/types/msgs.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package types

import (
"strings"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"

host "github.com/cosmos/ibc-go/v5/modules/core/24-host"
)

var _ sdk.Msg = &MsgRegisterAccount{}

// NewMsgRegisterAccount creates a new instance of MsgRegisterAccount
func NewMsgRegisterAccount(connectionID, owner, version string) *MsgRegisterAccount {
return &MsgRegisterAccount{
Expand All @@ -15,10 +22,27 @@ func NewMsgRegisterAccount(connectionID, owner, version string) *MsgRegisterAcco

// ValidateBasic implements sdk.Msg
func (msg MsgRegisterAccount) ValidateBasic() error {
if err := host.ConnectionIdentifierValidator(msg.ConnectionId); err != nil {
return sdkerrors.Wrap(err, "invalid connection ID")
}

if strings.TrimSpace(msg.Owner) == "" {
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "owner address cannot be empty")
}

if _, err := sdk.AccAddressFromBech32(msg.Owner); err != nil {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "failed to parse owner address: %s", msg.Owner)
}

return nil
}

// GetSigners implements sdk.Msg
func (msg MsgRegisterAccount) GetSigners() []sdk.AccAddress {
return []sdk.AccAddress{}
accAddr, err := sdk.AccAddressFromBech32(msg.Owner)
if err != nil {
panic(err)
}

return []sdk.AccAddress{accAddr}
}
96 changes: 96 additions & 0 deletions modules/apps/27-interchain-accounts/controller/types/msgs_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package types_test

import (
"testing"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"

"github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/controller/types"
icatypes "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/types"
feetypes "github.com/cosmos/ibc-go/v5/modules/apps/29-fee/types"
ibctesting "github.com/cosmos/ibc-go/v5/testing"
)

func TestMsgRegisterAccountValidateBasic(t *testing.T) {
var msg *types.MsgRegisterAccount

testCases := []struct {
name string
malleate func()
expPass bool
}{
{
"success",
func() {},
true,
},
{
"success: with empty channel version",
func() {
msg.Version = ""
},
true,
},
{
"success: with fee enabled channel version",
func() {
feeMetadata := feetypes.Metadata{
FeeVersion: feetypes.Version,
AppVersion: icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID),
}

bz := feetypes.ModuleCdc.MustMarshalJSON(&feeMetadata)
msg.Version = string(bz)
},
true,
},
{
"connection id is invalid",
func() {
msg.ConnectionId = ""
},
false,
},
{
"owner address is empty",
func() {
msg.Owner = ""
},
false,
},
{
"owner address is invalid",
func() {
msg.Owner = "invalid_address"
},
false,
},
}

for i, tc := range testCases {

msg = types.NewMsgRegisterAccount(
ibctesting.FirstConnectionID,
ibctesting.TestAccAddress,
icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID),
)

tc.malleate()

err := msg.ValidateBasic()
if tc.expPass {
require.NoError(t, err, "valid test case %d failed: %s", i, tc.name)
} else {
require.Error(t, err, "invalid test case %d passed: %s", i, tc.name)
}
}
}

func TestMsgRegisterAccountGetSigners(t *testing.T) {
expSigner, err := sdk.AccAddressFromBech32(ibctesting.TestAccAddress)
require.NoError(t, err)

msg := types.NewMsgRegisterAccount(ibctesting.FirstConnectionID, ibctesting.TestAccAddress, "")
require.Equal(t, []sdk.AccAddress{expSigner}, msg.GetSigners())
}
4 changes: 3 additions & 1 deletion testing/values.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ var (

// DefaultTrustLevel sets params variables used to create a TM client
DefaultTrustLevel = ibctm.DefaultTrustLevel
TestCoin = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))

TestAccAddress = "cosmos17dtl0mjt3t77kpuhg2edqzjpszulwhgzuj9ljs"
TestCoin = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))

UpgradePath = []string{"upgrade", "upgradedIBCState"}

Expand Down

0 comments on commit 94d0840

Please sign in to comment.