Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 92 additions & 22 deletions connect/cmd/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,47 @@ package cmd
import (
"context"
"fmt"
"os"
"strings"

"cosmossdk.io/client/v2/autocli"
"cosmossdk.io/client/v2/autocli/flag"
"cosmossdk.io/core/address"
"github.com/cosmos/cosmos-sdk/client"
sdkflags "github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/grpc/cmtservice"
addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/spf13/cobra"
"google.golang.org/grpc"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/types/dynamicpb"

"cosmossdk.io/client/v2/autocli"
"cosmossdk.io/client/v2/autocli/flag"
"github.com/ignite/apps/connect/chains"
"github.com/ignite/apps/connect/internal"
)

func AppManifest(ctx context.Context, name string, cfg *chains.ChainConfig) (*cobra.Command, error) {
chainCmd := &cobra.Command{
Use: name,
Short: fmt.Sprintf("Commands for %s chain", name),
}

return chainCmd, nil
}

func AppHandler(ctx context.Context, name string, cfg *chains.ChainConfig, args ...string) (*cobra.Command, error) {
chainCmd := &cobra.Command{
Use: name,
Short: fmt.Sprintf("Commands for %s chain", name),
}

if len(args) > 0 {
chainCmd.SetArgs(args)
}

conn, err := chains.NewConn(name, cfg)
if err != nil {
return nil, err
Expand All @@ -35,46 +53,98 @@ func AppHandler(ctx context.Context, name string, cfg *chains.ChainConfig, args
return nil, err
}

// add comet commands
cometCmds := cmtservice.NewCometBFTCommands()
conn.ModuleOptions[cometCmds.Name()] = cometCmds.AutoCLIOptions()

appOpts := autocli.AppOptions{
ModuleOptions: conn.ModuleOptions,
}
addressCodec, validatorAddressCodec, consensusAddressCodec := setupAddressPrefixesAndCodecs(cfg.Bech32Prefix)

builder := &autocli.Builder{
Builder: flag.Builder{
TypeResolver: &dynamicTypeResolver{conn},
FileResolver: conn.ProtoFiles,
AddressCodec: addresscodec.NewBech32Codec(cfg.Bech32Prefix),
ValidatorAddressCodec: addresscodec.NewBech32Codec(fmt.Sprintf("%svaloper", cfg.Bech32Prefix)),
ConsensusAddressCodec: addresscodec.NewBech32Codec(fmt.Sprintf("%svalcons", cfg.Bech32Prefix)),
AddressCodec: addressCodec,
ValidatorAddressCodec: validatorAddressCodec,
ConsensusAddressCodec: consensusAddressCodec,
},
GetClientConn: func(command *cobra.Command) (grpc.ClientConnInterface, error) {
GetClientConn: func(cmd *cobra.Command) (grpc.ClientConnInterface, error) {
return conn.Connect()
},
AddQueryConnFlags: func(command *cobra.Command) {
sdkflags.AddQueryFlagsToCmd(command)
sdkflags.AddKeyringFlags(command.Flags())
AddQueryConnFlags: func(cmd *cobra.Command) {
sdkflags.AddQueryFlagsToCmd(cmd)
sdkflags.AddKeyringFlags(cmd.Flags())
},
AddTxConnFlags: sdkflags.AddTxFlagsToCmd,
}

// add client context
clientCtx := client.Context{}
chainCmd.SetContext(context.WithValue(context.Background(), client.ClientContextKey, &clientCtx))
if err := appOpts.EnhanceRootCommandWithBuilder(chainCmd, builder); err != nil {
// add comet commands
cometCmds := cmtservice.NewCometBFTCommands()
conn.ModuleOptions[cometCmds.Name()] = cometCmds.AutoCLIOptions()

// add autocli commands
appOpts := &autocli.AppOptions{
ModuleOptions: conn.ModuleOptions,
AddressCodec: addressCodec,
ValidatorAddressCodec: validatorAddressCodec,
ConsensusAddressCodec: consensusAddressCodec,
}

// keyring config
k, err := internal.NewKeyring(chainCmd.Flags(), addressCodec, cfg.Bech32Prefix)
if err != nil {
return nil, err
}

if len(args) > 0 {
chainCmd.SetArgs(args)
// create client context
clientCtx := client.Context{}.
WithKeyring(k).
WithInput(os.Stdin).
WithAccountRetriever(authtypes.AccountRetriever{}).
WithViper("")

// add to root command (autocli expects it there)
chainCmd.SetContext(context.WithValue(
context.Background(),
client.ClientContextKey,
&clientCtx,
))

err = appOpts.EnhanceRootCommandWithBuilder(chainCmd, builder)
if err != nil {
return nil, err
}

return chainCmd, nil
}

// setupAddressPrefixesAndCodecs returns the address codecs for the given bech32 prefix.
// Additionally it sets the address prefix for the sdk.Config.
func setupAddressPrefixesAndCodecs(prefix string) (
address.Codec,
address.Codec,
address.Codec,
) {
// set address prefix for sdk.Config
var (
// Bech32PrefixAccPub defines the Bech32 prefix of an account's public key.
bech32PrefixAccPub = prefix + sdk.PrefixPublic
// Bech32PrefixValAddr defines the Bech32 prefix of a validator's operator address.
bech32PrefixValAddr = prefix + sdk.PrefixValidator + sdk.PrefixOperator
// Bech32PrefixValPub defines the Bech32 prefix of a validator's operator public key.
bech32PrefixValPub = bech32PrefixValAddr + sdk.PrefixPublic
// Bech32PrefixConsAddr defines the Bech32 prefix of a consensus node address.
bech32PrefixConsAddr = prefix + sdk.PrefixValidator + sdk.PrefixConsensus
// Bech32PrefixConsPub defines the Bech32 prefix of a consensus node public key.
bech32PrefixConsPub = bech32PrefixConsAddr + sdk.PrefixPublic
)

config := sdk.GetConfig()
config.SetBech32PrefixForAccount(prefix, bech32PrefixAccPub)
config.SetBech32PrefixForValidator(bech32PrefixValAddr, bech32PrefixValPub)
config.SetBech32PrefixForConsensusNode(bech32PrefixConsAddr, bech32PrefixConsPub)
config.Seal()

return addresscodec.NewBech32Codec(prefix),
addresscodec.NewBech32Codec(bech32PrefixValAddr),
addresscodec.NewBech32Codec(bech32PrefixConsAddr)
}

type dynamicTypeResolver struct {
*chains.Conn
}
Expand Down
13 changes: 1 addition & 12 deletions connect/cmd/cmd.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package cmd

import (
"fmt"

"github.com/ignite/cli/v28/ignite/services/plugin"
)

// GetCommands returns the list of app commands.
func GetCommands(availableChains []string) []*plugin.Command {
func GetCommands() []*plugin.Command {
cmd := []*plugin.Command{
{
Use: "connect [command]",
Expand Down Expand Up @@ -38,14 +36,5 @@ func GetCommands(availableChains []string) []*plugin.Command {
},
}

for _, name := range availableChains {
cmd[0].Commands = append(cmd[0].Commands,
&plugin.Command{
Use: name,
Short: fmt.Sprintf("Commands for %s chain", name),
},
)
}

return cmd
}
Loading
Loading