diff --git a/client-sdk/go/config/default.go b/client-sdk/go/config/default.go index eb0789460c..d3e1267096 100644 --- a/client-sdk/go/config/default.go +++ b/client-sdk/go/config/default.go @@ -25,6 +25,7 @@ var DefaultNetworks = Networks{ Decimals: 9, }, }, + ConsensusDenomination: NativeDenominationKey, }, // Emerald on Mainnet. @@ -36,6 +37,7 @@ var DefaultNetworks = Networks{ Decimals: 18, }, }, + ConsensusDenomination: NativeDenominationKey, }, // Sapphire on Mainnet. @@ -47,6 +49,7 @@ var DefaultNetworks = Networks{ Decimals: 18, }, }, + ConsensusDenomination: NativeDenominationKey, }, }, }, @@ -72,6 +75,7 @@ var DefaultNetworks = Networks{ Decimals: 9, }, }, + ConsensusDenomination: NativeDenominationKey, }, // Emerald on Testnet. @@ -83,6 +87,7 @@ var DefaultNetworks = Networks{ Decimals: 18, }, }, + ConsensusDenomination: NativeDenominationKey, }, // Sapphire on Testnet. @@ -94,6 +99,7 @@ var DefaultNetworks = Networks{ Decimals: 18, }, }, + ConsensusDenomination: NativeDenominationKey, }, // Pontus-X on Testnet. @@ -111,6 +117,7 @@ var DefaultNetworks = Networks{ Decimals: 18, }, }, + ConsensusDenomination: "TEST", }, }, }, diff --git a/client-sdk/go/config/paratime.go b/client-sdk/go/config/paratime.go index a0d089107e..792d2c3cc8 100644 --- a/client-sdk/go/config/paratime.go +++ b/client-sdk/go/config/paratime.go @@ -109,12 +109,16 @@ func (p *ParaTimes) SetDefault(name string) error { return nil } -// ParaTime contains the configuration parameters of a network. +// ParaTime contains the configuration parameters of a ParaTime. type ParaTime struct { Description string `mapstructure:"description"` ID string `mapstructure:"id"` + // Denominations is a map of denominations supported by the ParaTime. Denominations map[string]*DenominationInfo `mapstructure:"denominations,omitempty"` + // ConsensusDenomination is the denomination that represents the consensus layer denomination. + // If empty, it means that the ParaTime does not support consensus layer transfers. + ConsensusDenomination string `mapstructure:"consensus_denomination,omitempty"` } // Validate performs config validation. @@ -134,6 +138,13 @@ func (p *ParaTime) Validate() error { } } + if p.ConsensusDenomination != "" { + _, exists := p.Denominations[p.ConsensusDenomination] + if !exists { + return fmt.Errorf("invalid consensus denomination '%s'", p.ConsensusDenomination) + } + } + return nil } @@ -153,14 +164,17 @@ func (p *ParaTime) Namespace() common.Namespace { // // In case the given denomination does not exist, it provides sane defaults. func (p *ParaTime) GetDenominationInfo(d string) *DenominationInfo { - var di *DenominationInfo - if len(d) == 0 { - di = p.Denominations[NativeDenominationKey] - } else if di = p.Denominations[d]; di == nil { - di = p.Denominations[strings.ToLower(d)] + var ( + di *DenominationInfo + ok bool + ) + if d == "" { + d = NativeDenominationKey + } + if di, ok = p.Denominations[d]; ok { + return di } - - if di != nil { + if di, ok = p.Denominations[strings.ToLower(d)]; ok { return di } diff --git a/client-sdk/go/config/paratime_test.go b/client-sdk/go/config/paratime_test.go new file mode 100644 index 0000000000..a3e6466b15 --- /dev/null +++ b/client-sdk/go/config/paratime_test.go @@ -0,0 +1,90 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValidateParaTime(t *testing.T) { + require := require.New(t) + + p := ParaTime{ + Description: "Test ParaTime.", + ID: "000000000000000000000000000000000000000000000000f80306c9858e7279", + Denominations: map[string]*DenominationInfo{ + NativeDenominationKey: { + Symbol: "FOO", + Decimals: 18, + }, + "BAR": { + Symbol: "BARfoo", + Decimals: 9, + }, + }, + } + err := p.Validate() + require.NoError(err, "Validate should succeed with valid configuration") + + p.ConsensusDenomination = NativeDenominationKey + err = p.Validate() + require.NoError(err, "Validate should succeed with valid consensus denomination") + p.ConsensusDenomination = "BAR" + err = p.Validate() + require.NoError(err, "Validate should succeed with valid consensus denomination") + + invalid := p + invalid.ID = "invalid" + err = invalid.Validate() + require.Error(err, "Validate should fail with invalid ID") + + invalid = p + invalid.ConsensusDenomination = "invalid" + err = invalid.Validate() + require.Error(err, "Validate should fail with invalid consensus denomination") +} + +func TestDenominationInfo(t *testing.T) { + require := require.New(t) + + p := ParaTime{ + Description: "Test ParaTime.", + ID: "000000000000000000000000000000000000000000000000f80306c9858e7279", + Denominations: map[string]*DenominationInfo{ + NativeDenominationKey: { + Symbol: "FOO", + Decimals: 18, + }, + "BAR": { + Symbol: "BARfoo", + Decimals: 9, + }, + "low": { + Symbol: "LOWfoo", + Decimals: 9, + }, + }, + } + err := p.Validate() + require.NoError(err, "Validate should succeed with valid configuration") + + di := p.GetDenominationInfo("") + require.NotNil(di, "GetDenominationInfo should return a non-nil denomination info") + require.Equal(di.Symbol, "FOO") + require.EqualValues(di.Decimals, 18) + + di = p.GetDenominationInfo("BAR") + require.NotNil(di, "GetDenominationInfo should return a non-nil denomination info") + require.Equal(di.Symbol, "BARfoo") + require.EqualValues(di.Decimals, 9) + + di = p.GetDenominationInfo("LOW") + require.NotNil(di, "GetDenominationInfo should return a non-nil denomination info") + require.Equal(di.Symbol, "LOWfoo") + require.EqualValues(di.Decimals, 9) + + di = p.GetDenominationInfo("DEFAULT") + require.NotNil(di, "GetDenominationInfo should return a non-nil denomination info") + require.Equal(di.Symbol, "DEFAULT") + require.EqualValues(di.Decimals, 9) +}