93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
package staking
|
|
|
|
import (
|
|
crypto "github.com/tendermint/go-crypto"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
wire "github.com/cosmos/cosmos-sdk/wire"
|
|
)
|
|
|
|
type StakingMapper struct {
|
|
key sdk.StoreKey
|
|
cdc *wire.Codec
|
|
}
|
|
|
|
func NewMapper(key sdk.StoreKey) StakingMapper {
|
|
cdc := wire.NewCodec()
|
|
return StakingMapper{
|
|
key: key,
|
|
cdc: cdc,
|
|
}
|
|
}
|
|
|
|
func (sm StakingMapper) getBondInfo(ctx sdk.Context, addr sdk.Address) bondInfo {
|
|
store := ctx.KVStore(sm.key)
|
|
bz := store.Get(addr)
|
|
if bz == nil {
|
|
return bondInfo{}
|
|
}
|
|
var bi bondInfo
|
|
err := sm.cdc.UnmarshalBinary(bz, &bi)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return bi
|
|
}
|
|
|
|
func (sm StakingMapper) setBondInfo(ctx sdk.Context, addr sdk.Address, bi bondInfo) {
|
|
store := ctx.KVStore(sm.key)
|
|
bz, err := sm.cdc.MarshalBinary(bi)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
store.Set(addr, bz)
|
|
}
|
|
|
|
func (sm StakingMapper) deleteBondInfo(ctx sdk.Context, addr sdk.Address) {
|
|
store := ctx.KVStore(sm.key)
|
|
store.Delete(addr)
|
|
}
|
|
|
|
func (sm StakingMapper) Bond(ctx sdk.Context, addr sdk.Address, pubKey crypto.PubKey, power int64) (int64, sdk.Error) {
|
|
|
|
bi := sm.getBondInfo(ctx, addr)
|
|
if bi.isEmpty() {
|
|
bi = bondInfo{
|
|
PubKey: pubKey,
|
|
Power: power,
|
|
}
|
|
sm.setBondInfo(ctx, addr, bi)
|
|
return bi.Power, nil
|
|
}
|
|
|
|
newPower := bi.Power + power
|
|
newBi := bondInfo{
|
|
PubKey: bi.PubKey,
|
|
Power: newPower,
|
|
}
|
|
sm.setBondInfo(ctx, addr, newBi)
|
|
|
|
return newBi.Power, nil
|
|
}
|
|
|
|
func (sm StakingMapper) Unbond(ctx sdk.Context, addr sdk.Address) (crypto.PubKey, int64, sdk.Error) {
|
|
bi := sm.getBondInfo(ctx, addr)
|
|
if bi.isEmpty() {
|
|
return crypto.PubKey{}, 0, ErrInvalidUnbond()
|
|
}
|
|
sm.deleteBondInfo(ctx, addr)
|
|
return bi.PubKey, bi.Power, nil
|
|
}
|
|
|
|
type bondInfo struct {
|
|
PubKey crypto.PubKey
|
|
Power int64
|
|
}
|
|
|
|
func (bi bondInfo) isEmpty() bool {
|
|
if bi == (bondInfo{}) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|