Skip to content

Commit

Permalink
chore: add query for latest order according to source maker and desti…
Browse files Browse the repository at this point in the history
…nation maker
  • Loading branch information
soring323 committed Jul 25, 2023
1 parent 9217f71 commit e540b8a
Show file tree
Hide file tree
Showing 21 changed files with 714 additions and 206 deletions.
2 changes: 2 additions & 0 deletions modules/apps/100-atomic-swap/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ func (k Keeper) OnReceivedMake(ctx sdk.Context, packet channeltypes.Packet, orde
// OnReceivedTake is step 7.1 (Transfer Make Token) of the atomic swap: https://github.com/cosmos/ibc/tree/main/spec/app/ics-100-atomic-swap
// The step is executed on the Maker chain.
func (k Keeper) OnReceivedTake(ctx sdk.Context, packet channeltypes.Packet, msg *types.TakeSwapMsg) (string, error) {


escrowAddr := types.GetEscrowAddress(packet.GetDestPort(), packet.GetDestChannel())

// check order status
Expand Down
5 changes: 5 additions & 0 deletions modules/apps/100-atomic-swap/keeper/msg_server_take_swap.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ func (k Keeper) TakeSwap(goCtx context.Context, msg *types.TakeSwapMsg) (*types.
return &types.MsgTakeSwapResponse{}, err
}

_, err = sdk.AccAddressFromBech32(msg.TakerReceivingAddress)
if err == nil {
return &types.MsgTakeSwapResponse{}, types.ErrFailedMakeSwap
}

balance := k.bankKeeper.GetBalance(ctx, takerAddr, msg.SellToken.Denom)
if balance.Amount.LT(msg.SellToken.Amount) {
return &types.MsgTakeSwapResponse{}, errors.New("insufficient balance")
Expand Down
1 change: 1 addition & 0 deletions modules/apps/100-atomic-swap/keeper/relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ func (k Keeper) OnAcknowledgementPacket(ctx sdk.Context, packet channeltypes.Pac

order, _ := k.GetAtomicOrder(ctx, takeMsg.OrderId)
escrowAddr := types.GetEscrowAddress(types.PortID, packet.SourceChannel)

makerReceivingAddr, err := sdk.AccAddressFromBech32(order.Maker.MakerReceivingAddress)
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions modules/apps/100-atomic-swap/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ var (
ErrOrderPermissionIsNotAllowed = sdkerrors.Register(ModuleName, 17, "sender is not the owner of the order")
ErrNotFoundChannel = sdkerrors.Register(ModuleName, 18, "did not find channel")
ErrFailedMakeSwap = sdkerrors.Register(ModuleName, 19, "Failed to make swap")
ErrInvalidTakerReceiverAddress = sdkerrors.Register(ModuleName, 20, "Taker Address has counter party chain address")
)
6 changes: 3 additions & 3 deletions modules/apps/100-atomic-swap/types/msgs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func TestMsgSwapRoute(t *testing.T) {
//},
{
"new msg cancel swap route",
NewMsgCancelSwap(validPort, validChannel, addr1, "", timeoutHeight, 0).Route(),
NewMsgCancelSwap(addr1, "", timeoutHeight, 0).Route(),
RouterKey,
},
}
Expand Down Expand Up @@ -105,7 +105,7 @@ func TestMsgSwapValidation(t *testing.T) {
//},
{
"new msg cancel swap message type",
NewMsgCancelSwap(validPort, validChannel, addr1, "", timeoutHeight, 0).Type(),
NewMsgCancelSwap(addr1, "", timeoutHeight, 0).Type(),
"cancel_swap",
},
}
Expand Down Expand Up @@ -135,7 +135,7 @@ func TestMsgSwapGetSigners(t *testing.T) {
//},
{
"new msg cancel swap get signers",
NewMsgCancelSwap(validPort, validChannel, addr.String(), "", timeoutHeight, 0).GetSigners(),
NewMsgCancelSwap(addr.String(), "", timeoutHeight, 0).GetSigners(),
[]sdk.AccAddress{addr},
},
}
Expand Down
13 changes: 2 additions & 11 deletions modules/apps/101-interchain-swap/keeper/msg_server.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package keeper

import (
"github.com/btcsuite/btcutil/bech32"
sdk "github.com/cosmos/cosmos-sdk/types"
errorsmod "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/sideprotocol/ibcswap/v6/modules/apps/101-interchain-swap/types"
Expand Down Expand Up @@ -95,7 +94,7 @@ func (k Keeper) OnSingleAssetDepositAcknowledged(ctx sdk.Context, req *types.Msg
}

// OnMultiAssetDepositAcknowledged processes a double deposit acknowledgement, mints voucher tokens, and updates the liquidity pool.
func (k Keeper) OnMakeMultiAssetDepositAcknowledged(ctx sdk.Context, req *types.MsgMakeMultiAssetDepositRequest, res *types.MsgMultiAssetDepositResponse) error {
func (k Keeper) OnMakeMultiAssetDepositAcknowledged(ctx sdk.Context, req *types.MsgMakeMultiAssetDepositRequest) error {

// Retrieve the liquidity pool
pool, found := k.GetInterchainLiquidityPool(ctx, req.PoolId)
Expand Down Expand Up @@ -270,25 +269,17 @@ func (k Keeper) OnSingleAssetDepositReceived(ctx sdk.Context, msg *types.MsgSing
func (k Keeper) OnMakeMultiAssetDepositReceived(ctx sdk.Context, msg *types.MsgMakeMultiAssetDepositRequest, stateChange *types.StateChange) (*types.MsgMultiAssetDepositResponse, error) {

// Verify the sender's address
senderAcc := k.authKeeper.GetAccount(ctx, sdk.MustAccAddressFromBech32(msg.Deposits[1].Sender))
senderPrefix, _, err := bech32.Decode(senderAcc.GetAddress().String())
_, err := sdk.AccAddressFromBech32(msg.Deposits[1].Sender)
if err != nil {
return nil, err
}
if sdk.GetConfig().GetBech32AccountAddrPrefix() != senderPrefix {
return nil, errorsmod.Wrapf(types.ErrFailedMultiAssetDeposit, "first address has to be this chain address (%s)", err)
}

// Retrieve the liquidity pool
pool, found := k.GetInterchainLiquidityPool(ctx, msg.PoolId)
if !found {
return nil, errorsmod.Wrapf(types.ErrFailedMultiAssetDeposit, "%s", types.ErrNotFoundPool)
}

if err != nil {
return nil, errorsmod.Wrapf(types.ErrFailedMultiAssetDeposit, ":%s", err)
}

// create order
order := types.MultiAssetDepositOrder{
PoolId: msg.PoolId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,21 @@ func (k Keeper) MakeMultiAssetDeposit(ctx context.Context, msg *types.MsgMakeMul
}

// Check input ration of tokens
sourceAsset, err := pool.FindAssetBySide(types.PoolAssetSide_SOURCE)
sourceAsset, err := pool.FindAssetByDenom(msg.Deposits[0].Balance.Denom)
if err != nil {
return nil, errormod.Wrapf(types.ErrNotFoundDenomInPool, "%s", types.ErrFailedMultiAssetDeposit)
}

destinationAsset, err := pool.FindAssetBySide(types.PoolAssetSide_DESTINATION)
destinationAsset, err := pool.FindAssetByDenom(msg.Deposits[1].Balance.Denom)
if err != nil {
return nil, errormod.Wrapf(types.ErrNotFoundDenomInPool, "%s:", types.ErrFailedMultiAssetDeposit)
}

currentRatio := sourceAsset.Amount.Quo(destinationAsset.Amount)
inputRatio := msg.Deposits[0].Balance.Amount.Quo(msg.Deposits[1].Balance.Amount)
currentRatio := sdk.NewDecFromInt(sourceAsset.Balance.Amount).Quo(sdk.NewDecFromInt(destinationAsset.Balance.Amount))
inputRatio := sdk.NewDecFromInt(msg.Deposits[0].Balance.Amount).Quo(sdk.NewDecFromInt(msg.Deposits[1].Balance.Amount))

if err := types.CheckSlippage(currentRatio, inputRatio, 10); err != nil {
return nil, errormod.Wrapf(types.ErrInvalidPairRatio, "%s", types.ErrFailedMultiAssetDeposit)
return nil, errormod.Wrapf(types.ErrInvalidPairRatio, "%d:%d:%s", currentRatio, inputRatio, types.ErrFailedMultiAssetDeposit)
}

// Create escrow module account here
Expand Down Expand Up @@ -89,6 +89,9 @@ func (k Keeper) MakeMultiAssetDeposit(ctx context.Context, msg *types.MsgMakeMul
packet := types.IBCSwapPacketData{
Type: types.MAKE_MULTI_DEPOSIT,
Data: rawMsgData,
StateChange: &types.StateChange{
MultiDepositOrderId: order.Id,
},
}

timeoutHeight, timeoutStamp := types.GetDefaultTimeOut(&sdkCtx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ func (k msgServer) MultiAssetWithdraw(goCtx context.Context, msg *types.MsgMulti

// check out denom
if !k.bankKeeper.HasSupply(ctx, msg.PoolToken.Denom) {
return nil, errorsmod.Wrapf(types.ErrFailedDeposit, "invalid denom in local withdraw message:%s", msg.PoolToken.Denom)
return nil, errorsmod.Wrapf(types.ErrFailedWithdraw, "invalid denom in local withdraw message:%s", msg.PoolToken.Denom)
}

tokenBalance := k.bankKeeper.GetBalance(ctx, sdk.AccAddress(msg.Receiver), msg.PoolId)
tokenBalance := k.bankKeeper.GetBalance(ctx, sdk.MustAccAddressFromBech32(msg.Receiver), msg.PoolId)
if tokenBalance.Amount.LT(msg.PoolToken.Amount) {
return nil, errorsmod.Wrapf(types.ErrFailedDeposit, "sender don't have enough pool token amount:%s", msg.PoolToken.Amount)
return nil, errorsmod.Wrapf(types.ErrFailedWithdraw, "sender don't have enough pool token amount:%s", msg.PoolToken.Amount)
}

// PoolCoin.Denom is just poolID.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
func (k Keeper) TakeMultiAssetDeposit(ctx context.Context, msg *types.MsgTakeMultiAssetDepositRequest) (*types.MsgMultiAssetDepositResponse, error) {

sdkCtx := sdk.UnwrapSDKContext(ctx)

// Validate message
err := msg.ValidateBasic()
if err != nil {
Expand Down
36 changes: 31 additions & 5 deletions modules/apps/101-interchain-swap/keeper/multi_deposit_order.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,28 @@ func (k Keeper) SetMultiDepositOrderCount(ctx sdk.Context, poolId string, count
store.Set(byteKey, bz)
}

// SetMultiDepositOrderCount set the total number of multiDepositOrder
func (k Keeper) SetMultiDepositOrderLatestOrderByCreators(ctx sdk.Context, poolId, sourceMaker, destinationMaker string, count uint64) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte{})
byteKey := types.KeyPrefix(poolId + sourceMaker + destinationMaker + types.MultiDepositOrderIDByCreatorsKeyPrefix)
bz := make([]byte, 8)
binary.BigEndian.PutUint64(bz, count)
store.Set(byteKey, bz)
}

// SetMultiDepositOrderCount set the total number of multiDepositOrder
func (k Keeper) GetMultiDepositOrderLatestOrderByCreators(ctx sdk.Context, poolId, sourceMaker, destinationMaker string) uint64 {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte{})
byteKey := types.KeyPrefix(poolId + sourceMaker + destinationMaker + types.MultiDepositOrderIDByCreatorsKeyPrefix)
bz := store.Get(byteKey)
// Count doesn't exist: no element
if bz == nil {
return 0
}
// Parse bytes
return binary.BigEndian.Uint64(bz)
}

// AppendMultiDepositOrder appends a multiDepositOrder in the store with a new id and update the count
func (k Keeper) AppendMultiDepositOrder(
ctx sdk.Context,
Expand All @@ -40,7 +62,6 @@ func (k Keeper) AppendMultiDepositOrder(
) uint64 {
// Create the multiDepositOrder
count := k.GetMultiDepositOrderCount(ctx, poolId)

// Set the ID of the appended value
multiDepositOrder.Id = count

Expand All @@ -50,7 +71,7 @@ func (k Keeper) AppendMultiDepositOrder(

// Update multiDepositOrder count
k.SetMultiDepositOrderCount(ctx, poolId, count+1)

k.SetMultiDepositOrderLatestOrderByCreators(ctx, poolId, multiDepositOrder.SourceMaker, multiDepositOrder.DestinationTaker, count)
return count
}

Expand All @@ -76,19 +97,24 @@ func (k Keeper) GetMultiDepositOrder(ctx sdk.Context, poolId string, id uint64)
func (k Keeper) GetLatestMultiDepositOrder(ctx sdk.Context, poolId string) (val types.MultiAssetDepositOrder, found bool) {
id := k.GetMultiDepositOrderCount(ctx, poolId)
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(poolId+types.MultiDepositOrderKeyPrefix))
b := store.Get(GetMultiDepositOrderIDBytes(id-1))
b := store.Get(GetMultiDepositOrderIDBytes(id - 1))
if b == nil {
return val, false
}
k.cdc.MustUnmarshal(b, &val)

return val, true
}

// GetMultiDepositOrder returns a multiDepositOrder from its id
func (k Keeper) RemoveLatestMultiDepositOrder(ctx sdk.Context, poolId string) {
id := k.GetMultiDepositOrderCount(ctx, poolId)
k.RemoveMultiDepositOrder(ctx, poolId, id)
k.SetMultiDepositOrderCount(ctx, poolId, id-1)
order, found := k.GetMultiDepositOrder(ctx, poolId, id)
if found {
k.SetMultiDepositOrderLatestOrderByCreators(ctx, poolId, order.SourceMaker, order.DestinationTaker, id-1)
k.RemoveMultiDepositOrder(ctx, poolId, id)
k.SetMultiDepositOrderCount(ctx, poolId, id-1)
}
}

// RemoveMultiDepositOrder removes a multiDepositOrder from the store
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,29 @@ func (k Keeper) InterchainLatestMultiDepositOrder(ctx context.Context, req *type
Order: &order,
}, nil
}

// You may need to adjust the function signature, return types, and parameter types based on your module's implementation
func (k Keeper) InterchainMyLatestMultiDepositOrder(ctx context.Context, req *types.QueryLatestInterchainMultiDepositOrderRequest) (*types.QueryGetInterchainMultiDepositOrderResponse, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)
order, found := k.GetLatestMultiDepositOrder(sdkCtx, req.PoolId)
if !found {
return nil, types.ErrNotFoundMultiDepositOrder
}

return &types.QueryGetInterchainMultiDepositOrderResponse{
Order: &order,
}, nil
}

// You may need to adjust the function signature, return types, and parameter types based on your module's implementation
func (k Keeper) InterchainLatestMultiDepositOrderByCreators(ctx context.Context, req *types.QueryLatestInterchainMultiDepositOrderByCreatorsRequest) (*types.QueryGetInterchainMultiDepositOrderResponse, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)
id := k.GetMultiDepositOrderLatestOrderByCreators(sdkCtx, req.PoolId, req.SourceMaker, req.DestinationMaker)
order, found := k.GetMultiDepositOrder(sdkCtx, req.PoolId, id)
if !found {
return nil, types.ErrNotFoundMultiDepositOrder
}
return &types.QueryGetInterchainMultiDepositOrderResponse{
Order: &order,
}, nil
}
12 changes: 3 additions & 9 deletions modules/apps/101-interchain-swap/keeper/relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,19 +220,13 @@ func (k Keeper) OnAcknowledgementPacket(ctx sdk.Context, packet channeltypes.Pac
return nil

case types.MAKE_MULTI_DEPOSIT:

var msg types.MsgMakeMultiAssetDepositRequest
var res types.MsgMultiAssetDepositResponse
if err := types.ModuleCdc.Unmarshal(data.Data, &msg); err != nil {
logger.Debug("MakeMultiDeposit:packet:", err.Error())
return err
}

if err := types.ModuleCdc.Unmarshal(ack.GetResult(), &res); err != nil {
logger.Debug("MakeMultiDeposit:ack:", err.Error())
return err
}
if err := k.OnMakeMultiAssetDepositAcknowledged(ctx, &msg, &res); err != nil {
if err := k.OnMakeMultiAssetDepositAcknowledged(ctx, &msg); err != nil {
logger.Debug("MakeMultiDeposit:Single", err.Error())
return err
}
Expand All @@ -242,10 +236,10 @@ func (k Keeper) OnAcknowledgementPacket(ctx sdk.Context, packet channeltypes.Pac
},
sdk.Attribute{
Key: "OrderId",
Value: data.StateChange.MutiDepositOrderId,
Value: fmt.Sprintf("%d", data.StateChange.MultiDepositOrderId),
}))
return nil

case types.TAKE_MULTI_DEPOSIT:
var msg types.MsgTakeMultiAssetDepositRequest
var res types.MsgTakePoolResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ var _ binary.ByteOrder

const (
// MultiDepositOrderKeyPrefix is the prefix to retrieve all MultiDepositOrder
MultiDepositOrderKeyPrefix = "MultiDepositOrder/value/"
MultiDepositOrderCountKeyPrefix = "MultiDepositOrderCount/value/"
MultiDepositOrderKeyPrefix = "MultiDepositOrder/value/"
MultiDepositOrderCountKeyPrefix = "MultiDepositOrderCount/value/"
MultiDepositOrderIDByCreatorsKeyPrefix = "MultiDepositOrderIDByCreator/value/"
)

// MultiDepositOrderPrefixKey returns the store key to retrieve a MultiDepositOrder from the index fields
Expand Down
2 changes: 2 additions & 0 deletions modules/apps/101-interchain-swap/types/market.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ func NewInterchainLiquidityPool(

initialLiquidity := types.NewInt(0)
liquidity := []*PoolAsset{}

for _, asset := range assets {

initialLiquidity = initialLiquidity.Add(asset.Balance.Amount)
if store.HasSupply(ctx, asset.Balance.Denom) {
asset.Side = PoolAssetSide_SOURCE
Expand Down
Loading

0 comments on commit e540b8a

Please sign in to comment.