62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
|
package handlers
|
||
|
|
||
|
import (
|
||
|
crypto "github.com/tendermint/go-crypto"
|
||
|
|
||
|
"github.com/tendermint/basecoin"
|
||
|
"github.com/tendermint/basecoin/errors"
|
||
|
"github.com/tendermint/basecoin/types"
|
||
|
)
|
||
|
|
||
|
type SignedHandler struct {
|
||
|
AllowMultiSig bool
|
||
|
Inner basecoin.Handler
|
||
|
}
|
||
|
|
||
|
func (h SignedHandler) Next() basecoin.Handler {
|
||
|
return h.Inner
|
||
|
}
|
||
|
|
||
|
var _ basecoin.Handler = SignedHandler{}
|
||
|
|
||
|
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()
|
||
|
if err != nil {
|
||
|
return res, err
|
||
|
}
|
||
|
|
||
|
// add the signers to the context and continue
|
||
|
ctx2 := ctx.AddSigners(sigs...)
|
||
|
return h.Next().CheckTx(ctx2, store, stx.Next())
|
||
|
}
|
||
|
|
||
|
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()
|
||
|
if err != nil {
|
||
|
return res, err
|
||
|
}
|
||
|
|
||
|
// add the signers to the context and continue
|
||
|
ctx2 := ctx.AddSigners(sigs...)
|
||
|
return h.Next().DeliverTx(ctx2, store, stx.Next())
|
||
|
}
|