From 516194cbf7a0fe4cc356ad9d8c6a1566c562c420 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 16 Jan 2025 07:34:57 +0100 Subject: [PATCH 1/2] feat: expose chain-registry structs (#4472) * feat: expose chain-registry structs * updates * split * structure * updates * lint (cherry picked from commit ec26e2eec80d4f88b2c40335ab1d1cb6ad286124) # Conflicts: # ignite/services/scaffolder/chain_registry.go --- ignite/pkg/chainregistry/asset.go | 52 +++++ ignite/pkg/chainregistry/chain.go | 98 +++++++++ ignite/pkg/chainregistry/consts.go | 50 +++++ ignite/pkg/chainregistry/doc.go | 3 + ignite/services/scaffolder/chain_registry.go | 217 +++---------------- 5 files changed, 237 insertions(+), 183 deletions(-) create mode 100644 ignite/pkg/chainregistry/asset.go create mode 100644 ignite/pkg/chainregistry/chain.go create mode 100644 ignite/pkg/chainregistry/consts.go create mode 100644 ignite/pkg/chainregistry/doc.go diff --git a/ignite/pkg/chainregistry/asset.go b/ignite/pkg/chainregistry/asset.go new file mode 100644 index 0000000000..5ec491322d --- /dev/null +++ b/ignite/pkg/chainregistry/asset.go @@ -0,0 +1,52 @@ +package chainregistry + +import ( + "encoding/json" + "os" +) + +// AssetList represents the assetlist.json file from the chain registry. +// https://raw.githubusercontent.com/cosmos/chain-registry/master/assetlist.schema.json +// https://github.com/cosmos/chain-registry?tab=readme-ov-file#assetlists +type AssetList struct { + ChainName string `json:"chain_name"` + Assets []Asset `json:"assets"` +} + +type Asset struct { + Description string `json:"description"` + DenomUnits []DenomUnit `json:"denom_units"` + Base string `json:"base"` + Name string `json:"name"` + Display string `json:"display"` + Symbol string `json:"symbol"` + LogoURIs LogoURIs `json:"logo_URIs"` + CoingeckoID string `json:"coingecko_id,omitempty"` + Socials Socials `json:"socials,omitempty"` + TypeAsset string `json:"type_asset"` +} + +type DenomUnit struct { + Denom string `json:"denom"` + Exponent int `json:"exponent"` +} + +type LogoURIs struct { + Png string `json:"png"` + Svg string `json:"svg"` +} + +type Socials struct { + Website string `json:"website"` + Twitter string `json:"twitter"` +} + +// SaveJSON saves the assetlist.json to the given out directory. +func (c AssetList) SaveJSON(out string) error { + bz, err := json.MarshalIndent(c, "", " ") + if err != nil { + return err + } + + return os.WriteFile(out, bz, 0o600) +} diff --git a/ignite/pkg/chainregistry/chain.go b/ignite/pkg/chainregistry/chain.go new file mode 100644 index 0000000000..1ea64de095 --- /dev/null +++ b/ignite/pkg/chainregistry/chain.go @@ -0,0 +1,98 @@ +package chainregistry + +import ( + "encoding/json" + "os" +) + +// Chain represents the chain.json file from the chain registry. +// https://raw.githubusercontent.com/cosmos/chain-registry/master/chain.schema.json +type Chain struct { + ChainName string `json:"chain_name"` + Status ChainStatus `json:"status"` + NetworkType NetworkType `json:"network_type"` + Website string `json:"website"` + PrettyName string `json:"pretty_name"` + ChainType ChainType `json:"chain_type"` + ChainID string `json:"chain_id"` + Bech32Prefix string `json:"bech32_prefix"` + DaemonName string `json:"daemon_name"` + NodeHome string `json:"node_home"` + KeyAlgos []KeyAlgos `json:"key_algos"` + Slip44 int `json:"slip44"` + Fees Fees `json:"fees"` + Staking Staking `json:"staking"` + Codebase Codebase `json:"codebase"` + Description string `json:"description"` + APIs APIs `json:"apis"` +} + +type Staking struct { + StakingTokens []StakingToken `json:"staking_tokens"` +} + +type StakingToken struct { + Denom string `json:"denom"` +} + +type Codebase struct { + GitRepo string `json:"git_repo"` + Genesis CodebaseGenesis `json:"genesis"` + RecommendedVersion string `json:"recommended_version"` + CompatibleVersions []string `json:"compatible_versions"` + Consensus CodebaseInfo `json:"consensus"` + Sdk CodebaseInfo `json:"sdk"` + Ibc CodebaseInfo `json:"ibc,omitempty"` + Cosmwasm CodebaseInfoEnabled `json:"cosmwasm,omitempty"` +} + +type CodebaseGenesis struct { + GenesisURL string `json:"genesis_url"` +} + +type CodebaseInfo struct { + Type string `json:"type"` + Version string `json:"version"` + Repo string `json:"repo,omitempty"` + Tag string `json:"tag,omitempty"` +} + +type CodebaseInfoEnabled struct { + Version string `json:"version,omitempty"` + Repo string `json:"repo,omitempty"` + Tag string `json:"tag,omitempty"` + Enabled bool `json:"enabled"` +} + +type Fees struct { + FeeTokens []FeeToken `json:"fee_tokens"` +} + +type FeeToken struct { + Denom string `json:"denom"` + FixedMinGasPrice float64 `json:"fixed_min_gas_price"` + LowGasPrice float64 `json:"low_gas_price"` + AverageGasPrice float64 `json:"average_gas_price"` + HighGasPrice float64 `json:"high_gas_price"` +} + +type APIs struct { + RPC []APIProvider `json:"rpc"` + Rest []APIProvider `json:"rest"` + Grpc []APIProvider `json:"grpc"` +} + +type APIProvider struct { + Address string `json:"address"` + Provider string `json:"provider"` +} + +// SaveJSON saves the chainJSON to the given out directory. +func (c Chain) SaveJSON(out string) error { + bz, err := json.MarshalIndent(c, "", " ") + if err != nil { + return err + } + + return os.WriteFile(out, bz, 0o600) +} diff --git a/ignite/pkg/chainregistry/consts.go b/ignite/pkg/chainregistry/consts.go new file mode 100644 index 0000000000..3f10b59e0b --- /dev/null +++ b/ignite/pkg/chainregistry/consts.go @@ -0,0 +1,50 @@ +package chainregistry + +type NetworkType string + +const ( + // NetworkTypeMainnet is the mainnet network type. + NetworkTypeMainnet NetworkType = "mainnet" + + // NetworkTypeTestnet is the testnet network type. + NetworkTypeTestnet NetworkType = "testnet" + + // NetworkTypeDevnet is the devnet network type. + NetworkTypeDevnet NetworkType = "devnet" +) + +type ChainType string + +const ( + // ChainTypeCosmos is the cosmos chain type. + ChainTypeCosmos ChainType = "cosmos" + + // ChainTypeEip155 is the eip155 chain type. + ChainTypeEip155 ChainType = "eip155" +) + +type ChainStatus string + +const ( + // ChainStatusActive is the live chain status. + ChainStatusActive ChainStatus = "live" + + // ChainStatusUpcoming is the upcoming chain status. + ChainStatusUpcoming ChainStatus = "upcoming" + + // ChainStatusKilled is the inactive chain status. + ChainStatusKilled ChainStatus = "killed" +) + +type KeyAlgos string + +const ( + // KeyAlgoSecp256k1 is the secp256k1 key algorithm. + KeyAlgoSecp256k1 KeyAlgos = "secp256k1" + + // KeyAlgosEthSecp256k1 is the secp256k1 key algorithm with ethereum compatibility. + KeyAlgosEthSecp256k1 KeyAlgos = "ethsecp256k1" + + // KeyAlgoEd25519 is the ed25519 key algorithm. + KeyAlgoEd25519 KeyAlgos = "ed25519" +) diff --git a/ignite/pkg/chainregistry/doc.go b/ignite/pkg/chainregistry/doc.go new file mode 100644 index 0000000000..d6d2df8e44 --- /dev/null +++ b/ignite/pkg/chainregistry/doc.go @@ -0,0 +1,3 @@ +// package chainregistry is a package that contains the chain.json and assetlist.json structs from the chain registry. +// Useful when parsing or creating chain.json and assetlist.json files. +package chainregistry diff --git a/ignite/services/scaffolder/chain_registry.go b/ignite/services/scaffolder/chain_registry.go index 98e0b7251e..5021b6d379 100644 --- a/ignite/services/scaffolder/chain_registry.go +++ b/ignite/services/scaffolder/chain_registry.go @@ -2,7 +2,6 @@ package scaffolder import ( "bufio" - "encoding/json" "fmt" "os" "path/filepath" @@ -10,173 +9,25 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" +<<<<<<< HEAD chainconfig "github.com/ignite/cli/v28/ignite/config/chain" "github.com/ignite/cli/v28/ignite/pkg/errors" "github.com/ignite/cli/v28/ignite/pkg/xgit" "github.com/ignite/cli/v28/ignite/services/chain" +======= + chainconfig "github.com/ignite/cli/v29/ignite/config/chain" + "github.com/ignite/cli/v29/ignite/pkg/chainregistry" + "github.com/ignite/cli/v29/ignite/pkg/errors" + "github.com/ignite/cli/v29/ignite/pkg/xgit" + "github.com/ignite/cli/v29/ignite/services/chain" +>>>>>>> ec26e2ee (feat: expose chain-registry structs (#4472)) ) const ( - // DefaultChainType is the default chain type for the chain.json - // More value are allowed by the chain registry schema, but Ignite only scaffolds Cosmos chains. - DefaultChainType = "cosmos" - - // DefaultChainStatus is the default chain status for the chain.json - // More value are allowed by the chain registry schema, but Ignite only scaffolds upcoming chains. - DefaultChainStatus = "upcoming" - - // DefaultNetworkType is the default network type for the chain.json - // More value are allowed by the chain registry schema, but Ignite only scaffolds devnet chains. - DefaultNetworkType = "devnet" - chainFilename = "chain.json" assetListFilename = "assetlist.json" ) -// https://raw.githubusercontent.com/cosmos/chain-registry/master/chain.schema.json -type chainJSON struct { - ChainName string `json:"chain_name"` - Status string `json:"status"` - NetworkType string `json:"network_type"` - Website string `json:"website"` - PrettyName string `json:"pretty_name"` - ChainType string `json:"chain_type"` - ChainID string `json:"chain_id"` - Bech32Prefix string `json:"bech32_prefix"` - DaemonName string `json:"daemon_name"` - NodeHome string `json:"node_home"` - KeyAlgos []string `json:"key_algos"` - Slip44 int `json:"slip44"` - Fees struct { - FeeTokens []feeToken `json:"fee_tokens"` - } `json:"fees"` - Staking staking `json:"staking"` - Codebase codebase `json:"codebase"` - Description string `json:"description"` - Apis apis `json:"apis"` -} - -type staking struct { - StakingTokens []stakingToken `json:"staking_tokens"` -} - -type stakingToken struct { - Denom string `json:"denom"` -} - -type codebase struct { - GitRepo string `json:"git_repo"` - Genesis codebaseGenesis `json:"genesis"` - RecommendedVersion string `json:"recommended_version"` - CompatibleVersions []string `json:"compatible_versions"` - Consensus codebaseConsensus `json:"consensus"` - Sdk codebaseSDK `json:"sdk"` - Ibc codebaseIBC `json:"ibc,omitempty"` - Cosmwasm codebaseCosmwasm `json:"cosmwasm,omitempty"` -} - -type codebaseGenesis struct { - GenesisURL string `json:"genesis_url"` -} - -type codebaseConsensus struct { - Type string `json:"type"` - Version string `json:"version"` -} - -type codebaseSDK struct { - Type string `json:"type"` - Version string `json:"version"` -} - -type codebaseIBC struct { - Type string `json:"type"` - Version string `json:"version"` -} - -type codebaseCosmwasm struct { - Version string `json:"version,omitempty"` - Enabled bool `json:"enabled"` -} - -type fees struct { - FeeTokens []feeToken `json:"fee_tokens"` -} - -type feeToken struct { - Denom string `json:"denom"` - FixedMinGasPrice float64 `json:"fixed_min_gas_price"` - LowGasPrice float64 `json:"low_gas_price"` - AverageGasPrice float64 `json:"average_gas_price"` - HighGasPrice float64 `json:"high_gas_price"` -} - -type apis struct { - RPC []apiProvider `json:"rpc"` - Rest []apiProvider `json:"rest"` - Grpc []apiProvider `json:"grpc"` -} - -type apiProvider struct { - Address string `json:"address"` - Provider string `json:"provider"` -} - -// SaveJSON saves the chainJSON to the given out directory. -func (c chainJSON) SaveJSON(out string) error { - bz, err := json.MarshalIndent(c, "", " ") - if err != nil { - return err - } - - return os.WriteFile(out, bz, 0o600) -} - -// https://raw.githubusercontent.com/cosmos/chain-registry/master/assetlist.schema.json -// https://github.com/cosmos/chain-registry?tab=readme-ov-file#assetlists -type assetListJSON struct { - ChainName string `json:"chain_name"` - Assets []asset `json:"assets"` -} - -type asset struct { - Description string `json:"description"` - DenomUnits []denomUnit `json:"denom_units"` - Base string `json:"base"` - Name string `json:"name"` - Display string `json:"display"` - Symbol string `json:"symbol"` - LogoURIs logoURIs `json:"logo_URIs"` - CoingeckoID string `json:"coingecko_id,omitempty"` - Socials socials `json:"socials,omitempty"` - TypeAsset string `json:"type_asset"` -} - -type denomUnit struct { - Denom string `json:"denom"` - Exponent int `json:"exponent"` -} - -type socials struct { - Website string `json:"website"` - Twitter string `json:"twitter"` -} - -type logoURIs struct { - Png string `json:"png"` - Svg string `json:"svg"` -} - -// SaveJSON saves the assetList to the given out directory. -func (c assetListJSON) SaveJSON(out string) error { - bz, err := json.MarshalIndent(c, "", " ") - if err != nil { - return err - } - - return os.WriteFile(out, bz, 0o600) -} - // AddChainRegistryFiles generates the chain registry files in the scaffolded chains. func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.Config) error { binaryName, err := chain.Binary() @@ -197,14 +48,14 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C chainGitURL, _ /* do not fail on non-existing git repo */ := xgit.RepositoryURL(chain.AppPath()) var ( - consensus codebaseConsensus - cosmwasm codebaseCosmwasm - ibc codebaseIBC + consensus chainregistry.CodebaseInfo + ibc chainregistry.CodebaseInfo + cosmwasm chainregistry.CodebaseInfoEnabled ) consensusVersion, err := getVersionOfFromGoMod(chain, "github.com/cometbft/cometbft") if err == nil { - consensus = codebaseConsensus{ + consensus = chainregistry.CodebaseInfo{ Type: "cometbft", Version: consensusVersion, } @@ -212,7 +63,7 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C cosmwasmVersion, err := getVersionOfFromGoMod(chain, "github.com/CosmWasm/wasmd") if err == nil { - cosmwasm = codebaseCosmwasm{ + cosmwasm = chainregistry.CodebaseInfoEnabled{ Version: cosmwasmVersion, Enabled: true, } @@ -220,7 +71,7 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C ibcVersion, err := getVersionOfFromGoMod(chain, "github.com/cosmos/ibc-go") if err == nil { - ibc = codebaseIBC{ + ibc = chainregistry.CodebaseInfo{ Type: "go", Version: ibcVersion, } @@ -236,21 +87,21 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C } } - chainData := chainJSON{ + chainData := chainregistry.Chain{ ChainName: chain.Name(), PrettyName: chain.Name(), - ChainType: DefaultChainType, - Status: DefaultChainStatus, - NetworkType: DefaultNetworkType, + ChainType: chainregistry.ChainTypeCosmos, + Status: chainregistry.ChainStatusUpcoming, + NetworkType: chainregistry.NetworkTypeDevnet, Website: "https://example.com", ChainID: chainID, Bech32Prefix: "cosmos", DaemonName: binaryName, NodeHome: chainHome, - KeyAlgos: []string{"secp256k1"}, + KeyAlgos: []chainregistry.KeyAlgos{chainregistry.KeyAlgoSecp256k1}, Slip44: 118, - Fees: fees{ - FeeTokens: []feeToken{ + Fees: chainregistry.Fees{ + FeeTokens: []chainregistry.FeeToken{ { Denom: defaultDenom, FixedMinGasPrice: 0.025, @@ -260,18 +111,18 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C }, }, }, - Staking: staking{ - StakingTokens: []stakingToken{ + Staking: chainregistry.Staking{ + StakingTokens: []chainregistry.StakingToken{ { Denom: defaultDenom, }, }, }, - Codebase: codebase{ + Codebase: chainregistry.Codebase{ GitRepo: chainGitURL, RecommendedVersion: "v1.0.0", CompatibleVersions: []string{"v1.0.0"}, - Sdk: codebaseSDK{ + Sdk: chainregistry.CodebaseInfo{ Type: "cosmos", Version: chain.Version.String(), }, @@ -279,20 +130,20 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C Ibc: ibc, Cosmwasm: cosmwasm, }, - Apis: apis{ - RPC: []apiProvider{ + APIs: chainregistry.APIs{ + RPC: []chainregistry.APIProvider{ { Address: "http://localhost:26657", Provider: "localhost", }, }, - Rest: []apiProvider{ + Rest: []chainregistry.APIProvider{ { Address: "http://localhost:1317", Provider: "localhost", }, }, - Grpc: []apiProvider{ + Grpc: []chainregistry.APIProvider{ { Address: "localhost:9090", Provider: "localhost", @@ -301,12 +152,12 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C }, } - assetListData := assetListJSON{ + assetListData := chainregistry.AssetList{ ChainName: chainData.ChainName, - Assets: []asset{ + Assets: []chainregistry.Asset{ { Description: fmt.Sprintf("The native token of the %s chain", chainData.ChainName), - DenomUnits: []denomUnit{ + DenomUnits: []chainregistry.DenomUnit{ { Denom: defaultDenom, Exponent: 0, @@ -315,12 +166,12 @@ func (s Scaffolder) AddChainRegistryFiles(chain *chain.Chain, cfg *chainconfig.C Base: defaultDenom, Name: chainData.ChainName, Symbol: strings.ToUpper(defaultDenom), - LogoURIs: logoURIs{ + LogoURIs: chainregistry.LogoURIs{ Png: "https://ignite.com/favicon.ico", Svg: "https://ignite.com/favicon.ico", }, TypeAsset: "sdk.coin", - Socials: socials{ + Socials: chainregistry.Socials{ Website: "https://ignite.com", Twitter: "https://x.com/ignite", }, From 6f901225999882307b613be6a32109694a4af3c4 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 16 Jan 2025 09:43:29 +0100 Subject: [PATCH 2/2] conflict --- ignite/services/scaffolder/chain_registry.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/ignite/services/scaffolder/chain_registry.go b/ignite/services/scaffolder/chain_registry.go index 5021b6d379..1339e2c616 100644 --- a/ignite/services/scaffolder/chain_registry.go +++ b/ignite/services/scaffolder/chain_registry.go @@ -9,18 +9,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" -<<<<<<< HEAD chainconfig "github.com/ignite/cli/v28/ignite/config/chain" + "github.com/ignite/cli/v28/ignite/pkg/chainregistry" "github.com/ignite/cli/v28/ignite/pkg/errors" "github.com/ignite/cli/v28/ignite/pkg/xgit" "github.com/ignite/cli/v28/ignite/services/chain" -======= - chainconfig "github.com/ignite/cli/v29/ignite/config/chain" - "github.com/ignite/cli/v29/ignite/pkg/chainregistry" - "github.com/ignite/cli/v29/ignite/pkg/errors" - "github.com/ignite/cli/v29/ignite/pkg/xgit" - "github.com/ignite/cli/v29/ignite/services/chain" ->>>>>>> ec26e2ee (feat: expose chain-registry structs (#4472)) ) const (