2017-07-10 04:50:11 -07:00
|
|
|
package roles
|
|
|
|
|
2017-07-10 10:41:17 -07:00
|
|
|
import (
|
|
|
|
"github.com/tendermint/basecoin"
|
|
|
|
"github.com/tendermint/basecoin/errors"
|
|
|
|
"github.com/tendermint/basecoin/state"
|
|
|
|
)
|
|
|
|
|
2017-08-03 10:27:06 -07:00
|
|
|
const (
|
|
|
|
//NameRole - name space of the roles module
|
|
|
|
NameRole = "role"
|
|
|
|
// CostCreate is the cost to create a new role
|
2017-08-04 05:11:01 -07:00
|
|
|
CostCreate = uint64(40)
|
2017-08-03 10:27:06 -07:00
|
|
|
// CostAssume is the cost to assume a role as part of a tx
|
2017-08-04 05:11:01 -07:00
|
|
|
CostAssume = uint64(5)
|
2017-08-03 10:27:06 -07:00
|
|
|
)
|
2017-07-10 10:41:17 -07:00
|
|
|
|
2017-07-11 05:10:40 -07:00
|
|
|
// Handler allows us to create new roles
|
|
|
|
type Handler struct {
|
2017-07-30 14:26:25 -07:00
|
|
|
basecoin.NopInitState
|
|
|
|
basecoin.NopInitValidate
|
2017-07-11 05:10:40 -07:00
|
|
|
}
|
2017-07-10 10:41:17 -07:00
|
|
|
|
|
|
|
var _ basecoin.Handler = Handler{}
|
|
|
|
|
|
|
|
// NewHandler makes a role handler to create roles
|
|
|
|
func NewHandler() Handler {
|
|
|
|
return Handler{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Name - return name space
|
|
|
|
func (Handler) Name() string {
|
|
|
|
return NameRole
|
|
|
|
}
|
|
|
|
|
2017-07-11 05:10:40 -07:00
|
|
|
// CheckTx verifies if the transaction is properly formated
|
2017-07-30 08:45:08 -07:00
|
|
|
func (h Handler) CheckTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx) (res basecoin.CheckResult, err error) {
|
2017-07-12 07:22:17 -07:00
|
|
|
var cr CreateRoleTx
|
|
|
|
cr, err = checkTx(ctx, tx)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
2017-08-03 10:27:06 -07:00
|
|
|
res = basecoin.NewCheck(CostCreate, "")
|
2017-07-12 07:22:17 -07:00
|
|
|
err = checkNoRole(store, cr.Role)
|
|
|
|
return
|
2017-07-10 10:41:17 -07:00
|
|
|
}
|
|
|
|
|
2017-07-11 05:10:40 -07:00
|
|
|
// DeliverTx tries to create a new role.
|
|
|
|
//
|
|
|
|
// Returns an error if the role already exists
|
2017-07-30 08:45:08 -07:00
|
|
|
func (h Handler) DeliverTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx) (res basecoin.DeliverResult, err error) {
|
2017-07-10 10:41:17 -07:00
|
|
|
create, err := checkTx(ctx, tx)
|
|
|
|
if err != nil {
|
|
|
|
return res, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// lets try...
|
|
|
|
role := NewRole(create.MinSigs, create.Signers)
|
2017-07-11 06:11:10 -07:00
|
|
|
err = createRole(store, create.Role, role)
|
2017-07-10 10:41:17 -07:00
|
|
|
return res, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func checkTx(ctx basecoin.Context, tx basecoin.Tx) (create CreateRoleTx, err error) {
|
|
|
|
// check if the tx is proper type and valid
|
|
|
|
create, ok := tx.Unwrap().(CreateRoleTx)
|
|
|
|
if !ok {
|
2017-07-12 10:06:55 -07:00
|
|
|
return create, errors.ErrInvalidFormat(TypeCreateRoleTx, tx)
|
2017-07-10 10:41:17 -07:00
|
|
|
}
|
|
|
|
err = create.ValidateBasic()
|
|
|
|
return create, err
|
|
|
|
}
|