Default to next sequence number (closes #807)

This commit is contained in:
Christopher Goes 2018-04-09 16:06:24 +02:00
parent 0be655b122
commit ec98545a1b
No known key found for this signature in database
GPG Key ID: E828D98232D328D3
4 changed files with 50 additions and 1 deletions

View File

@ -43,5 +43,7 @@ func NewCoreContextFromViper() core.CoreContext {
NodeURI: nodeURI,
Sequence: viper.GetInt64(client.FlagSequence),
Client: rpc,
Decoder: nil,
AccountStore: "main",
}
}

View File

@ -2,6 +2,8 @@ package core
import (
rpcclient "github.com/tendermint/tendermint/rpc/client"
sdk "github.com/cosmos/cosmos-sdk/types"
)
type CoreContext struct {
@ -12,6 +14,8 @@ type CoreContext struct {
FromAddressName string
Sequence int64
Client rpcclient.Client
Decoder sdk.AccountDecoder
AccountStore string
}
func (c CoreContext) WithChainID(chainID string) CoreContext {
@ -48,3 +52,13 @@ func (c CoreContext) WithClient(client rpcclient.Client) CoreContext {
c.Client = client
return c
}
func (c CoreContext) WithDecoder(decoder sdk.AccountDecoder) CoreContext {
c.Decoder = decoder
return c
}
func (c CoreContext) WithAccountStore(accountStore string) CoreContext {
c.AccountStore = accountStore
return c
}

View File

@ -140,6 +140,24 @@ func (ctx CoreContext) SignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Co
return ctx.BroadcastTx(txBytes)
}
func (c CoreContext) NextSequence(address []byte) (int64, error) {
if c.Decoder == nil {
return 0, errors.New("AccountDecoder required but not provided")
}
res, err := c.Query(address, c.AccountStore)
if err != nil {
return 0, err
}
account, err := c.Decoder(res)
if err != nil {
panic(err)
}
return account.GetSequence(), nil
}
// get passphrase from std input
func (ctx CoreContext) GetPassphraseFromStdin(name string) (pass string, err error) {
buf := client.BufferStdin()

View File

@ -10,6 +10,7 @@ import (
"github.com/cosmos/cosmos-sdk/client/context"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire"
authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands"
"github.com/cosmos/cosmos-sdk/x/bank"
)
@ -36,7 +37,7 @@ type Commander struct {
}
func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error {
ctx := context.NewCoreContextFromViper()
ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(c.Cdc))
// get the from address
from, err := ctx.GetFromAddress()
@ -62,6 +63,20 @@ func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error {
// build message
msg := BuildMsg(from, to, coins)
// default to next sequence number if none provided
if viper.GetInt64(client.FlagSequence) == 0 {
from, err := ctx.GetFromAddress()
if err != nil {
return err
}
seq, err := ctx.NextSequence(from)
if err != nil {
return err
}
fmt.Printf("Defaulting to next sequence number: %d\n", seq)
ctx = ctx.WithSequence(seq)
}
// build and sign the transaction, then broadcast to Tendermint
res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, c.Cdc)
if err != nil {