2017-06-30 04:55:25 -07:00
|
|
|
package coin
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/tendermint/basecoin"
|
|
|
|
"github.com/tendermint/basecoin/errors"
|
|
|
|
"github.com/tendermint/basecoin/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
NameCoin = "coin"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Handler writes
|
2017-07-03 05:50:33 -07:00
|
|
|
type Handler struct {
|
|
|
|
Accountant
|
|
|
|
}
|
2017-06-30 04:55:25 -07:00
|
|
|
|
|
|
|
var _ basecoin.Handler = Handler{}
|
|
|
|
|
2017-07-03 05:50:33 -07:00
|
|
|
func NewHandler() Handler {
|
|
|
|
return Handler{
|
|
|
|
Accountant: Accountant{Prefix: []byte(NameCoin + "/")},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-30 04:55:25 -07:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2017-06-30 11:26:17 -07:00
|
|
|
func checkTx(ctx basecoin.Context, tx basecoin.Tx) (send SendTx, err error) {
|
2017-06-30 04:55:25 -07:00
|
|
|
// check if the tx is proper type and valid
|
2017-06-30 11:26:17 -07:00
|
|
|
send, ok := tx.Unwrap().(SendTx)
|
2017-06-30 04:55:25 -07:00
|
|
|
if !ok {
|
2017-07-03 05:50:33 -07:00
|
|
|
return send, errors.ErrInvalidFormat(tx)
|
2017-06-30 04:55:25 -07:00
|
|
|
}
|
2017-06-30 11:26:17 -07:00
|
|
|
err = send.ValidateBasic()
|
2017-06-30 04:55:25 -07:00
|
|
|
if err != nil {
|
2017-06-30 11:26:17 -07:00
|
|
|
return send, err
|
2017-06-30 04:55:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// check if all inputs have permission
|
|
|
|
for _, in := range send.Inputs {
|
|
|
|
if !ctx.HasPermission(in.Address) {
|
2017-07-03 05:50:33 -07:00
|
|
|
return send, errors.ErrUnauthorized()
|
2017-06-30 04:55:25 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return send, nil
|
|
|
|
}
|