bank: name and symbol metadata fields (#8677)

* bank: name and symbol metadata fields

* cli test

* changelog
This commit is contained in:
Federico Kunze 2021-02-24 20:06:04 -03:00 committed by GitHub
parent 77668a3c23
commit 149bed48fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 243 additions and 38 deletions

View File

@ -61,6 +61,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Improvements
* (x/bank) [\#8614](https://github.com/cosmos/cosmos-sdk/issues/8614) Add `Name` and `Symbol` fields to denom metadata
* (x/auth) [\#8522](https://github.com/cosmos/cosmos-sdk/pull/8522) Allow to query all stored accounts
* (crypto/types) [\#8600](https://github.com/cosmos/cosmos-sdk/pull/8600) `CompactBitArray`: optimize the `NumTrueBitsBefore` method and add an `Equal` method.

View File

@ -1711,6 +1711,8 @@ a basic token.
| `denom_units` | [DenomUnit](#cosmos.bank.v1beta1.DenomUnit) | repeated | denom_units represents the list of DenomUnit's for a given coin |
| `base` | [string](#string) | | base represents the base denom (should be the DenomUnit with exponent = 0). |
| `display` | [string](#string) | | display indicates the suggested denom that should be displayed in clients. |
| `name` | [string](#string) | | name defines the name of the token (eg: Cosmos Atom) |
| `symbol` | [string](#string) | | symbol is the token symbol usually shown on exchanges (eg: ATOM). This can be the same as the display. |

View File

@ -82,4 +82,9 @@ message Metadata {
// display indicates the suggested denom that should be
// displayed in clients.
string display = 4;
// name defines the name of the token (eg: Cosmos Atom)
string name = 5;
// symbol is the token symbol usually shown on exchanges (eg: ATOM). This can
// be the same as the display.
string symbol = 6;
}

View File

@ -40,6 +40,8 @@ func (s *IntegrationTestSuite) SetupSuite() {
bankGenesis.DenomMetadata = []types.Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{
@ -57,6 +59,8 @@ func (s *IntegrationTestSuite) SetupSuite() {
Display: "atom",
},
{
Name: "Ethereum",
Symbol: "ETH",
Description: "Ethereum mainnet token",
DenomUnits: []*types.DenomUnit{
{
@ -246,6 +250,8 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDenomsMetadata() {
expected: &types.QueryDenomsMetadataResponse{
Metadatas: []types.Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{
@ -263,6 +269,8 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDenomsMetadata() {
Display: "atom",
},
{
Name: "Ethereum",
Symbol: "ETH",
Description: "Ethereum mainnet token",
DenomUnits: []*types.DenomUnit{
{
@ -293,6 +301,8 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDenomsMetadata() {
respType: &types.QueryDenomMetadataResponse{},
expected: &types.QueryDenomMetadataResponse{
Metadata: types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{

View File

@ -121,6 +121,8 @@ func (s *IntegrationTestSuite) TestDenomMetadataGRPCHandler() {
&types.QueryDenomsMetadataResponse{
Metadatas: []types.Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{
@ -151,6 +153,8 @@ func (s *IntegrationTestSuite) TestDenomMetadataGRPCHandler() {
&types.QueryDenomMetadataResponse{},
&types.QueryDenomMetadataResponse{
Metadata: types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{

View File

@ -33,6 +33,8 @@ func (s *IntegrationTestSuite) SetupSuite() {
bankGenesis.DenomMetadata = []types.Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{

View File

@ -1004,6 +1004,8 @@ func (suite *IntegrationTestSuite) TestIterateAllDenomMetaData() {
func (suite *IntegrationTestSuite) getTestMetadata() []types.Metadata {
return []types.Metadata{{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -1014,6 +1016,8 @@ func (suite *IntegrationTestSuite) getTestMetadata() []types.Metadata {
Display: "atom",
},
{
Name: "Token",
Symbol: "TOKEN",
Description: "The native staking token of the Token Hub.",
DenomUnits: []*types.DenomUnit{
{"1token", uint32(5), []string{"decitoken"}},

View File

@ -327,6 +327,11 @@ type Metadata struct {
// display indicates the suggested denom that should be
// displayed in clients.
Display string `protobuf:"bytes,4,opt,name=display,proto3" json:"display,omitempty"`
// name defines the name of the token (eg: Cosmos Atom)
Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
// symbol is the token symbol usually shown on exchanges (eg: ATOM). This can
// be the same as the display.
Symbol string `protobuf:"bytes,6,opt,name=symbol,proto3" json:"symbol,omitempty"`
}
func (m *Metadata) Reset() { *m = Metadata{} }
@ -390,6 +395,20 @@ func (m *Metadata) GetDisplay() string {
return ""
}
func (m *Metadata) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Metadata) GetSymbol() string {
if m != nil {
return m.Symbol
}
return ""
}
func init() {
proto.RegisterType((*Params)(nil), "cosmos.bank.v1beta1.Params")
proto.RegisterType((*SendEnabled)(nil), "cosmos.bank.v1beta1.SendEnabled")
@ -403,43 +422,44 @@ func init() {
func init() { proto.RegisterFile("cosmos/bank/v1beta1/bank.proto", fileDescriptor_dd052eee12edf988) }
var fileDescriptor_dd052eee12edf988 = []byte{
// 566 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbf, 0x6f, 0x13, 0x31,
0x14, 0x3e, 0x37, 0x4d, 0x48, 0x1d, 0x58, 0x4c, 0x86, 0x6b, 0x24, 0xee, 0x8e, 0x93, 0x90, 0x52,
0x44, 0x2f, 0x14, 0xc4, 0x92, 0x05, 0x29, 0xa5, 0x42, 0x1d, 0x10, 0xe8, 0x2a, 0x84, 0x04, 0x43,
0xe4, 0xc4, 0x6e, 0xb0, 0x7a, 0x67, 0x9f, 0x62, 0x1f, 0x6a, 0xfe, 0x03, 0x26, 0x60, 0x44, 0x62,
0xe9, 0xcc, 0x88, 0xf8, 0x23, 0x3a, 0x56, 0xb0, 0x30, 0x05, 0x94, 0x2c, 0xcc, 0xfd, 0x0b, 0x90,
0xed, 0xcb, 0x8f, 0x4a, 0x01, 0x31, 0x30, 0x30, 0x9d, 0x9f, 0xdf, 0xf7, 0xbe, 0xf7, 0xe9, 0x7b,
0xcf, 0x07, 0xbd, 0xbe, 0x90, 0xa9, 0x90, 0xad, 0x1e, 0xe6, 0x47, 0xad, 0x57, 0x3b, 0x3d, 0xaa,
0xf0, 0x8e, 0x09, 0xa2, 0x6c, 0x28, 0x94, 0x40, 0x57, 0x6d, 0x3e, 0x32, 0x57, 0x45, 0xbe, 0x51,
0x1f, 0x88, 0x81, 0x30, 0xf9, 0x96, 0x3e, 0x59, 0x68, 0x63, 0xd3, 0x42, 0xbb, 0x36, 0x51, 0xd4,
0xd9, 0xd4, 0xa2, 0x8b, 0xa4, 0xf3, 0x2e, 0x7d, 0xc1, 0xb8, 0xcd, 0x87, 0x5f, 0x01, 0xac, 0x3c,
0xc1, 0x43, 0x9c, 0x4a, 0x74, 0x08, 0x2f, 0x4b, 0xca, 0x49, 0x97, 0x72, 0xdc, 0x4b, 0x28, 0x71,
0x41, 0x50, 0x6a, 0xd6, 0xee, 0x04, 0xd1, 0x0a, 0x1d, 0xd1, 0x01, 0xe5, 0x64, 0xcf, 0xe2, 0x3a,
0xd7, 0xcf, 0xc7, 0xfe, 0xb5, 0x11, 0x4e, 0x93, 0x76, 0xb8, 0x5c, 0x7f, 0x4b, 0xa4, 0x4c, 0xd1,
0x34, 0x53, 0xa3, 0x30, 0xae, 0xc9, 0x05, 0x1e, 0xbd, 0x80, 0x75, 0x42, 0x0f, 0x71, 0x9e, 0xa8,
0xee, 0x85, 0x7e, 0x6b, 0x01, 0x68, 0x56, 0x3b, 0x5b, 0xe7, 0x63, 0xff, 0x86, 0x65, 0x5b, 0x85,
0x5a, 0x66, 0x45, 0x05, 0x60, 0x49, 0x4c, 0x7b, 0xfd, 0xfd, 0x89, 0xef, 0x84, 0x0f, 0x61, 0x6d,
0xe9, 0x12, 0xd5, 0x61, 0x99, 0x50, 0x2e, 0x52, 0x17, 0x04, 0xa0, 0xb9, 0x11, 0xdb, 0x00, 0xb9,
0xf0, 0xd2, 0x85, 0xd6, 0xf1, 0x2c, 0x6c, 0x57, 0x35, 0xc9, 0xcf, 0x13, 0x1f, 0x84, 0x6f, 0x00,
0x2c, 0xef, 0xf3, 0x2c, 0x57, 0x1a, 0x8d, 0x09, 0x19, 0x52, 0x29, 0x0b, 0x96, 0x59, 0x88, 0x30,
0x2c, 0x6b, 0x43, 0xa5, 0xbb, 0x66, 0x0c, 0xdb, 0x5c, 0x18, 0x26, 0xe9, 0xdc, 0xb0, 0x5d, 0xc1,
0x78, 0xe7, 0xf6, 0xe9, 0xd8, 0x77, 0x3e, 0x7e, 0xf7, 0x9b, 0x03, 0xa6, 0x5e, 0xe6, 0xbd, 0xa8,
0x2f, 0xd2, 0x62, 0x5a, 0xc5, 0x67, 0x5b, 0x92, 0xa3, 0x96, 0x1a, 0x65, 0x54, 0x9a, 0x02, 0x19,
0x5b, 0xe6, 0x76, 0xf5, 0xb5, 0x15, 0xe4, 0x84, 0x6f, 0x01, 0xac, 0x3c, 0xce, 0xd5, 0x7f, 0xa4,
0xe8, 0x13, 0x80, 0x95, 0x83, 0x3c, 0xcb, 0x92, 0x91, 0xee, 0xab, 0x84, 0xc2, 0x49, 0xb1, 0x3a,
0xff, 0xb6, 0xaf, 0x61, 0x6e, 0xef, 0xe9, 0xbe, 0xb3, 0xf1, 0x7c, 0xf9, 0xbc, 0x7d, 0xef, 0xe6,
0x1f, 0x19, 0x8e, 0xed, 0xf3, 0xa2, 0xc7, 0x99, 0x18, 0x2a, 0x4a, 0x22, 0x2b, 0x74, 0x3f, 0x7c,
0x06, 0x37, 0x1e, 0xe8, 0x25, 0x78, 0xca, 0x99, 0xfa, 0xcd, 0x7a, 0x34, 0x60, 0x55, 0x97, 0x71,
0xca, 0x95, 0xd9, 0x8f, 0x2b, 0xf1, 0x3c, 0x36, 0xd6, 0x27, 0x0c, 0x4b, 0x2a, 0xdd, 0x52, 0x50,
0x32, 0xd6, 0xdb, 0x30, 0xfc, 0x00, 0x60, 0xf5, 0x11, 0x55, 0x98, 0x60, 0x85, 0x51, 0x00, 0x6b,
0x84, 0xca, 0xfe, 0x90, 0x65, 0x8a, 0x09, 0x5e, 0xd0, 0x2f, 0x5f, 0xa1, 0xfb, 0x1a, 0xc1, 0x45,
0xda, 0xcd, 0x39, 0x53, 0xb3, 0x79, 0x79, 0x2b, 0x9f, 0xdc, 0x5c, 0x6f, 0x0c, 0xc9, 0xec, 0x28,
0x11, 0x82, 0xeb, 0xda, 0x5d, 0xb7, 0x64, 0xb8, 0xcd, 0x59, 0xab, 0x23, 0x4c, 0x66, 0x09, 0x1e,
0xb9, 0xeb, 0x76, 0x31, 0x8a, 0xb0, 0xb3, 0x7b, 0x3a, 0xf1, 0xc0, 0xd9, 0xc4, 0x03, 0x3f, 0x26,
0x1e, 0x78, 0x37, 0xf5, 0x9c, 0xb3, 0xa9, 0xe7, 0x7c, 0x9b, 0x7a, 0xce, 0xf3, 0xad, 0xbf, 0xb1,
0xd1, 0xcc, 0xa3, 0x57, 0x31, 0x7f, 0x8e, 0xbb, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x72,
0xf6, 0xc6, 0xc1, 0x04, 0x00, 0x00,
// 588 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbf, 0x6f, 0xd3, 0x4e,
0x14, 0xf7, 0x35, 0x8d, 0xbf, 0xe9, 0xe5, 0xcb, 0x72, 0x54, 0xc8, 0xad, 0x84, 0x6d, 0x2c, 0x21,
0xa5, 0x88, 0x3a, 0x14, 0xc4, 0x92, 0x05, 0x29, 0xa5, 0x42, 0x1d, 0x10, 0xc8, 0x15, 0x42, 0x82,
0x21, 0x3a, 0xe7, 0xae, 0xc1, 0xaa, 0x7d, 0x67, 0xe5, 0xce, 0xa8, 0xfe, 0x0f, 0x98, 0x80, 0x91,
0xb1, 0x33, 0x23, 0xe2, 0x7f, 0xa0, 0x63, 0x05, 0x0b, 0x53, 0x40, 0xc9, 0xc2, 0xdc, 0xbf, 0x00,
0xdd, 0x9d, 0xf3, 0xa3, 0x52, 0x40, 0x0c, 0x0c, 0x4c, 0xb9, 0xcf, 0x7b, 0x9f, 0xf7, 0x79, 0x4f,
0x9f, 0xf7, 0x1c, 0xe8, 0xf6, 0xb9, 0xc8, 0xb8, 0x68, 0xc7, 0x98, 0x1d, 0xb5, 0x5f, 0xee, 0xc4,
0x54, 0xe2, 0x1d, 0x0d, 0xc2, 0x7c, 0xc8, 0x25, 0x47, 0x97, 0x4d, 0x3e, 0xd4, 0xa1, 0x2a, 0xbf,
0xb9, 0x3e, 0xe0, 0x03, 0xae, 0xf3, 0x6d, 0xf5, 0x32, 0xd4, 0xcd, 0x0d, 0x43, 0xed, 0x99, 0x44,
0x55, 0x67, 0x52, 0xf3, 0x2e, 0x82, 0xce, 0xba, 0xf4, 0x79, 0xc2, 0x4c, 0x3e, 0xf8, 0x02, 0xa0,
0xfd, 0x18, 0x0f, 0x71, 0x26, 0xd0, 0x21, 0xfc, 0x5f, 0x50, 0x46, 0x7a, 0x94, 0xe1, 0x38, 0xa5,
0xc4, 0x01, 0x7e, 0xad, 0xd5, 0xbc, 0xed, 0x87, 0x4b, 0xe6, 0x08, 0x0f, 0x28, 0x23, 0x7b, 0x86,
0xd7, 0xbd, 0x76, 0x3e, 0xf2, 0xae, 0x96, 0x38, 0x4b, 0x3b, 0xc1, 0x62, 0xfd, 0x4d, 0x9e, 0x25,
0x92, 0x66, 0xb9, 0x2c, 0x83, 0xa8, 0x29, 0xe6, 0x7c, 0xf4, 0x1c, 0xae, 0x13, 0x7a, 0x88, 0x8b,
0x54, 0xf6, 0x2e, 0xf4, 0x5b, 0xf1, 0x41, 0xab, 0xd1, 0xdd, 0x3a, 0x1f, 0x79, 0xd7, 0x8d, 0xda,
0x32, 0xd6, 0xa2, 0x2a, 0xaa, 0x08, 0x0b, 0xc3, 0x74, 0x56, 0xdf, 0x9d, 0x78, 0x56, 0xf0, 0x00,
0x36, 0x17, 0x82, 0x68, 0x1d, 0xd6, 0x09, 0x65, 0x3c, 0x73, 0x80, 0x0f, 0x5a, 0x6b, 0x91, 0x01,
0xc8, 0x81, 0xff, 0x5d, 0x68, 0x1d, 0x4d, 0x61, 0xa7, 0xa1, 0x44, 0x7e, 0x9c, 0x78, 0x20, 0x78,
0x0d, 0x60, 0x7d, 0x9f, 0xe5, 0x85, 0x54, 0x6c, 0x4c, 0xc8, 0x90, 0x0a, 0x51, 0xa9, 0x4c, 0x21,
0xc2, 0xb0, 0xae, 0x0c, 0x15, 0xce, 0x8a, 0x36, 0x6c, 0x63, 0x6e, 0x98, 0xa0, 0x33, 0xc3, 0x76,
0x79, 0xc2, 0xba, 0xb7, 0x4e, 0x47, 0x9e, 0xf5, 0xfe, 0x9b, 0xd7, 0x1a, 0x24, 0xf2, 0x45, 0x11,
0x87, 0x7d, 0x9e, 0x55, 0xdb, 0xaa, 0x7e, 0xb6, 0x05, 0x39, 0x6a, 0xcb, 0x32, 0xa7, 0x42, 0x17,
0x88, 0xc8, 0x28, 0x77, 0x1a, 0xaf, 0xcc, 0x40, 0x56, 0xf0, 0x06, 0x40, 0xfb, 0x51, 0x21, 0xff,
0xa1, 0x89, 0x3e, 0x00, 0x68, 0x1f, 0x14, 0x79, 0x9e, 0x96, 0xaa, 0xaf, 0xe4, 0x12, 0xa7, 0xd5,
0xe9, 0xfc, 0xdd, 0xbe, 0x5a, 0xb9, 0xb3, 0xa7, 0xfa, 0x4e, 0xd7, 0xf3, 0xf9, 0xe3, 0xf6, 0xdd,
0x1b, 0xbf, 0x55, 0x38, 0x36, 0x9f, 0x17, 0x3d, 0xce, 0xf9, 0x50, 0x52, 0x12, 0x9a, 0x41, 0xf7,
0x83, 0xa7, 0x70, 0xed, 0xbe, 0x3a, 0x82, 0x27, 0x2c, 0x91, 0xbf, 0x38, 0x8f, 0x4d, 0xd8, 0x50,
0x65, 0x8c, 0x32, 0xa9, 0xef, 0xe3, 0x52, 0x34, 0xc3, 0xda, 0xfa, 0x34, 0xc1, 0x82, 0x0a, 0xa7,
0xe6, 0xd7, 0xb4, 0xf5, 0x06, 0x06, 0x9f, 0x00, 0x6c, 0x3c, 0xa4, 0x12, 0x13, 0x2c, 0x31, 0xf2,
0x61, 0x93, 0x50, 0xd1, 0x1f, 0x26, 0xb9, 0x4c, 0x38, 0xab, 0xe4, 0x17, 0x43, 0xe8, 0x9e, 0x62,
0x30, 0x9e, 0xf5, 0x0a, 0x96, 0xc8, 0xe9, 0xbe, 0xdc, 0xa5, 0x9f, 0xdc, 0x6c, 0xde, 0x08, 0x92,
0xe9, 0x53, 0x20, 0x04, 0x57, 0x95, 0xbb, 0x4e, 0x4d, 0x6b, 0xeb, 0xb7, 0x9a, 0x8e, 0x24, 0x22,
0x4f, 0x71, 0xe9, 0xac, 0x9a, 0xc3, 0xa8, 0xa0, 0x62, 0x33, 0x9c, 0x51, 0xa7, 0x6e, 0xd8, 0xea,
0x8d, 0xae, 0x40, 0x5b, 0x94, 0x59, 0xcc, 0x53, 0xc7, 0xd6, 0xd1, 0x0a, 0x75, 0x77, 0x4f, 0xc7,
0x2e, 0x38, 0x1b, 0xbb, 0xe0, 0xfb, 0xd8, 0x05, 0x6f, 0x27, 0xae, 0x75, 0x36, 0x71, 0xad, 0xaf,
0x13, 0xd7, 0x7a, 0xb6, 0xf5, 0x27, 0x96, 0xeb, 0xdd, 0xc5, 0xb6, 0xfe, 0x97, 0xb9, 0xf3, 0x33,
0x00, 0x00, 0xff, 0xff, 0xa8, 0xf5, 0xda, 0x82, 0xed, 0x04, 0x00, 0x00,
}
func (this *SendEnabled) Equal(that interface{}) bool {
@ -774,6 +794,20 @@ func (m *Metadata) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Symbol) > 0 {
i -= len(m.Symbol)
copy(dAtA[i:], m.Symbol)
i = encodeVarintBank(dAtA, i, uint64(len(m.Symbol)))
i--
dAtA[i] = 0x32
}
if len(m.Name) > 0 {
i -= len(m.Name)
copy(dAtA[i:], m.Name)
i = encodeVarintBank(dAtA, i, uint64(len(m.Name)))
i--
dAtA[i] = 0x2a
}
if len(m.Display) > 0 {
i -= len(m.Display)
copy(dAtA[i:], m.Display)
@ -956,6 +990,14 @@ func (m *Metadata) Size() (n int) {
if l > 0 {
n += 1 + l + sovBank(uint64(l))
}
l = len(m.Name)
if l > 0 {
n += 1 + l + sovBank(uint64(l))
}
l = len(m.Symbol)
if l > 0 {
n += 1 + l + sovBank(uint64(l))
}
return n
}
@ -1779,6 +1821,70 @@ func (m *Metadata) Unmarshal(dAtA []byte) error {
}
m.Display = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBank
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthBank
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthBank
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Name = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Symbol", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBank
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthBank
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthBank
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Symbol = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipBank(dAtA[iNdEx:])

View File

@ -28,6 +28,8 @@ func TestGenesisStateValidate(t *testing.T) {
Supply: sdk.Coins{sdk.NewInt64Coin("uatom", 1)},
DenomMetadata: []Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -85,6 +87,8 @@ func TestGenesisStateValidate(t *testing.T) {
GenesisState{
DenomMetadata: []Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -95,6 +99,8 @@ func TestGenesisStateValidate(t *testing.T) {
Display: "atom",
},
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -113,6 +119,8 @@ func TestGenesisStateValidate(t *testing.T) {
GenesisState{
DenomMetadata: []Metadata{
{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},

View File

@ -9,12 +9,21 @@ import (
)
// Validate performs a basic validation of the coin metadata fields. It checks:
// - Name and Symbol are not blank
// - Base and Display denominations are valid coin denominations
// - Base and Display denominations are present in the DenomUnit slice
// - Base denomination has exponent 0
// - Denomination units are sorted in ascending order
// - Denomination units not duplicated
func (m Metadata) Validate() error {
if strings.TrimSpace(m.Name) == "" {
return errors.New("name field cannot be blank")
}
if strings.TrimSpace(m.Symbol) == "" {
return errors.New("symbol field cannot be blank")
}
if err := sdk.ValidateDenom(m.Base); err != nil {
return fmt.Errorf("invalid metadata base denom: %w", err)
}

View File

@ -18,6 +18,8 @@ func TestMetadataValidate(t *testing.T) {
{
"non-empty coins",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -32,6 +34,8 @@ func TestMetadataValidate(t *testing.T) {
{
"base coin is display coin",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"atom", uint32(0), []string{"ATOM"}},
@ -42,16 +46,35 @@ func TestMetadataValidate(t *testing.T) {
false,
},
{"empty metadata", types.Metadata{}, true},
{
"blank name",
types.Metadata{
Name: "",
},
true,
},
{
"blank symbol",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "",
},
true,
},
{
"invalid base denom",
types.Metadata{
Base: "",
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Base: "",
},
true,
},
{
"invalid display denom",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Base: "uatom",
Display: "",
},
@ -60,6 +83,8 @@ func TestMetadataValidate(t *testing.T) {
{
"duplicate denom unit",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -73,6 +98,8 @@ func TestMetadataValidate(t *testing.T) {
{
"invalid denom unit",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"", uint32(0), []string{"microatom"}},
@ -85,6 +112,8 @@ func TestMetadataValidate(t *testing.T) {
{
"invalid denom unit alias",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{""}},
@ -97,6 +126,8 @@ func TestMetadataValidate(t *testing.T) {
{
"duplicate denom unit alias",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom", "microatom"}},
@ -109,6 +140,8 @@ func TestMetadataValidate(t *testing.T) {
{
"no base denom unit",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"matom", uint32(3), []string{"milliatom"}},
@ -122,6 +155,8 @@ func TestMetadataValidate(t *testing.T) {
{
"base denom exponent not zero",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(1), []string{"microatom"}},
@ -133,9 +168,26 @@ func TestMetadataValidate(t *testing.T) {
},
true,
},
{
"invalid denom unit",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
{"", uint32(3), []string{"milliatom"}},
},
Base: "uatom",
Display: "uatom",
},
true,
},
{
"no display denom unit",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},
@ -148,6 +200,8 @@ func TestMetadataValidate(t *testing.T) {
{
"denom units not sorted",
types.Metadata{
Name: "Cosmos Hub Atom",
Symbol: "ATOM",
Description: "The native staking token of the Cosmos Hub.",
DenomUnits: []*types.DenomUnit{
{"uatom", uint32(0), []string{"microatom"}},