diff --git a/cmd/adam/main.go b/cmd/adam/main.go new file mode 100644 index 0000000000..ef55d7aced --- /dev/null +++ b/cmd/adam/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "os" + + "github.com/tendermint/basecoin/cmd/commands" + + "github.com/urfave/cli" +) + +func init() { + commands.RegisterIBC() +} + +func main() { + app := cli.NewApp() + app.Name = "adam" + app.Usage = "adam [command] [args...]" + app.Version = "0.1.0" + app.Commands = []cli.Command{ + commands.StartCmd, + commands.TxCmd, + commands.QueryCmd, + commands.VerifyCmd, // TODO: move to merkleeyes? + commands.BlockCmd, + commands.AccountCmd, + } + app.Run(os.Args) +} diff --git a/cmd/basecoin/main.go b/cmd/basecoin/main.go index 536dc61879..3c31ae38fd 100644 --- a/cmd/basecoin/main.go +++ b/cmd/basecoin/main.go @@ -3,7 +3,7 @@ package main import ( "os" - "github.com/tendermint/basecoin/cmd/basecoin/commands" + "github.com/tendermint/basecoin/cmd/commands" "github.com/urfave/cli" ) @@ -14,12 +14,10 @@ func main() { app.Version = "0.1.0" app.Commands = []cli.Command{ commands.StartCmd, - commands.SendTxCmd, - commands.AppTxCmd, - commands.IbcCmd, + commands.TxCmd, commands.QueryCmd, - commands.VerifyCmd, - commands.BlockCmd, + commands.VerifyCmd, // TODO: move to merkleeyes? + commands.BlockCmd, // TODO: move to adam? commands.AccountCmd, } app.Run(os.Args) diff --git a/cmd/basecoin/commands/flags.go b/cmd/commands/flags.go similarity index 60% rename from cmd/basecoin/commands/flags.go rename to cmd/commands/flags.go index 0ca74962ce..dc91754687 100644 --- a/cmd/basecoin/commands/flags.go +++ b/cmd/commands/flags.go @@ -31,11 +31,6 @@ var ( Name: "in-proc", Usage: "Run Tendermint in-process with the App", } - - IbcPluginFlag = cli.BoolFlag{ - Name: "ibc-plugin", - Usage: "Enable the ibc plugin", - } ) // tx flags @@ -106,86 +101,6 @@ var ( Value: "test_chain_id", Usage: "ID of the chain for replay protection", } - - ValidFlag = cli.BoolFlag{ - Name: "valid", - Usage: "Set valid field in CounterTx", - } -) - -// ibc flags -var ( - IbcChainIDFlag = cli.StringFlag{ - Name: "chain_id", - Usage: "ChainID for the new blockchain", - Value: "", - } - - IbcGenesisFlag = cli.StringFlag{ - Name: "genesis", - Usage: "Genesis file for the new blockchain", - Value: "", - } - - IbcHeaderFlag = cli.StringFlag{ - Name: "header", - Usage: "Block header for an ibc update", - Value: "", - } - - IbcCommitFlag = cli.StringFlag{ - Name: "commit", - Usage: "Block commit for an ibc update", - Value: "", - } - - IbcFromFlag = cli.StringFlag{ - Name: "from", - Usage: "Source ChainID", - Value: "", - } - - IbcToFlag = cli.StringFlag{ - Name: "to", - Usage: "Destination ChainID", - Value: "", - } - - IbcTypeFlag = cli.StringFlag{ - Name: "type", - Usage: "IBC packet type (eg. coin)", - Value: "", - } - - IbcPayloadFlag = cli.StringFlag{ - Name: "payload", - Usage: "IBC packet payload", - Value: "", - } - - IbcPacketFlag = cli.StringFlag{ - Name: "packet", - Usage: "hex-encoded IBC packet", - Value: "", - } - - IbcProofFlag = cli.StringFlag{ - Name: "proof", - Usage: "hex-encoded proof of IBC packet from source chain", - Value: "", - } - - IbcSequenceFlag = cli.IntFlag{ - Name: "sequence", - Usage: "sequence number for IBC packet", - Value: 0, - } - - IbcHeightFlag = cli.IntFlag{ - Name: "height", - Usage: "Height the packet became egress in source chain", - Value: 0, - } ) // proof flags diff --git a/cmd/basecoin/commands/ibc.go b/cmd/commands/ibc.go similarity index 74% rename from cmd/basecoin/commands/ibc.go rename to cmd/commands/ibc.go index 39f5aef8d4..1b513d4047 100644 --- a/cmd/basecoin/commands/ibc.go +++ b/cmd/commands/ibc.go @@ -9,6 +9,7 @@ import ( "github.com/urfave/cli" "github.com/tendermint/basecoin/plugins/ibc" + "github.com/tendermint/basecoin/types" cmn "github.com/tendermint/go-common" "github.com/tendermint/go-merkle" @@ -16,25 +17,99 @@ import ( tmtypes "github.com/tendermint/tendermint/types" ) +// Register the IBC plugin at start and for transactions +func RegisterIBC() { + RegisterTxSubcommand(IbcCmd) + RegisterStartPlugin("ibc", func() types.Plugin { + return ibc.New() + }) +} + +//--------------------------------------------------------------------- +// ibc flags + +var ( + IbcChainIDFlag = cli.StringFlag{ + Name: "chain_id", + Usage: "ChainID for the new blockchain", + Value: "", + } + + IbcGenesisFlag = cli.StringFlag{ + Name: "genesis", + Usage: "Genesis file for the new blockchain", + Value: "", + } + + IbcHeaderFlag = cli.StringFlag{ + Name: "header", + Usage: "Block header for an ibc update", + Value: "", + } + + IbcCommitFlag = cli.StringFlag{ + Name: "commit", + Usage: "Block commit for an ibc update", + Value: "", + } + + IbcFromFlag = cli.StringFlag{ + Name: "from", + Usage: "Source ChainID", + Value: "", + } + + IbcToFlag = cli.StringFlag{ + Name: "to", + Usage: "Destination ChainID", + Value: "", + } + + IbcTypeFlag = cli.StringFlag{ + Name: "type", + Usage: "IBC packet type (eg. coin)", + Value: "", + } + + IbcPayloadFlag = cli.StringFlag{ + Name: "payload", + Usage: "IBC packet payload", + Value: "", + } + + IbcPacketFlag = cli.StringFlag{ + Name: "packet", + Usage: "hex-encoded IBC packet", + Value: "", + } + + IbcProofFlag = cli.StringFlag{ + Name: "proof", + Usage: "hex-encoded proof of IBC packet from source chain", + Value: "", + } + + IbcSequenceFlag = cli.IntFlag{ + Name: "sequence", + Usage: "sequence number for IBC packet", + Value: 0, + } + + IbcHeightFlag = cli.IntFlag{ + Name: "height", + Usage: "Height the packet became egress in source chain", + Value: 0, + } +) + +//--------------------------------------------------------------------- +// ibc commands + var ( IbcCmd = cli.Command{ Name: "ibc", Usage: "Send a transaction to the interblockchain (ibc) plugin", - Flags: []cli.Flag{ - NodeFlag, - ChainIDFlag, - - FromFlag, - - AmountFlag, - CoinFlag, - GasFlag, - FeeFlag, - SeqFlag, - - NameFlag, - DataFlag, - }, + Flags: TxFlags, Subcommands: []cli.Command{ IbcRegisterTxCmd, IbcUpdateTxCmd, @@ -108,6 +183,9 @@ var ( } ) +//--------------------------------------------------------------------- +// ibc command implementations + func cmdIBCRegisterTx(c *cli.Context) error { chainID := c.String("chain_id") genesisFile := c.String("genesis") diff --git a/cmd/basecoin/commands/query.go b/cmd/commands/query.go similarity index 100% rename from cmd/basecoin/commands/query.go rename to cmd/commands/query.go diff --git a/cmd/basecoin/commands/start.go b/cmd/commands/start.go similarity index 84% rename from cmd/basecoin/commands/start.go rename to cmd/commands/start.go index 225619399f..9ce201a108 100644 --- a/cmd/basecoin/commands/start.go +++ b/cmd/commands/start.go @@ -19,7 +19,6 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/basecoin/app" - "github.com/tendermint/basecoin/plugins/ibc" "github.com/tendermint/basecoin/types" ) @@ -40,7 +39,6 @@ var StartCmd = cli.Command{ DirFlag, InProcTMFlag, ChainIDFlag, - IbcPluginFlag, }, } @@ -51,10 +49,9 @@ type plugin struct { var plugins = []plugin{} -// RegisterStartPlugin is used to add another -func RegisterStartPlugin(flag cli.BoolFlag, init func() types.Plugin) { - StartCmd.Flags = append(StartCmd.Flags, flag) - plugins = append(plugins, plugin{name: flag.GetName(), init: init}) +// RegisterStartPlugin is used to enable a plugin +func RegisterStartPlugin(name string, initFunc func() types.Plugin) { + plugins = append(plugins, plugin{name: name, init: initFunc}) } func cmdStart(c *cli.Context) error { @@ -73,15 +70,10 @@ func cmdStart(c *cli.Context) error { // Create Basecoin app basecoinApp := app.NewBasecoin(eyesCli) - if c.Bool("ibc-plugin") { - basecoinApp.RegisterPlugin(ibc.New()) - } - // loop through all registered plugins and enable if desired + // register all plugins for _, p := range plugins { - if c.Bool(p.name) { - basecoinApp.RegisterPlugin(p.init()) - } + basecoinApp.RegisterPlugin(p.init()) } // If genesis file exists, set key-value options diff --git a/cmd/basecoin/commands/tx.go b/cmd/commands/tx.go similarity index 86% rename from cmd/basecoin/commands/tx.go rename to cmd/commands/tx.go index e68c3754d1..cba6e70639 100644 --- a/cmd/basecoin/commands/tx.go +++ b/cmd/commands/tx.go @@ -16,61 +16,56 @@ import ( tmtypes "github.com/tendermint/tendermint/types" ) +var TxFlags = []cli.Flag{ + NodeFlag, + ChainIDFlag, + + FromFlag, + + AmountFlag, + CoinFlag, + GasFlag, + FeeFlag, + SeqFlag, +} + var ( + TxCmd = cli.Command{ + Name: "tx", + Usage: "Create, sign, and broadcast a transaction", + ArgsUsage: "", + Subcommands: []cli.Command{ + SendTxCmd, + AppTxCmd, + }, + } + SendTxCmd = cli.Command{ - Name: "sendtx", - Usage: "Broadcast a basecoin SendTx", + Name: "send", + Usage: "Create, sign, and broadcast a SendTx transaction", ArgsUsage: "", Action: func(c *cli.Context) error { return cmdSendTx(c) }, - Flags: []cli.Flag{ - NodeFlag, - ChainIDFlag, - - FromFlag, - - AmountFlag, - CoinFlag, - GasFlag, - FeeFlag, - SeqFlag, - - ToFlag, - }, + Flags: append(TxFlags, ToFlag), } AppTxCmd = cli.Command{ - Name: "apptx", - Usage: "Broadcast a basecoin AppTx", + Name: "app", + Usage: "Create, sign, and broadcast a raw AppTx transaction", ArgsUsage: "", Action: func(c *cli.Context) error { return cmdAppTx(c) }, - Flags: []cli.Flag{ - NodeFlag, - ChainIDFlag, - - FromFlag, - - AmountFlag, - CoinFlag, - GasFlag, - FeeFlag, - SeqFlag, - - NameFlag, - DataFlag, - }, + Flags: append(TxFlags, NameFlag, DataFlag), // Subcommands are dynamically registered with plugins as needed Subcommands: []cli.Command{}, } ) -// RegisterTxPlugin is used to add another subcommand and create a custom -// apptx encoding. Look at counter.go for an example -func RegisterTxPlugin(cmd cli.Command) { - AppTxCmd.Subcommands = append(AppTxCmd.Subcommands, cmd) +// Register a subcommand of TxCmd to craft transactions for plugins +func RegisterTxSubcommand(cmd cli.Command) { + TxCmd.Subcommands = append(TxCmd.Subcommands, cmd) } func cmdSendTx(c *cli.Context) error { diff --git a/cmd/basecoin/commands/utils.go b/cmd/commands/utils.go similarity index 100% rename from cmd/basecoin/commands/utils.go rename to cmd/commands/utils.go diff --git a/cmd/basecoin/commands/counter.go b/cmd/counter/cmd.go similarity index 54% rename from cmd/basecoin/commands/counter.go rename to cmd/counter/cmd.go index 83f98218cf..6b5e02ab55 100644 --- a/cmd/basecoin/commands/counter.go +++ b/cmd/counter/cmd.go @@ -1,48 +1,48 @@ -package commands +package main import ( "fmt" - "github.com/tendermint/basecoin/plugins/counter" - "github.com/tendermint/basecoin/types" wire "github.com/tendermint/go-wire" "github.com/urfave/cli" -) -var ( - CounterTxCmd = cli.Command{ - Name: "counter", - Usage: "Craft a transaction to the counter plugin", - Action: func(c *cli.Context) error { - return cmdCounterTx(c) - }, - Flags: []cli.Flag{ - ValidFlag, - }, - } - - CounterPluginFlag = cli.BoolFlag{ - Name: "counter-plugin", - Usage: "Enable the counter plugin", - } + "github.com/tendermint/basecoin/cmd/commands" + "github.com/tendermint/basecoin/plugins/counter" + "github.com/tendermint/basecoin/types" ) func init() { - RegisterTxPlugin(CounterTxCmd) - RegisterStartPlugin(CounterPluginFlag, - func() types.Plugin { return counter.New("counter") }) + commands.RegisterTxSubcommand(CounterTxCmd) + commands.RegisterStartPlugin("counter", func() types.Plugin { + return counter.New("counter") + }) } +var ( + ValidFlag = cli.BoolFlag{ + Name: "valid", + Usage: "Set valid field in CounterTx", + } + + CounterTxCmd = cli.Command{ + Name: "counter", + Usage: "Create, sign, and broadcast a transaction to the counter plugin", + Action: func(c *cli.Context) error { + return cmdCounterTx(c) + }, + Flags: append(commands.TxFlags, ValidFlag), + } +) + func cmdCounterTx(c *cli.Context) error { valid := c.Bool("valid") - parent := c.Parent() counterTx := counter.CounterTx{ Valid: valid, Fee: types.Coins{ { - Denom: parent.String("coin"), - Amount: int64(parent.Int("fee")), + Denom: c.String("coin"), + Amount: int64(c.Int("fee")), }, }, } @@ -52,5 +52,5 @@ func cmdCounterTx(c *cli.Context) error { data := wire.BinaryBytes(counterTx) name := "counter" - return AppTx(parent, name, data) + return commands.AppTx(c, name, data) } diff --git a/cmd/counter/main.go b/cmd/counter/main.go new file mode 100644 index 0000000000..11967841c1 --- /dev/null +++ b/cmd/counter/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + + "github.com/tendermint/basecoin/cmd/commands" + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "counter" + app.Usage = "counter [command] [args...]" + app.Version = "0.1.0" + app.Commands = []cli.Command{ + commands.StartCmd, + commands.TxCmd, + commands.QueryCmd, + commands.AccountCmd, + } + app.Run(os.Args) +}