wip next steps gaia tx to msg type

This commit is contained in:
rigelrozanski 2018-02-26 00:47:59 +00:00
parent b284fd190f
commit d6b4c80465
2 changed files with 55 additions and 41 deletions

View File

@ -1,16 +1,17 @@
package stake package stake
import ( import (
"errors"
"fmt" "fmt"
"reflect"
"strconv" "strconv"
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/tendermint/tmlibs/log" crypto "github.com/tendermint/go-crypto"
"github.com/tendermint/tmlibs/rational" "github.com/tendermint/tmlibs/rational"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth"
coin "github.com/cosmos/cosmos-sdk/x/bank" // XXX fix
) )
// nolint // nolint
@ -32,46 +33,44 @@ type delegatedProofOfStake interface {
} }
type coinSend interface { type coinSend interface {
transferFn(sender, receiver sdk.Actor, coins coin.Coins) error transferFn(sender, receiver crypto.Address, coins sdk.Coins) error
} }
//_______________________________________________________________________ //_______________________________________________________________________
// Handler - the transaction processing handler // Handler - the transaction processing handler
type Handler struct { type Handler struct{}
}
// NewHandler returns a new Handler with the default Params // Handle all "bank" type messages.
func NewHandler() Handler { func NewHandler() sdk.Handler {
return Handler{} return func(ctx sdk.Context, msg sdk.Msg) sdk.Result {
}
// Name - return stake namespace switch msg := msg.(type) {
func (Handler) Name() string { case SendMsg:
return stakingModuleName return handleSendMsg(ctx, ck, msg)
case IssueMsg:
return handleIssueMsg(ctx, ck, msg)
default:
errMsg := "Unrecognized bank Msg type: " + reflect.TypeOf(msg).Name()
return sdk.ErrUnknownRequest(errMsg).Result()
}
}
} }
// InitState - set genesis parameters for staking // InitState - set genesis parameters for staking
func (h Handler) InitState(l log.Logger, store types.KVStore, func (h Handler) InitState(key, value string, store sdk.KVStore) error {
module, key, value string, cb sdk.InitStater) (log string, err error) { return h.initState(key, value, store)
return "", h.initState(module, key, value, store)
} }
// separated for testing // separated for testing
func (Handler) initState(module, key, value string, store types.KVStore) error { func (Handler) initState(key, value string, store sdk.KVStore) error {
if module != stakingModuleName {
return sdk.ErrUnknownModule(module)
}
params := loadParams(store) params := loadParams(store)
switch key { switch key {
case "allowed_bond_denom": case "allowed_bond_denom":
params.AllowedBondDenom = value params.AllowedBondDenom = value
case "max_vals", case "max_vals", "gas_bond", "gas_unbond":
"gas_bond",
"gas_unbond":
// TODO: enforce non-negative integers in input
i, err := strconv.Atoi(value) i, err := strconv.Atoi(value)
if err != nil { if err != nil {
return fmt.Errorf("input must be integer, Error: %v", err.Error()) return fmt.Errorf("input must be integer, Error: %v", err.Error())
@ -79,6 +78,9 @@ func (Handler) initState(module, key, value string, store types.KVStore) error {
switch key { switch key {
case "max_vals": case "max_vals":
if i < 0 {
return errors.New("cannot designate negative max validators")
}
params.MaxVals = uint16(i) params.MaxVals = uint16(i)
case "gas_bond": case "gas_bond":
params.GasDelegate = int64(i) params.GasDelegate = int64(i)
@ -94,7 +96,7 @@ func (Handler) initState(module, key, value string, store types.KVStore) error {
} }
// CheckTx checks if the tx is properly structured // CheckTx checks if the tx is properly structured
func (h Handler) CheckTx(ctx sdk.Context, store types.KVStore, func (h Handler) CheckTx(ctx sdk.Context, store sdk.KVStore,
tx sdk.Tx, _ sdk.Checker) (res sdk.CheckResult, err error) { tx sdk.Tx, _ sdk.Checker) (res sdk.CheckResult, err error) {
err = tx.ValidateBasic() err = tx.ValidateBasic()
@ -136,7 +138,7 @@ func (h Handler) CheckTx(ctx sdk.Context, store types.KVStore,
} }
// DeliverTx executes the tx if valid // DeliverTx executes the tx if valid
func (h Handler) DeliverTx(ctx sdk.Context, store types.KVStore, func (h Handler) DeliverTx(ctx sdk.Context, store sdk.KVStore,
tx sdk.Tx, dispatch sdk.Deliver) (res sdk.DeliverResult, err error) { tx sdk.Tx, dispatch sdk.Deliver) (res sdk.DeliverResult, err error) {
// TODO: remove redundancy // TODO: remove redundancy
@ -190,7 +192,7 @@ func (h Handler) DeliverTx(ctx sdk.Context, store types.KVStore,
} }
// get the sender from the ctx and ensure it matches the tx pubkey // get the sender from the ctx and ensure it matches the tx pubkey
func getTxSender(ctx sdk.Context) (sender sdk.Actor, err error) { func getTxSender(ctx sdk.Context) (sender crypto.Address, err error) {
senders := ctx.GetPermissions("", auth.NameSigs) senders := ctx.GetPermissions("", auth.NameSigs)
if len(senders) != 1 { if len(senders) != 1 {
return sender, ErrMissingSignature() return sender, ErrMissingSignature()
@ -201,15 +203,15 @@ func getTxSender(ctx sdk.Context) (sender sdk.Actor, err error) {
//_______________________________________________________________________ //_______________________________________________________________________
type coinSender struct { type coinSender struct {
store types.KVStore store sdk.KVStore
dispatch sdk.Deliver dispatch sdk.Deliver
ctx sdk.Context ctx sdk.Context
} }
var _ coinSend = coinSender{} // enforce interface at compile time var _ coinSend = coinSender{} // enforce interface at compile time
func (c coinSender) transferFn(sender, receiver sdk.Actor, coins coin.Coins) error { func (c coinSender) transferFn(sender, receiver crypto.Address, coins sdk.Coins) error {
send := coin.NewSendOneTx(sender, receiver, coins) send := sdk.NewSendOneTx(sender, receiver, coins)
// If the deduction fails (too high), abort the command // If the deduction fails (too high), abort the command
_, err := c.dispatch.DeliverTx(c.ctx, c.store, send) _, err := c.dispatch.DeliverTx(c.ctx, c.store, send)
@ -219,8 +221,8 @@ func (c coinSender) transferFn(sender, receiver sdk.Actor, coins coin.Coins) err
//_____________________________________________________________________ //_____________________________________________________________________
type check struct { type check struct {
store types.KVStore store sdk.KVStore
sender sdk.Actor sender crypto.Address
} }
var _ delegatedProofOfStake = check{} // enforce interface at compile time var _ delegatedProofOfStake = check{} // enforce interface at compile time
@ -285,7 +287,7 @@ func (c check) unbond(tx TxUnbond) error {
return nil return nil
} }
func checkDenom(tx BondUpdate, store types.KVStore) error { func checkDenom(tx BondUpdate, store sdk.KVStore) error {
if tx.Bond.Denom != loadParams(store).AllowedBondDenom { if tx.Bond.Denom != loadParams(store).AllowedBondDenom {
return fmt.Errorf("Invalid coin denomination") return fmt.Errorf("Invalid coin denomination")
} }
@ -295,14 +297,14 @@ func checkDenom(tx BondUpdate, store types.KVStore) error {
//_____________________________________________________________________ //_____________________________________________________________________
type deliver struct { type deliver struct {
store types.KVStore store sdk.KVStore
sender sdk.Actor sender crypto.Address
params Params params Params
gs *GlobalState gs *GlobalState
transfer transferFn transfer transferFn
} }
type transferFn func(sender, receiver sdk.Actor, coins coin.Coins) error type transferFn func(sender, receiver crypto.Address, coins sdk.Coins) error
var _ delegatedProofOfStake = deliver{} // enforce interface at compile time var _ delegatedProofOfStake = deliver{} // enforce interface at compile time
@ -320,7 +322,7 @@ func (d deliver) bondedToUnbondedPool(candidate *Candidate) error {
candidate.Status = Unbonded candidate.Status = Unbonded
return d.transfer(d.params.HoldBonded, d.params.HoldUnbonded, return d.transfer(d.params.HoldBonded, d.params.HoldUnbonded,
coin.Coins{{d.params.AllowedBondDenom, tokens}}) sdk.Coins{{d.params.AllowedBondDenom, tokens}})
} }
// move a candidates asset pool from unbonded to bonded pool // move a candidates asset pool from unbonded to bonded pool
@ -332,7 +334,7 @@ func (d deliver) unbondedToBondedPool(candidate *Candidate) error {
candidate.Status = Bonded candidate.Status = Bonded
return d.transfer(d.params.HoldUnbonded, d.params.HoldBonded, return d.transfer(d.params.HoldUnbonded, d.params.HoldBonded,
coin.Coins{{d.params.AllowedBondDenom, tokens}}) sdk.Coins{{d.params.AllowedBondDenom, tokens}})
} }
//_____________________________________________________________________ //_____________________________________________________________________
@ -399,7 +401,7 @@ func (d deliver) delegateWithCandidate(tx TxDelegate, candidate *Candidate) erro
return ErrBondNotNominated() return ErrBondNotNominated()
} }
var poolAccount sdk.Actor var poolAccount crypto.Address
if candidate.Status == Bonded { if candidate.Status == Bonded {
poolAccount = d.params.HoldBonded poolAccount = d.params.HoldBonded
} else { } else {
@ -408,7 +410,7 @@ func (d deliver) delegateWithCandidate(tx TxDelegate, candidate *Candidate) erro
// TODO maybe refactor into GlobalState.addBondedTokens(), maybe with new SDK // TODO maybe refactor into GlobalState.addBondedTokens(), maybe with new SDK
// Move coins from the delegator account to the bonded pool account // Move coins from the delegator account to the bonded pool account
err := d.transfer(d.sender, poolAccount, coin.Coins{tx.Bond}) err := d.transfer(d.sender, poolAccount, sdk.Coins{tx.Bond})
if err != nil { if err != nil {
return err return err
} }
@ -479,7 +481,7 @@ func (d deliver) unbond(tx TxUnbond) error {
} }
// transfer coins back to account // transfer coins back to account
var poolAccount sdk.Actor var poolAccount crypto.Address
if candidate.Status == Bonded { if candidate.Status == Bonded {
poolAccount = d.params.HoldBonded poolAccount = d.params.HoldBonded
} else { } else {
@ -488,7 +490,7 @@ func (d deliver) unbond(tx TxUnbond) error {
returnCoins := candidate.removeShares(shares, d.gs) returnCoins := candidate.removeShares(shares, d.gs)
err := d.transfer(poolAccount, d.sender, err := d.transfer(poolAccount, d.sender,
coin.Coins{{d.params.AllowedBondDenom, returnCoins}}) sdk.Coins{{d.params.AllowedBondDenom, returnCoins}})
if err != nil { if err != nil {
return err return err
} }

12
x/stake/wire.go Normal file
View File

@ -0,0 +1,12 @@
package bank
import (
"github.com/tendermint/go-wire"
)
// XXX complete
func RegisterWire(cdc *wire.Codec) {
// TODO include option to always include prefix bytes.
//cdc.RegisterConcrete(SendMsg{}, "cosmos-sdk/SendMsg", nil)
//cdc.RegisterConcrete(IssueMsg{}, "cosmos-sdk/IssueMsg", nil)
}