Skip to content

Commit

Permalink
fix(rollapp): validate rollapp token metadata (dymensionxyz#471)
Browse files Browse the repository at this point in the history
  • Loading branch information
VictorTrustyDev authored Feb 21, 2024
1 parent 248650a commit 4168eb0
Show file tree
Hide file tree
Showing 9 changed files with 399 additions and 6 deletions.
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

Check failure on line 40 in CHANGELOG.md

View workflow job for this annotation

GitHub Actions / markdownlint

Heading levels should only increment by one level at a time [Expected: h3; Actual: h4]

- (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")
}

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

0 comments on commit 4168eb0

Please sign in to comment.