Update middlewares to new interface

This commit is contained in:
Ethan Frey 2017-06-27 19:40:48 +02:00
parent eed1bf753d
commit f6395c8981
2 changed files with 21 additions and 39 deletions

View File

@ -23,22 +23,17 @@ type AccountChecker interface {
type SimpleFeeHandler struct {
AccountChecker
MinFee types.Coins
Inner basecoin.Handler
}
func (h SimpleFeeHandler) Next() basecoin.Handler {
return h.Inner
}
func (_ SimpleFeeHandler) Name() string {
return NameFee
}
var _ basecoin.Handler = SimpleFeeHandler{}
var _ basecoin.Middleware = SimpleFeeHandler{}
// Yes, I know refactor a bit... really too late already
func (h SimpleFeeHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
func (h SimpleFeeHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Checker) (res basecoin.Result, err error) {
feeTx, ok := tx.Unwrap().(*txs.Fee)
if !ok {
return res, errors.InvalidFormat()
@ -61,7 +56,7 @@ func (h SimpleFeeHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx
return basecoin.Result{Log: "Valid tx"}, nil
}
func (h SimpleFeeHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
func (h SimpleFeeHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.Result, err error) {
feeTx, ok := tx.Unwrap().(*txs.Fee)
if !ok {
return res, errors.InvalidFormat()
@ -81,5 +76,5 @@ func (h SimpleFeeHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, t
return res, err
}
return h.Next().DeliverTx(ctx, store, feeTx.Next())
return next.DeliverTx(ctx, store, feeTx.Next())
}

View File

@ -15,57 +15,36 @@ const (
type SignedHandler struct {
AllowMultiSig bool
Inner basecoin.Handler
}
func (_ SignedHandler) Name() string {
return NameSigs
}
func (h SignedHandler) Next() basecoin.Handler {
return h.Inner
}
var _ basecoin.Handler = SignedHandler{}
var _ basecoin.Middleware = SignedHandler{}
// Signed allows us to use txs.OneSig and txs.MultiSig (and others??)
type Signed interface {
basecoin.TxLayer
Signers() ([]crypto.PubKey, error)
}
func (h SignedHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
var sigs []crypto.PubKey
stx, ok := tx.Unwrap().(Signed)
if !ok {
return res, errors.Unauthorized()
}
sigs, err = stx.Signers()
func (h SignedHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Checker) (res basecoin.Result, err error) {
sigs, tnext, err := getSigners(tx)
if err != nil {
return res, err
}
ctx2 := addSigners(ctx, sigs)
return h.Next().CheckTx(ctx2, store, stx.Next())
return next.CheckTx(ctx2, store, tnext)
}
func (h SignedHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
var sigs []crypto.PubKey
stx, ok := tx.Unwrap().(Signed)
if !ok {
return res, errors.Unauthorized()
}
sigs, err = stx.Signers()
func (h SignedHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.Result, err error) {
sigs, tnext, err := getSigners(tx)
if err != nil {
return res, err
}
// add the signers to the context and continue
ctx2 := addSigners(ctx, sigs)
return h.Next().DeliverTx(ctx2, store, stx.Next())
return next.DeliverTx(ctx2, store, tnext)
}
func addSigners(ctx basecoin.Context, sigs []crypto.PubKey) basecoin.Context {
@ -73,7 +52,15 @@ func addSigners(ctx basecoin.Context, sigs []crypto.PubKey) basecoin.Context {
for i, s := range sigs {
perms[i] = basecoin.Permission{App: NameSigs, Address: s.Address()}
}
// add the signers to the context and continue
return ctx.AddPermissions(perms...)
}
func getSigners(tx basecoin.Tx) ([]crypto.PubKey, basecoin.Tx, error) {
stx, ok := tx.Unwrap().(Signed)
if !ok {
return nil, basecoin.Tx{}, errors.Unauthorized()
}
sig, err := stx.Signers()
return sig, stx.Next(), err
}