mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 23:35:19 +00:00
add validation
This commit is contained in:
parent
af4c28e1b7
commit
fbffc2d008
@ -58,60 +58,108 @@ func (keeper Keeper) setPaychan(pych Paychan) sdk.Error {
|
||||
bz := k.cdc.MustMarshalBinary(pych)
|
||||
// write to db
|
||||
pychKey := paychanKey(pych.sender, pych.receiver, pych.id)
|
||||
store.Set(pychKey, bz)
|
||||
// TODO handler errors
|
||||
store.Set(pychKey, bz) // panics if something goes wrong
|
||||
}
|
||||
|
||||
// Create a new payment channel and lock up sender funds.
|
||||
func (keeer Keeper) CreatePaychan(sender sdk.Address, receiver sdkAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) {
|
||||
func (keeer Keeper) CreatePaychan(ctx sdk.Context, sender sdk.Address, receiver sdkAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) {
|
||||
// TODO move validation somewhere nicer
|
||||
// args present
|
||||
if len(sender) == 0 {
|
||||
return sdk.ErrInvalidAddress(sender.String())
|
||||
}
|
||||
if len(receiver) == 0 {
|
||||
return sdk.ErrInvalidAddress(receiver.String())
|
||||
}
|
||||
if len(amount) == 0 {
|
||||
return sdk.ErrInvalidCoins(amount.String())
|
||||
}
|
||||
// Check if coins are sorted, non zero, positive
|
||||
if !amount.IsValid() {
|
||||
return sdk.ErrInvalidCoins(amount.String())
|
||||
}
|
||||
if !amount.IsPositive() {
|
||||
return sdk.ErrInvalidCoins(amount.String())
|
||||
}
|
||||
// sender should exist already as they had to sign.
|
||||
// receiver address exists. am is the account mapper in the coin keeper.
|
||||
// TODO automatically create account if not present?
|
||||
if k.coinKepper.am.GetAccount(ctx, receiver) == nil {
|
||||
return sdk.ErrUnknownAddress(receiver.String())
|
||||
}
|
||||
// sender has enough coins - done in Subtract method
|
||||
// TODO check if sender and receiver different?
|
||||
|
||||
|
||||
// Calculate next id (num existing paychans plus 1)
|
||||
id := len(keeper.GetPaychans(sender, receiver)) + 1 // TODO check for overflow?
|
||||
// subtract coins from sender
|
||||
k.coinKeeper.SubtractCoins(ctx, sender, amt)
|
||||
// create new Paychan struct (create ID)
|
||||
coins, tags, err := k.coinKeeper.SubtractCoins(ctx, sender, amt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// create new Paychan struct
|
||||
pych := Paychan{sender,
|
||||
receiver,
|
||||
id,
|
||||
balance: amt}
|
||||
receiver,
|
||||
id,
|
||||
balance: amt}
|
||||
// save to db
|
||||
err := k.setPaychan(pych)
|
||||
|
||||
|
||||
// TODO validation
|
||||
// coins valid and positive
|
||||
|
||||
// sender has enough coins - done in Subtract method
|
||||
// receiver address exists?
|
||||
// paychan doesn't exist already
|
||||
// sender and receiver different?
|
||||
|
||||
k.setPaychan(pych)
|
||||
|
||||
|
||||
// TODO create tags
|
||||
tags := sdk.NewTags()
|
||||
return tags, err
|
||||
}
|
||||
|
||||
// Close a payment channel and distribute funds to participants.
|
||||
func (keeper Keeper) ClosePaychan(sender sdk.Address, receiver sdk.Address, id integer, receiverAmt sdk.Coins) (sdk.Tags, sdk.Error) {
|
||||
pych := GetPaychan(ctx, sender, receiver, id)
|
||||
if len(msg.sender) == 0 {
|
||||
return sdk.ErrInvalidAddress(msg.sender.String())
|
||||
}
|
||||
if len(msg.receiver) == 0 {
|
||||
return sdk.ErrInvalidAddress(msg.receiver.String())
|
||||
}
|
||||
if len(msg.receiverAmount) == 0 {
|
||||
return sdk.ErrInvalidCoins(msg.receiverAmount.String())
|
||||
}
|
||||
// check id ≥ 0
|
||||
if msg.id < 0 {
|
||||
return sdk.ErrInvalidAddress(strconv.Itoa(id)) // TODO implement custom errors
|
||||
}
|
||||
|
||||
// Check if coins are sorted, non zero, non negative
|
||||
if !msg.receiverAmount.IsValid() {
|
||||
return sdk.ErrInvalidCoins(msg.receiverAmount.String())
|
||||
}
|
||||
if !msg.receiverAmount.IsPositive() {
|
||||
return sdk.ErrInvalidCoins(msg.receiverAmount.String())
|
||||
}
|
||||
|
||||
|
||||
store := ctx.KVStore(k.storeKey)
|
||||
|
||||
pych, exists := GetPaychan(ctx, sender, receiver, id)
|
||||
if !exists {
|
||||
return nil, sdk.ErrUnknownAddress() // TODO implement custom errors
|
||||
}
|
||||
// compute coin distribution
|
||||
senderAmt = pych.balance.Minus(receiverAmt) // Minus sdk.Coins method
|
||||
// check that receiverAmt not greater than paychan balance
|
||||
if !senderAmt.IsNotNegative() {
|
||||
return nil, sdk.ErrInsufficientFunds(pych.balance.String())
|
||||
}
|
||||
// add coins to sender
|
||||
// creating account if it doesn't exist
|
||||
k.coinKeeper.AddCoins(ctx, sender, senderAmt)
|
||||
// add coins to receiver
|
||||
k.coinKeeper.AddCoins(ctx, receiver, receiverAmt)
|
||||
|
||||
// delete paychan from db
|
||||
pychKey := paychanKey(pych.sender, pych.receiver, pych.id)
|
||||
store.Delete(pychKey)
|
||||
|
||||
|
||||
// TODO validation
|
||||
// id ≥ 0
|
||||
// coins valid and positive
|
||||
// paychan exists
|
||||
// output coins are equal to paychan balance
|
||||
// sender and receiver addresses exist?
|
||||
// overflow in sender and receiver balances?
|
||||
|
||||
// TODO create tags
|
||||
//sdk.NewTags(
|
||||
// "action", []byte("channel closure"),
|
||||
// "receiver", receiver.Bytes(),
|
||||
|
@ -1,6 +1,7 @@
|
||||
package paychan
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -78,24 +79,27 @@ func (msg MsgCreate) GetSignBytes() []byte {
|
||||
}
|
||||
|
||||
func (msg MsgCreate) ValidateBasic() sdk.Error {
|
||||
// TODO implement
|
||||
// Validate msg as an optimisation to avoid all validation going to keeper. It's run before the sigs are checked by the auth module.
|
||||
// Validate without external information (such as account balance)
|
||||
|
||||
// check if all fields present / not 0 valued
|
||||
// do coin checks for amount
|
||||
// check if Address valid?
|
||||
|
||||
// example from bank
|
||||
// if len(in.Address) == 0 {
|
||||
// return sdk.ErrInvalidAddress(in.Address.String())
|
||||
// }
|
||||
// if !in.Coins.IsValid() {
|
||||
// return sdk.ErrInvalidCoins(in.Coins.String())
|
||||
// }
|
||||
// if !in.Coins.IsPositive() {
|
||||
// return sdk.ErrInvalidCoins(in.Coins.String())
|
||||
// }
|
||||
if len(msg.sender) == 0 {
|
||||
return sdk.ErrInvalidAddress(msg.sender.String())
|
||||
}
|
||||
if len(msg.receiver) == 0 {
|
||||
return sdk.ErrInvalidAddress(msg.receiver.String())
|
||||
}
|
||||
if len(msg.amount) == 0 {
|
||||
return sdk.ErrInvalidCoins(msg.amount.String())
|
||||
}
|
||||
// Check if coins are sorted, non zero, non negative
|
||||
if !msg.amount.IsValid() {
|
||||
return sdk.ErrInvalidCoins(msg.amount.String())
|
||||
}
|
||||
if !msg.amount.IsPositive() {
|
||||
return sdk.ErrInvalidCoins(msg.amount.String())
|
||||
}
|
||||
// TODO check if Address valid?
|
||||
}
|
||||
|
||||
func (msg MsgCreate) GetSigners() []sdk.Address {
|
||||
@ -147,12 +151,28 @@ func (msg MsgClose) GetSignBytes() []byte {
|
||||
}
|
||||
|
||||
func (msg MsgClose) ValidateBasic() sdk.Error {
|
||||
// TODO implement
|
||||
|
||||
// check if all fields present / not 0 valued
|
||||
if len(msg.sender) == 0 {
|
||||
return sdk.ErrInvalidAddress(msg.sender.String())
|
||||
}
|
||||
if len(msg.receiver) == 0 {
|
||||
return sdk.ErrInvalidAddress(msg.receiver.String())
|
||||
}
|
||||
if len(msg.receiverAmount) == 0 {
|
||||
return sdk.ErrInvalidCoins(msg.receiverAmount.String())
|
||||
}
|
||||
// check id ≥ 0
|
||||
// do coin checks for amount
|
||||
// check if Address valid?
|
||||
if msg.id < 0 {
|
||||
return sdk.ErrInvalidAddress(strconv.Itoa(id)) // TODO implement custom errors
|
||||
}
|
||||
// Check if coins are sorted, non zero, non negative
|
||||
if !msg.receiverAmount.IsValid() {
|
||||
return sdk.ErrInvalidCoins(msg.receiverAmount.String())
|
||||
}
|
||||
if !msg.receiverAmount.IsPositive() {
|
||||
return sdk.ErrInvalidCoins(msg.receiverAmount.String())
|
||||
}
|
||||
// TODO check if Address valid?
|
||||
}
|
||||
|
||||
func (msg MsgClose) GetSigners() []sdk.Address {
|
||||
|
Loading…
Reference in New Issue
Block a user