Cleaned up unneeded adapters
This commit is contained in:
parent
413ea2e23f
commit
9cd303d1fd
|
@ -1,82 +0,0 @@
|
|||
package commands
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
|
||||
crypto "github.com/tendermint/go-crypto"
|
||||
keys "github.com/tendermint/go-crypto/keys"
|
||||
wire "github.com/tendermint/go-wire"
|
||||
|
||||
bc "github.com/tendermint/basecoin/types"
|
||||
)
|
||||
|
||||
// AppTx Application transaction structure for client
|
||||
type AppTx struct {
|
||||
chainID string
|
||||
signers []crypto.PubKey
|
||||
Tx *bc.AppTx
|
||||
}
|
||||
|
||||
var _ keys.Signable = &AppTx{}
|
||||
|
||||
// SignBytes returned the unsigned bytes, needing a signature
|
||||
func (s *AppTx) SignBytes() []byte {
|
||||
return s.Tx.SignBytes(s.chainID)
|
||||
}
|
||||
|
||||
// Sign will add a signature and pubkey.
|
||||
//
|
||||
// Depending on the Signable, one may be able to call this multiple times for multisig
|
||||
// Returns error if called with invalid data or too many times
|
||||
func (s *AppTx) Sign(pubkey crypto.PubKey, sig crypto.Signature) error {
|
||||
if len(s.signers) > 0 {
|
||||
return errors.New("AppTx already signed")
|
||||
}
|
||||
s.Tx.SetSignature(sig)
|
||||
s.signers = []crypto.PubKey{pubkey}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Signers will return the public key(s) that signed if the signature
|
||||
// is valid, or an error if there is any issue with the signature,
|
||||
// including if there are no signatures
|
||||
func (s *AppTx) Signers() ([]crypto.PubKey, error) {
|
||||
if len(s.signers) == 0 {
|
||||
return nil, errors.New("No signatures on AppTx")
|
||||
}
|
||||
return s.signers, nil
|
||||
}
|
||||
|
||||
// TxBytes returns the transaction data as well as all signatures
|
||||
// It should return an error if Sign was never called
|
||||
func (s *AppTx) TxBytes() ([]byte, error) {
|
||||
// TODO: verify it is signed
|
||||
|
||||
// Code and comment from: basecoin/cmd/basecoin/commands/tx.go
|
||||
// Don't you hate having to do this?
|
||||
// How many times have I lost an hour over this trick?!
|
||||
txBytes := wire.BinaryBytes(bc.TxS{s.Tx})
|
||||
return txBytes, nil
|
||||
}
|
||||
|
||||
// TODO: this should really be in the basecoin.types SendTx,
|
||||
// but that code is too ugly now, needs refactor..
|
||||
func (a *AppTx) ValidateBasic() error {
|
||||
if a.chainID == "" {
|
||||
return errors.New("No chain-id specified")
|
||||
}
|
||||
in := a.Tx.Input
|
||||
if len(in.Address) != 20 {
|
||||
return errors.Errorf("Invalid input address length: %d", len(in.Address))
|
||||
}
|
||||
if !in.Coins.IsValid() {
|
||||
return errors.Errorf("Invalid input coins %v", in.Coins)
|
||||
}
|
||||
if in.Coins.IsZero() {
|
||||
return errors.New("Input coins cannot be zero")
|
||||
}
|
||||
if in.Sequence <= 0 {
|
||||
return errors.New("Sequence must be greater than 0")
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -6,13 +6,11 @@ import (
|
|||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
flag "github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"github.com/tendermint/basecoin"
|
||||
"github.com/tendermint/light-client/commands"
|
||||
txcmd "github.com/tendermint/light-client/commands/txs"
|
||||
ctypes "github.com/tendermint/tendermint/rpc/core/types"
|
||||
cmn "github.com/tendermint/tmlibs/common"
|
||||
|
||||
"github.com/tendermint/basecoin/modules/coin"
|
||||
|
@ -145,74 +143,6 @@ func parseChainAddress(toFlag string) (string, []byte, error) {
|
|||
return chainPrefix, to, nil
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
// AppTx
|
||||
|
||||
// BroadcastAppTx wraps, signs, and executes an app tx basecoin transaction
|
||||
func BroadcastAppTx(tx *btypes.AppTx) (*ctypes.ResultBroadcastTxCommit, error) {
|
||||
|
||||
// Sign if needed and post to the node. This it the work-horse
|
||||
return txcmd.SignAndPostTx(WrapAppTx(tx))
|
||||
}
|
||||
|
||||
// AddAppTxFlags adds flags required by apptx
|
||||
func AddAppTxFlags(fs *flag.FlagSet) {
|
||||
fs.String(FlagAmount, "", "Coins to send in the format <amt><coin>,<amt><coin>...")
|
||||
fs.String(FlagFee, "0mycoin", "Coins for the transaction fee of the format <amt><coin>")
|
||||
fs.Int64(FlagGas, 0, "Amount of gas for this transaction")
|
||||
fs.Int(FlagSequence, -1, "Sequence number for this transaction")
|
||||
}
|
||||
|
||||
// ReadAppTxFlags reads in the standard flags
|
||||
// your command should parse info to set tx.Name and tx.Data
|
||||
func ReadAppTxFlags() (gas int64, fee btypes.Coin, txInput btypes.TxInput, err error) {
|
||||
|
||||
// Set the gas
|
||||
gas = viper.GetInt64(FlagGas)
|
||||
|
||||
// Parse the fee and amounts into coin types
|
||||
fee, err = btypes.ParseCoin(viper.GetString(FlagFee))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// retrieve the amount
|
||||
var amount btypes.Coins
|
||||
amount, err = btypes.ParseCoins(viper.GetString(FlagAmount))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// get the PubKey of the signer
|
||||
pk := txcmd.GetSigner()
|
||||
|
||||
// get addr if available
|
||||
var addr []byte
|
||||
if !pk.Empty() {
|
||||
addr = pk.Address()
|
||||
}
|
||||
|
||||
// set the output
|
||||
txInput = btypes.TxInput{
|
||||
Coins: amount,
|
||||
Sequence: viper.GetInt(FlagSequence),
|
||||
Address: addr,
|
||||
}
|
||||
// set the pubkey if needed
|
||||
if txInput.Sequence == 1 {
|
||||
txInput.PubKey = pk
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// WrapAppTx wraps the transaction with chain id
|
||||
func WrapAppTx(tx *btypes.AppTx) *AppTx {
|
||||
return &AppTx{
|
||||
chainID: commands.GetChainID(),
|
||||
Tx: tx,
|
||||
}
|
||||
}
|
||||
|
||||
/** TODO copied from basecoin cli - put in common somewhere? **/
|
||||
|
||||
// ParseHexFlag parses a flag string to byte array
|
||||
|
|
|
@ -1,113 +0,0 @@
|
|||
package commands
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
bc "github.com/tendermint/basecoin/types"
|
||||
crypto "github.com/tendermint/go-crypto"
|
||||
keys "github.com/tendermint/go-crypto/keys"
|
||||
wire "github.com/tendermint/go-wire"
|
||||
)
|
||||
|
||||
type SendTx struct {
|
||||
chainID string
|
||||
signers []crypto.PubKey
|
||||
Tx *bc.SendTx
|
||||
}
|
||||
|
||||
var _ keys.Signable = &SendTx{}
|
||||
|
||||
// SignBytes returned the unsigned bytes, needing a signature
|
||||
func (s *SendTx) SignBytes() []byte {
|
||||
return s.Tx.SignBytes(s.chainID)
|
||||
}
|
||||
|
||||
// Sign will add a signature and pubkey.
|
||||
//
|
||||
// Depending on the Signable, one may be able to call this multiple times for multisig
|
||||
// Returns error if called with invalid data or too many times
|
||||
func (s *SendTx) Sign(pubkey crypto.PubKey, sig crypto.Signature) error {
|
||||
addr := pubkey.Address()
|
||||
set := s.Tx.SetSignature(addr, sig)
|
||||
if !set {
|
||||
return errors.Errorf("Cannot add signature for address %X", addr)
|
||||
}
|
||||
s.signers = append(s.signers, pubkey)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Signers will return the public key(s) that signed if the signature
|
||||
// is valid, or an error if there is any issue with the signature,
|
||||
// including if there are no signatures
|
||||
func (s *SendTx) Signers() ([]crypto.PubKey, error) {
|
||||
if len(s.signers) == 0 {
|
||||
return nil, errors.New("No signatures on SendTx")
|
||||
}
|
||||
return s.signers, nil
|
||||
}
|
||||
|
||||
// TxBytes returns the transaction data as well as all signatures
|
||||
// It should return an error if Sign was never called
|
||||
func (s *SendTx) TxBytes() ([]byte, error) {
|
||||
// TODO: verify it is signed
|
||||
|
||||
// Code and comment from: basecoin/cmd/basecoin/commands/tx.go
|
||||
// Don't you hate having to do this?
|
||||
// How many times have I lost an hour over this trick?!
|
||||
txBytes := wire.BinaryBytes(struct {
|
||||
bc.Tx `json:"unwrap"`
|
||||
}{s.Tx})
|
||||
return txBytes, nil
|
||||
}
|
||||
|
||||
// AddSigner sets address and pubkey info on the tx based on the key that
|
||||
// will be used for signing
|
||||
func (s *SendTx) AddSigner(pk crypto.PubKey) {
|
||||
// get addr if available
|
||||
var addr []byte
|
||||
if !pk.Empty() {
|
||||
addr = pk.Address()
|
||||
}
|
||||
|
||||
// set the send address, and pubkey if needed
|
||||
in := s.Tx.Inputs
|
||||
in[0].Address = addr
|
||||
if in[0].Sequence == 1 {
|
||||
in[0].PubKey = pk
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: this should really be in the basecoin.types SendTx,
|
||||
// but that code is too ugly now, needs refactor..
|
||||
func (s *SendTx) ValidateBasic() error {
|
||||
if s.chainID == "" {
|
||||
return errors.New("No chain-id specified")
|
||||
}
|
||||
for _, in := range s.Tx.Inputs {
|
||||
if len(in.Address) != 20 {
|
||||
return errors.Errorf("Invalid input address length: %d", len(in.Address))
|
||||
}
|
||||
if !in.Coins.IsValid() {
|
||||
return errors.Errorf("Invalid input coins %v", in.Coins)
|
||||
}
|
||||
if in.Coins.IsZero() {
|
||||
return errors.New("Input coins cannot be zero")
|
||||
}
|
||||
if in.Sequence <= 0 {
|
||||
return errors.New("Sequence must be greater than 0")
|
||||
}
|
||||
}
|
||||
for _, out := range s.Tx.Outputs {
|
||||
// we now allow chain/addr, so it can be more than 20 bytes
|
||||
if len(out.Address) < 20 {
|
||||
return errors.Errorf("Invalid output address length: %d", len(out.Address))
|
||||
}
|
||||
if !out.Coins.IsValid() {
|
||||
return errors.Errorf("Invalid output coins %v", out.Coins)
|
||||
}
|
||||
if out.Coins.IsZero() {
|
||||
return errors.New("Output coins cannot be zero")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue