Skip to content

Commit

Permalink
Start on coin handler
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanfrey committed Jun 30, 2017
1 parent a0f1e5e commit 3779600
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 3 deletions.
7 changes: 7 additions & 0 deletions errors/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"

abci "github.com/tendermint/abci/types"
"github.com/tendermint/basecoin"
)

const (
Expand All @@ -26,8 +27,14 @@ const (
msgTooManySignatures = "Too many signatures"
msgNoChain = "No chain id provided"
msgWrongChain = "Tx belongs to different chain - %s"
msgUnknownTxType = "We cannot handle this tx - %v"
)

func UnknownTxType(tx basecoin.Tx) TMError {
msg := fmt.Sprintf(msgUnknownTxType, tx)
return New(msg, abci.CodeType_UnknownRequest)
}

func InternalError(msg string) TMError {
return New(msg, abci.CodeType_InternalError)
}
Expand Down
64 changes: 64 additions & 0 deletions modules/coin/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package coin

import (
"github.com/tendermint/basecoin"
"github.com/tendermint/basecoin/errors"
"github.com/tendermint/basecoin/types"
)

const (
NameCoin = "coin"
)

// Handler writes
type Handler struct{}

var _ basecoin.Handler = Handler{}

func (_ Handler) Name() string {
return NameCoin
}

// CheckTx checks if there is enough money in the account
func (h Handler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
_, err = checkTx(ctx, tx)
if err != nil {
return res, err
}

// now make sure there is money

// otherwise, we are good
return res, nil
}

// DeliverTx moves the money
func (h Handler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
_, err = checkTx(ctx, tx)
if err != nil {
return res, err
}

// now move the money
return basecoin.Result{}, nil
}

func checkTx(ctx basecoin.Context, tx basecoin.Tx) (*SendTx, error) {
// check if the tx is proper type and valid
send, ok := tx.Unwrap().(*SendTx)
if !ok {
return nil, errors.UnknownTxType(tx)
}
err := send.ValidateBasic()
if err != nil {
return nil, err
}

// check if all inputs have permission
for _, in := range send.Inputs {
if !ctx.HasPermission(in.Address) {
return nil, errors.Unauthorized()
}
}
return send, nil
}
8 changes: 8 additions & 0 deletions modules/coin/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,23 @@ func (tx SendTx) ValidateBasic() error {
if len(tx.Outputs) == 0 {
return errors.NoOutputs()
}
// make sure all inputs and outputs are individually valid
var totalIn, totalOut types.Coins
for _, in := range tx.Inputs {
if err := in.ValidateBasic(); err != nil {
return err
}
totalIn.Plus(in.Coins)
}
for _, out := range tx.Outputs {
if err := out.ValidateBasic(); err != nil {
return err
}
totalOut.Plus(out.Coins)
}
// make sure inputs and outputs match
if !totalIn.IsEqual(totalOut) {
return errors.InvalidCoins()
}
return nil
}
Expand Down
20 changes: 17 additions & 3 deletions stack/multiplexer.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package stack

import (
"strings"

"github.com/tendermint/basecoin"
"github.com/tendermint/basecoin/txs"
"github.com/tendermint/basecoin/types"
wire "github.com/tendermint/go-wire"
"github.com/tendermint/go-wire/data"
)

const (
Expand Down Expand Up @@ -45,7 +49,17 @@ func runAll(ctx basecoin.Context, store types.KVStore, txs []basecoin.Tx, next b
return combine(rs), nil
}

func combine(res []basecoin.Result) basecoin.Result {
// TODO: how to combine???
return res[0]
// combines all data bytes as a go-wire array.
// joins all log messages with \n
func combine(all []basecoin.Result) basecoin.Result {
datas := make([]data.Bytes, len(all))
logs := make([]string, len(all))
for i, r := range all {
datas[i] = r.Data
logs[i] = r.Log
}
return basecoin.Result{
Data: wire.BinaryBytes(datas),
Log: strings.Join(logs, "\n"),
}
}

0 comments on commit 3779600

Please sign in to comment.