Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(rollapp): validate rollapp token metadata #471

7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ Ref: https://keepachangelog.com/en/1.0.0/

# Changelog

## Unreleased

#### Bug Fixes

- (rollapp) [#471](https://github.com/dymensionxyz/dymension/issues/471) Validate rollapp token metadata
___

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
Expand Down
3 changes: 2 additions & 1 deletion ibctesting/denom_metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,5 +93,6 @@ func (suite *DenomMetaDataTestSuite) TestDenomRegistationRollappToHub() {

metadata, found := ConvertToApp(suite.hubChain).BankKeeper.GetDenomMetaData(suite.hubChain.GetContext(), stakeVoucherDenom.IBCDenom())
suite.Require().True(found)
suite.Require().Equal("STAKE", metadata.Display)
suite.Equal("bigstake", metadata.Display)
suite.Equal("BIGSTAKE", metadata.Symbol)
}
9 changes: 5 additions & 4 deletions ibctesting/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func (suite *IBCTestUtilSuite) CreateRollapp() {
}

func (suite *IBCTestUtilSuite) CreateRollappWithMetadata(denom string) {
displayDenom := "big" + denom
msgCreateRollapp := rollapptypes.NewMsgCreateRollapp(
suite.hubChain.SenderAccount.GetAddress().String(),
suite.rollappChain.ChainID,
Expand All @@ -80,14 +81,14 @@ func (suite *IBCTestUtilSuite) CreateRollappWithMetadata(denom string) {
Exponent: 0,
},
{
Denom: "big" + denom,
Denom: displayDenom,
Exponent: 6,
},
},
Description: "stake as rollapp token",
Display: strings.ToUpper(denom),
Name: strings.ToUpper(denom),
Symbol: strings.ToUpper(denom),
Display: displayDenom,
Name: displayDenom,
Symbol: strings.ToUpper(displayDenom),
},
},
)
Expand Down
3 changes: 2 additions & 1 deletion x/rollapp/keeper/msg_server_create_rollapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func (k msgServer) CreateRollapp(goCtx context.Context, msg *types.MsgCreateRoll
PermissionedAddresses: msg.PermissionedAddresses,
}

//copy Tokenmetadata
//copy TokenMetadata
rollapp.TokenMetadata = make([]*types.TokenMetadata, len(msg.Metadatas))
for i := range msg.Metadatas {
rollapp.TokenMetadata[i] = &msg.Metadatas[i]
Expand All @@ -70,6 +70,7 @@ func (k msgServer) CreateRollapp(goCtx context.Context, msg *types.MsgCreateRoll
if len(msg.Metadatas) == 0 {
ctx.Logger().Info("No token metadata provided")
}

// Write rollapp information to the store
k.SetRollapp(ctx, rollapp)

Expand Down
1 change: 1 addition & 0 deletions x/rollapp/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ var (
ErrInvalidRollappID = sdkerrors.Register(ModuleName, 1020, "invalid rollapp-id")
ErrEIP155Exists = sdkerrors.Register(ModuleName, 1021, "EIP155 already exist; must use unique EIP155 identifier")
ErrRollappsDisabled = sdkerrors.Register(ModuleName, 1022, "rollapps are disabled")
ErrInvalidTokenMetadata = sdkerrors.Register(ModuleName, 1023, "invalid token metadata")
)
9 changes: 9 additions & 0 deletions x/rollapp/types/message_create_rollapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,14 @@ func (msg *MsgCreateRollapp) ValidateBasic() error {
}
}

// verifies that token metadata, if any, must be valid
if len(msg.GetMetadatas()) > 0 {
for _, metadata := range msg.GetMetadatas() {
if err := metadata.Validate(); err != nil {
return sdkerrors.Wrapf(ErrInvalidTokenMetadata, "%s: %v", metadata.Base, err)
}
}
}

return nil
}
36 changes: 36 additions & 0 deletions x/rollapp/types/message_create_rollapp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,42 @@ func TestMsgCreateRollapp_ValidateBasic(t *testing.T) {
PermissionedAddresses: []string{seqDupAddr, "invalid permissioned address"},
},
err: ErrInvalidPermissionedAddress,
}, {
name: "valid token metadata",
msg: MsgCreateRollapp{
Creator: sample.AccAddress(),
MaxSequencers: 1,
Metadatas: []TokenMetadata{{
Description: "valid",
DenomUnits: []*DenomUnit{
{Denom: "uvalid", Exponent: 0},
{Denom: "valid", Exponent: 18},
},
Base: "uvalid",
Display: "valid",
Name: "valid",
Symbol: "VALID",
}},
},
err: nil,
}, {
name: "invalid token metadata", // just trigger one case to see if validation is done or not
msg: MsgCreateRollapp{
Creator: sample.AccAddress(),
MaxSequencers: 1,
Metadatas: []TokenMetadata{{
Description: "valid",
DenomUnits: []*DenomUnit{
{Denom: "uvalid", Exponent: 0},
{Denom: "valid", Exponent: 18},
},
Base: "uvalid",
Display: "valid",
Name: "", // empty
Symbol: "VALID",
}},
},
err: ErrInvalidTokenMetadata,
},
}
for _, tt := range tests {
Expand Down
41 changes: 41 additions & 0 deletions x/rollapp/types/token_metadata.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package types

import (
"fmt"

Check failure on line 4 in x/rollapp/types/token_metadata.go

View workflow job for this annotation

GitHub Actions / golangci-lint

File is not `goimports`-ed (goimports)
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
)

// Validate performs a basic validation of the coin metadata fields.
// Inherits from x/bank metadata and following same spec of x/bank/types/metadata.go
func (m *TokenMetadata) Validate() error {
if m == nil {
return fmt.Errorf("token metadata cannot be nil")
}

Check warning on line 13 in x/rollapp/types/token_metadata.go

View check run for this annotation

Codecov / codecov/patch

x/rollapp/types/token_metadata.go#L12-L13

Added lines #L12 - L13 were not covered by tests

bankMetadata := m.ConvertToBankMetadata()
return bankMetadata.Validate()
}

// ConvertToBankMetadata converts TokenMetadata to Metadata of x/bank/types
func (m *TokenMetadata) ConvertToBankMetadata() banktypes.Metadata {
var denomUnits []*banktypes.DenomUnit

for _, denomUnit := range m.DenomUnits {
denomUnits = append(denomUnits, &banktypes.DenomUnit{
Denom: denomUnit.Denom,
Exponent: denomUnit.Exponent,
Aliases: denomUnit.Aliases,
})
}

return banktypes.Metadata{
Description: m.Description,
DenomUnits: denomUnits,
Base: m.Base,
Display: m.Display,
Name: m.Name,
Symbol: m.Symbol,
URI: m.URI,
URIHash: m.URIHash,
}
}
Loading
Loading