basic provider fund locking implementation

master
michael 2022-09-07 23:06:55 +00:00
parent c9f73980ae
commit c85bbaca1f
5 changed files with 132 additions and 30 deletions

View File

@ -37,6 +37,7 @@ message MsgNewBidResponse {
message MsgLockFunds {
string creator = 1;
string amount = 2;
}
message MsgLockFundsResponse {

View File

@ -4,6 +4,7 @@ import (
"strconv"
"colinear/x/colinearcore/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
@ -14,9 +15,9 @@ var _ = strconv.Itoa(0)
func CmdLockFunds() *cobra.Command {
cmd := &cobra.Command{
Use: "lock-funds",
Use: "lock-funds [amount in uCLR]",
Short: "Broadcast message lockFunds",
Args: cobra.ExactArgs(0),
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) (err error) {
clientCtx, err := client.GetClientTxContext(cmd)
@ -24,8 +25,11 @@ func CmdLockFunds() *cobra.Command {
return err
}
argAmount := args[0]
msg := types.NewMsgLockFunds(
clientCtx.GetFromAddress().String(),
argAmount,
)
if err := msg.ValidateBasic(); err != nil {
return err

View File

@ -2,7 +2,10 @@ package keeper
import (
"context"
"fmt"
"math/big"
"colinear/x/colinearcore/auctionconfig"
"colinear/x/colinearcore/types"
sdk "github.com/cosmos/cosmos-sdk/types"
@ -11,8 +14,50 @@ import (
func (k msgServer) LockFunds(goCtx context.Context, msg *types.MsgLockFunds) (*types.MsgLockFundsResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
// TODO
_ = ctx
senderAddr, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return nil, fmt.Errorf("must be a bech32-formatted address: %s", msg.Creator)
}
lockedUsers, found := k.Keeper.GetLockedUsers(ctx)
if !found {
// initialize if not yet initialized
lockedUsers = types.LockedUsers{
Users: map[string]string{},
}
// return nil, errors.New("unable to get locked users")
}
required := big.NewInt(auctionconfig.ProviderMinLockedUClr)
paying := new(big.Int)
paying.SetString(msg.Amount, 10)
prevAmountS, ok := lockedUsers.Users[msg.Creator]
if !ok { // not found
prevAmountS = "0"
}
prevAmount := new(big.Int)
prevAmount.SetString(prevAmountS, 10)
// make sure that total amount after lock meets minimum required locked amount
totalAfterPay := new(big.Int)
totalAfterPay.Add(prevAmount, paying)
if totalAfterPay.Cmp(required) == -1 {
return nil, fmt.Errorf("final locked amount must be above minimum required (actual: %s)", totalAfterPay.String())
}
spendable := k.bank.SpendableCoins(ctx, senderAddr)
if spendable.AmountOf("uclr").BigInt().Cmp(paying) != -1 {
sendCoins := sdk.NewCoins(sdk.NewCoin("uclr", sdk.NewIntFromBigInt(paying)))
if err := k.bank.SendCoinsFromAccountToModule(ctx, senderAddr, types.ModuleName, sendCoins); err != nil {
return nil, fmt.Errorf("failed to lock %s CLR in bank module: %s", paying.String(), err)
}
} else {
return nil, fmt.Errorf("not enough balance to lock %s CLR (your balance: %s)", paying.String(), spendable.AmountOf("clr").String())
}
lockedUsers.Users[msg.Creator] = totalAfterPay.String()
return &types.MsgLockFundsResponse{}, nil
}

View File

@ -9,9 +9,10 @@ const TypeMsgLockFunds = "lock_funds"
var _ sdk.Msg = &MsgLockFunds{}
func NewMsgLockFunds(creator string) *MsgLockFunds {
func NewMsgLockFunds(creator string, amount string) *MsgLockFunds {
return &MsgLockFunds{
Creator: creator,
Amount: amount,
}
}

View File

@ -253,6 +253,7 @@ var xxx_messageInfo_MsgNewBidResponse proto.InternalMessageInfo
type MsgLockFunds struct {
Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"`
Amount string `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"`
}
func (m *MsgLockFunds) Reset() { *m = MsgLockFunds{} }
@ -295,6 +296,13 @@ func (m *MsgLockFunds) GetCreator() string {
return ""
}
func (m *MsgLockFunds) GetAmount() string {
if m != nil {
return m.Amount
}
return ""
}
type MsgLockFundsResponse struct {
}
@ -343,31 +351,31 @@ func init() {
func init() { proto.RegisterFile("colinearcore/tx.proto", fileDescriptor_0c3854a2a9bba3b4) }
var fileDescriptor_0c3854a2a9bba3b4 = []byte{
// 376 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xcb, 0x4a, 0xc3, 0x40,
0x14, 0x6d, 0xfa, 0x88, 0xe6, 0x5a, 0x17, 0x8e, 0x6d, 0x09, 0x41, 0x43, 0x88, 0x2e, 0x02, 0x4a,
0x0a, 0x8a, 0xb8, 0xb6, 0xa0, 0x20, 0x58, 0x17, 0xc5, 0x95, 0x20, 0x18, 0x33, 0x97, 0x10, 0x6c,
0x67, 0x42, 0x26, 0xc5, 0xfa, 0x17, 0x7e, 0x80, 0x7f, 0xe0, 0x8f, 0xb8, 0xec, 0xd2, 0xa5, 0xb4,
0x3f, 0x22, 0xe6, 0xd5, 0x04, 0x6c, 0xed, 0x6e, 0xce, 0x99, 0x73, 0xce, 0xdc, 0x7b, 0x87, 0x0b,
0x6d, 0x97, 0x0f, 0x7d, 0x86, 0x4e, 0xe8, 0xf2, 0x10, 0xbb, 0xd1, 0xc4, 0x0e, 0x42, 0x1e, 0x71,
0x92, 0xd3, 0x76, 0xf1, 0xde, 0xfc, 0x90, 0x60, 0xbb, 0x2f, 0xbc, 0x5b, 0x7c, 0xb9, 0x18, 0xbb,
0x91, 0xcf, 0x19, 0x51, 0x61, 0xc3, 0x0d, 0xd1, 0x89, 0x78, 0xa8, 0x4a, 0x86, 0x64, 0x29, 0x83,
0x0c, 0x12, 0x02, 0x75, 0xe6, 0x8c, 0x50, 0xad, 0xc6, 0x74, 0x7c, 0x26, 0x06, 0x6c, 0x51, 0x14,
0x6e, 0xe8, 0x07, 0xbf, 0x66, 0xb5, 0x16, 0x5f, 0x15, 0xa9, 0x38, 0x0f, 0xfd, 0xa1, 0xcf, 0x3c,
0xb5, 0x9e, 0xe6, 0x25, 0x90, 0xb4, 0xa0, 0x41, 0x91, 0xf1, 0x91, 0xda, 0x88, 0xf9, 0x04, 0x10,
0x0d, 0x36, 0x87, 0xe8, 0x08, 0xbc, 0x64, 0x54, 0x95, 0x0d, 0xc9, 0xaa, 0x0f, 0x72, 0x6c, 0x9e,
0x41, 0xbb, 0x54, 0xec, 0x00, 0x45, 0xc0, 0x99, 0x40, 0xb2, 0x07, 0x8a, 0x93, 0x50, 0xd7, 0x34,
0x2d, 0x7b, 0x41, 0x98, 0x0e, 0x28, 0x89, 0xad, 0xe7, 0xd3, 0x15, 0xfd, 0x99, 0xd0, 0xcc, 0x3c,
0x8c, 0xe2, 0x24, 0xed, 0xb3, 0xc4, 0x91, 0x0e, 0xc8, 0xce, 0x88, 0x8f, 0x59, 0x94, 0xb6, 0x9a,
0x22, 0x73, 0x17, 0x76, 0xf2, 0x27, 0xb2, 0xaa, 0x4c, 0x0b, 0x9a, 0x7d, 0xe1, 0xdd, 0x70, 0xf7,
0xf9, 0x6a, 0xcc, 0xa8, 0x58, 0xfe, 0xb4, 0xd9, 0x81, 0x56, 0x51, 0x99, 0x25, 0x9c, 0xbc, 0x57,
0xa1, 0xd6, 0x17, 0x1e, 0x79, 0x04, 0x28, 0x7c, 0xd1, 0xa1, 0xfd, 0xe7, 0x67, 0xda, 0xa5, 0xd9,
0x68, 0xc7, 0xeb, 0xa8, 0xf2, 0x09, 0xde, 0x81, 0x9c, 0x0e, 0xc8, 0x58, 0xe9, 0xeb, 0xf9, 0x54,
0xb3, 0xfe, 0x53, 0xe4, 0xa9, 0x0f, 0xa0, 0x2c, 0xda, 0x3f, 0x58, 0x6e, 0xcb, 0x45, 0xda, 0xd1,
0x1a, 0xa2, 0x2c, 0xbe, 0x77, 0xfe, 0x39, 0xd3, 0xa5, 0xe9, 0x4c, 0x97, 0xbe, 0x67, 0xba, 0xf4,
0x36, 0xd7, 0x2b, 0xd3, 0xb9, 0x5e, 0xf9, 0x9a, 0xeb, 0x95, 0xfb, 0xfd, 0xcc, 0xdc, 0x9d, 0x74,
0xcb, 0x0b, 0xf1, 0x1a, 0xa0, 0x78, 0x92, 0xe3, 0xa5, 0x38, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff,
0x3b, 0x99, 0x2d, 0x8c, 0x2d, 0x03, 0x00, 0x00,
// 383 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xcd, 0x4a, 0xf3, 0x40,
0x14, 0x6d, 0xfa, 0x93, 0xef, 0xcb, 0xfd, 0xfa, 0x2d, 0x1c, 0xdb, 0x12, 0x82, 0x86, 0x10, 0x5d,
0x14, 0x94, 0x14, 0x14, 0x71, 0xab, 0x05, 0x05, 0xc1, 0xba, 0x28, 0xae, 0x04, 0xc1, 0x98, 0xb9,
0x84, 0xc1, 0x76, 0x26, 0x64, 0x52, 0xac, 0x6f, 0xe1, 0x03, 0xf8, 0x06, 0xbe, 0x88, 0xcb, 0x2e,
0x5d, 0x4a, 0xfb, 0x22, 0x62, 0xfe, 0x9a, 0x80, 0xd6, 0xee, 0xe6, 0x9c, 0xb9, 0xe7, 0xcc, 0xbd,
0x67, 0xb8, 0xd0, 0xf6, 0xc4, 0x88, 0x71, 0x74, 0x43, 0x4f, 0x84, 0xd8, 0x8b, 0xa6, 0x4e, 0x10,
0x8a, 0x48, 0x90, 0x9c, 0x76, 0x8a, 0xf7, 0xf6, 0xab, 0x02, 0xff, 0x07, 0xd2, 0xbf, 0xc2, 0xc7,
0xd3, 0x89, 0x17, 0x31, 0xc1, 0x89, 0x0e, 0x7f, 0xbc, 0x10, 0xdd, 0x48, 0x84, 0xba, 0x62, 0x29,
0x5d, 0x6d, 0x98, 0x41, 0x42, 0xa0, 0xce, 0xdd, 0x31, 0xea, 0xd5, 0x98, 0x8e, 0xcf, 0xc4, 0x82,
0x7f, 0x14, 0xa5, 0x17, 0xb2, 0xe0, 0x4b, 0xac, 0xd7, 0xe2, 0xab, 0x22, 0x15, 0xfb, 0x21, 0x1b,
0x31, 0xee, 0xeb, 0xf5, 0xd4, 0x2f, 0x81, 0xa4, 0x05, 0x0d, 0x8a, 0x5c, 0x8c, 0xf5, 0x46, 0xcc,
0x27, 0x80, 0x18, 0xf0, 0x77, 0x84, 0xae, 0xc4, 0x33, 0x4e, 0x75, 0xd5, 0x52, 0xba, 0xf5, 0x61,
0x8e, 0xed, 0x23, 0x68, 0x97, 0x9a, 0x1d, 0xa2, 0x0c, 0x04, 0x97, 0x48, 0xb6, 0x40, 0x73, 0x13,
0xea, 0x82, 0xa6, 0x6d, 0x2f, 0x09, 0xdb, 0x05, 0x2d, 0x91, 0xf5, 0x19, 0x5d, 0x31, 0x9f, 0x0d,
0xcd, 0x4c, 0xc3, 0x29, 0x4e, 0xd3, 0x39, 0x4b, 0x1c, 0xe9, 0x80, 0xea, 0x8e, 0xc5, 0x84, 0x47,
0xe9, 0xa8, 0x29, 0xb2, 0x37, 0x61, 0x23, 0x7f, 0x22, 0xeb, 0xca, 0x3e, 0x81, 0xe6, 0x40, 0xfa,
0x97, 0xc2, 0x7b, 0x38, 0x9f, 0x70, 0x2a, 0x57, 0x3c, 0xbd, 0xb4, 0xad, 0x96, 0x6c, 0x3b, 0xd0,
0x2a, 0x3a, 0x64, 0xce, 0x07, 0x2f, 0x55, 0xa8, 0x0d, 0xa4, 0x4f, 0xee, 0x00, 0x0a, 0x5f, 0xb7,
0xeb, 0x7c, 0xfb, 0xc9, 0x4e, 0x29, 0x33, 0x63, 0x7f, 0x9d, 0xaa, 0x3c, 0xd9, 0x6b, 0x50, 0xd3,
0xe0, 0xac, 0x95, 0xba, 0x3e, 0xa3, 0x46, 0xf7, 0xb7, 0x8a, 0xdc, 0xf5, 0x16, 0xb4, 0x65, 0x2c,
0x3b, 0x3f, 0xcb, 0xf2, 0x22, 0x63, 0x6f, 0x8d, 0xa2, 0xcc, 0xbe, 0x7f, 0xfc, 0x36, 0x37, 0x95,
0xd9, 0xdc, 0x54, 0x3e, 0xe6, 0xa6, 0xf2, 0xbc, 0x30, 0x2b, 0xb3, 0x85, 0x59, 0x79, 0x5f, 0x98,
0x95, 0x9b, 0xed, 0x4c, 0xdc, 0x9b, 0xf6, 0xca, 0x8b, 0xf2, 0x14, 0xa0, 0xbc, 0x57, 0xe3, 0x65,
0x39, 0xfc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x79, 0x5d, 0x54, 0xc3, 0x45, 0x03, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -702,6 +710,13 @@ func (m *MsgLockFunds) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Amount) > 0 {
i -= len(m.Amount)
copy(dAtA[i:], m.Amount)
i = encodeVarintTx(dAtA, i, uint64(len(m.Amount)))
i--
dAtA[i] = 0x12
}
if len(m.Creator) > 0 {
i -= len(m.Creator)
copy(dAtA[i:], m.Creator)
@ -831,6 +846,10 @@ func (m *MsgLockFunds) Size() (n int) {
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
l = len(m.Amount)
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
return n
}
@ -1417,6 +1436,38 @@ func (m *MsgLockFunds) Unmarshal(dAtA []byte) error {
}
m.Creator = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTx
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTx
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTx
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Amount = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:])