diff --git a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/index.ts b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/index.ts index 2b3897b5..3521e2be 100755 --- a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/index.ts +++ b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/index.ts @@ -915,18 +915,18 @@ export default { }, - async sendMsgCreateOrder({ rootGetters }, { value, fee = [], memo = '' }) { + async sendMsgRedeemDrop({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCreateOrder(value) + const msg = await txClient.msgRedeemDrop(value) const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, gas: "200000" }, memo}) return result } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCreateOrder:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgRedeemDrop:Init Could not initialize signing client. Wallet is required.') }else{ - throw new Error('TxClient:MsgCreateOrder:Send Could not broadcast Tx: '+ e.message) + throw new Error('TxClient:MsgRedeemDrop:Send Could not broadcast Tx: '+ e.message) } } }, @@ -945,77 +945,77 @@ export default { } } }, - async sendMsgCreateDrop({ rootGetters }, { value, fee = [], memo = '' }) { + async sendMsgCancelOrder({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCreateDrop(value) + const msg = await txClient.msgCancelOrder(value) const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, gas: "200000" }, memo}) return result } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCreateDrop:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCancelOrder:Init Could not initialize signing client. Wallet is required.') }else{ - throw new Error('TxClient:MsgCreateDrop:Send Could not broadcast Tx: '+ e.message) + throw new Error('TxClient:MsgCancelOrder:Send Could not broadcast Tx: '+ e.message) } } }, - async sendMsgCancelOrder({ rootGetters }, { value, fee = [], memo = '' }) { + async sendMsgCreatePool({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCancelOrder(value) + const msg = await txClient.msgCreatePool(value) const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, gas: "200000" }, memo}) return result } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCancelOrder:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCreatePool:Init Could not initialize signing client. Wallet is required.') }else{ - throw new Error('TxClient:MsgCancelOrder:Send Could not broadcast Tx: '+ e.message) + throw new Error('TxClient:MsgCreatePool:Send Could not broadcast Tx: '+ e.message) } } }, - async sendMsgCreatePool({ rootGetters }, { value, fee = [], memo = '' }) { + async sendMsgCreateOrder({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCreatePool(value) + const msg = await txClient.msgCreateOrder(value) const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, gas: "200000" }, memo}) return result } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCreatePool:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCreateOrder:Init Could not initialize signing client. Wallet is required.') }else{ - throw new Error('TxClient:MsgCreatePool:Send Could not broadcast Tx: '+ e.message) + throw new Error('TxClient:MsgCreateOrder:Send Could not broadcast Tx: '+ e.message) } } }, - async sendMsgRedeemDrop({ rootGetters }, { value, fee = [], memo = '' }) { + async sendMsgCreateDrop({ rootGetters }, { value, fee = [], memo = '' }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgRedeemDrop(value) + const msg = await txClient.msgCreateDrop(value) const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, gas: "200000" }, memo}) return result } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgRedeemDrop:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCreateDrop:Init Could not initialize signing client. Wallet is required.') }else{ - throw new Error('TxClient:MsgRedeemDrop:Send Could not broadcast Tx: '+ e.message) + throw new Error('TxClient:MsgCreateDrop:Send Could not broadcast Tx: '+ e.message) } } }, - async MsgCreateOrder({ rootGetters }, { value }) { + async MsgRedeemDrop({ rootGetters }, { value }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCreateOrder(value) + const msg = await txClient.msgRedeemDrop(value) return msg } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCreateOrder:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgRedeemDrop:Init Could not initialize signing client. Wallet is required.') } else{ - throw new Error('TxClient:MsgCreateOrder:Create Could not create message: ' + e.message) + throw new Error('TxClient:MsgRedeemDrop:Create Could not create message: ' + e.message) } } }, @@ -1032,55 +1032,55 @@ export default { } } }, - async MsgCreateDrop({ rootGetters }, { value }) { + async MsgCancelOrder({ rootGetters }, { value }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCreateDrop(value) + const msg = await txClient.msgCancelOrder(value) return msg } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCreateDrop:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCancelOrder:Init Could not initialize signing client. Wallet is required.') } else{ - throw new Error('TxClient:MsgCreateDrop:Create Could not create message: ' + e.message) + throw new Error('TxClient:MsgCancelOrder:Create Could not create message: ' + e.message) } } }, - async MsgCancelOrder({ rootGetters }, { value }) { + async MsgCreatePool({ rootGetters }, { value }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCancelOrder(value) + const msg = await txClient.msgCreatePool(value) return msg } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCancelOrder:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCreatePool:Init Could not initialize signing client. Wallet is required.') } else{ - throw new Error('TxClient:MsgCancelOrder:Create Could not create message: ' + e.message) + throw new Error('TxClient:MsgCreatePool:Create Could not create message: ' + e.message) } } }, - async MsgCreatePool({ rootGetters }, { value }) { + async MsgCreateOrder({ rootGetters }, { value }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgCreatePool(value) + const msg = await txClient.msgCreateOrder(value) return msg } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgCreatePool:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCreateOrder:Init Could not initialize signing client. Wallet is required.') } else{ - throw new Error('TxClient:MsgCreatePool:Create Could not create message: ' + e.message) + throw new Error('TxClient:MsgCreateOrder:Create Could not create message: ' + e.message) } } }, - async MsgRedeemDrop({ rootGetters }, { value }) { + async MsgCreateDrop({ rootGetters }, { value }) { try { const txClient=await initTxClient(rootGetters) - const msg = await txClient.msgRedeemDrop(value) + const msg = await txClient.msgCreateDrop(value) return msg } catch (e) { if (e == MissingWalletError) { - throw new Error('TxClient:MsgRedeemDrop:Init Could not initialize signing client. Wallet is required.') + throw new Error('TxClient:MsgCreateDrop:Init Could not initialize signing client. Wallet is required.') } else{ - throw new Error('TxClient:MsgRedeemDrop:Create Could not create message: ' + e.message) + throw new Error('TxClient:MsgCreateDrop:Create Could not create message: ' + e.message) } } }, diff --git a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/index.ts b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/index.ts index f37e2e66..6cf29882 100755 --- a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/index.ts +++ b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/index.ts @@ -4,21 +4,21 @@ import { StdFee } from "@cosmjs/launchpad"; import { SigningStargateClient } from "@cosmjs/stargate"; import { Registry, OfflineSigner, EncodeObject, DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { Api } from "./rest"; -import { MsgCreateOrder } from "./types/market/tx"; +import { MsgRedeemDrop } from "./types/market/tx"; import { MsgMarketOrder } from "./types/market/tx"; -import { MsgCreateDrop } from "./types/market/tx"; import { MsgCancelOrder } from "./types/market/tx"; import { MsgCreatePool } from "./types/market/tx"; -import { MsgRedeemDrop } from "./types/market/tx"; +import { MsgCreateOrder } from "./types/market/tx"; +import { MsgCreateDrop } from "./types/market/tx"; const types = [ - ["/pendulumlabs.market.market.MsgCreateOrder", MsgCreateOrder], + ["/pendulumlabs.market.market.MsgRedeemDrop", MsgRedeemDrop], ["/pendulumlabs.market.market.MsgMarketOrder", MsgMarketOrder], - ["/pendulumlabs.market.market.MsgCreateDrop", MsgCreateDrop], ["/pendulumlabs.market.market.MsgCancelOrder", MsgCancelOrder], ["/pendulumlabs.market.market.MsgCreatePool", MsgCreatePool], - ["/pendulumlabs.market.market.MsgRedeemDrop", MsgRedeemDrop], + ["/pendulumlabs.market.market.MsgCreateOrder", MsgCreateOrder], + ["/pendulumlabs.market.market.MsgCreateDrop", MsgCreateDrop], ]; export const MissingWalletError = new Error("wallet is required"); @@ -51,12 +51,12 @@ const txClient = async (wallet: OfflineSigner, { addr: addr }: TxClientOptions = return { signAndBroadcast: (msgs: EncodeObject[], { fee, memo }: SignAndBroadcastOptions = {fee: defaultFee, memo: ""}) => client.signAndBroadcast(address, msgs, fee,memo), - msgCreateOrder: (data: MsgCreateOrder): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgCreateOrder", value: MsgCreateOrder.fromPartial( data ) }), + msgRedeemDrop: (data: MsgRedeemDrop): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgRedeemDrop", value: MsgRedeemDrop.fromPartial( data ) }), msgMarketOrder: (data: MsgMarketOrder): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgMarketOrder", value: MsgMarketOrder.fromPartial( data ) }), - msgCreateDrop: (data: MsgCreateDrop): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgCreateDrop", value: MsgCreateDrop.fromPartial( data ) }), msgCancelOrder: (data: MsgCancelOrder): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgCancelOrder", value: MsgCancelOrder.fromPartial( data ) }), msgCreatePool: (data: MsgCreatePool): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgCreatePool", value: MsgCreatePool.fromPartial( data ) }), - msgRedeemDrop: (data: MsgRedeemDrop): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgRedeemDrop", value: MsgRedeemDrop.fromPartial( data ) }), + msgCreateOrder: (data: MsgCreateOrder): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgCreateOrder", value: MsgCreateOrder.fromPartial( data ) }), + msgCreateDrop: (data: MsgCreateDrop): EncodeObject => ({ typeUrl: "/pendulumlabs.market.market.MsgCreateDrop", value: MsgCreateDrop.fromPartial( data ) }), }; }; diff --git a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/rest.ts b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/rest.ts index e2b3fa56..e06fadcd 100644 --- a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/rest.ts +++ b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/rest.ts @@ -431,13 +431,6 @@ export interface V1Beta1PageRequest { * is set. */ count_total?: boolean; - - /** - * reverse is set to true if results are to be returned in the descending order. - * - * Since: cosmos-sdk 0.43 - */ - reverse?: boolean; } /** @@ -670,7 +663,6 @@ export class Api extends HttpClient @@ -728,7 +720,6 @@ export class Api extends HttpClient @@ -770,7 +761,6 @@ export class Api extends HttpClient @@ -862,7 +852,6 @@ export class Api extends HttpClient @@ -906,7 +895,6 @@ export class Api extends HttpClient @@ -932,7 +920,6 @@ export class Api extends HttpClient @@ -974,7 +961,6 @@ export class Api extends HttpClient @@ -1001,7 +987,6 @@ export class Api extends HttpClient @@ -1028,7 +1013,6 @@ export class Api extends HttpClient @@ -1086,7 +1070,6 @@ export class Api extends HttpClient @@ -1144,7 +1127,6 @@ export class Api extends HttpClient diff --git a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/types/cosmos/base/query/v1beta1/pagination.ts b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/types/cosmos/base/query/v1beta1/pagination.ts index 9c87ac0c..0bc568f4 100644 --- a/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/types/cosmos/base/query/v1beta1/pagination.ts +++ b/vue/src/store/generated/pendulum-labs/market/pendulumlabs.market.market/module/types/cosmos/base/query/v1beta1/pagination.ts @@ -38,12 +38,6 @@ export interface PageRequest { * is set. */ count_total: boolean; - /** - * reverse is set to true if results are to be returned in the descending order. - * - * Since: cosmos-sdk 0.43 - */ - reverse: boolean; } /** @@ -68,12 +62,7 @@ export interface PageResponse { total: number; } -const basePageRequest: object = { - offset: 0, - limit: 0, - count_total: false, - reverse: false, -}; +const basePageRequest: object = { offset: 0, limit: 0, count_total: false }; export const PageRequest = { encode(message: PageRequest, writer: Writer = Writer.create()): Writer { @@ -89,9 +78,6 @@ export const PageRequest = { if (message.count_total === true) { writer.uint32(32).bool(message.count_total); } - if (message.reverse === true) { - writer.uint32(40).bool(message.reverse); - } return writer; }, @@ -114,9 +100,6 @@ export const PageRequest = { case 4: message.count_total = reader.bool(); break; - case 5: - message.reverse = reader.bool(); - break; default: reader.skipType(tag & 7); break; @@ -145,11 +128,6 @@ export const PageRequest = { } else { message.count_total = false; } - if (object.reverse !== undefined && object.reverse !== null) { - message.reverse = Boolean(object.reverse); - } else { - message.reverse = false; - } return message; }, @@ -163,7 +141,6 @@ export const PageRequest = { message.limit !== undefined && (obj.limit = message.limit); message.count_total !== undefined && (obj.count_total = message.count_total); - message.reverse !== undefined && (obj.reverse = message.reverse); return obj; }, @@ -189,11 +166,6 @@ export const PageRequest = { } else { message.count_total = false; } - if (object.reverse !== undefined && object.reverse !== null) { - message.reverse = object.reverse; - } else { - message.reverse = false; - } return message; }, }; diff --git a/x/market/keeper/drop.go b/x/market/keeper/drop.go index 3a4d51fe..f7b8c3ac 100644 --- a/x/market/keeper/drop.go +++ b/x/market/keeper/drop.go @@ -23,6 +23,16 @@ func (k Keeper) SetDrop(ctx sdk.Context, drop types.Drop) { ), a) } +// SetDrops set a specific drops in the store from its index +func (k Keeper) SetDrops(ctx sdk.Context, drops types.Drops, owner string, pair string) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DropsKeyPrefix)) + a := k.cdc.MustMarshal(&drops) + store.Set(types.DropsKey( + owner, + pair, + ), a) +} + // GetDrop returns a drop from its index func (k Keeper) GetDrop( ctx sdk.Context, @@ -41,7 +51,7 @@ func (k Keeper) GetDrop( return val, true } -// GetDrop returns a drop from its index +// GetDropPairs returns all pairs that an address owns drops func (k Keeper) GetDropPairs( ctx sdk.Context, address string, @@ -199,7 +209,7 @@ func (k Keeper) SetDropOwner( func (k Keeper) RemoveDropOwner( ctx sdk.Context, drop types.Drop, -) { +) error { // Remove uid from owner drop list store1 := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DropsKeyPrefix)) @@ -210,7 +220,7 @@ func (k Keeper) RemoveDropOwner( drop.Pair, )) if a == nil { - return + return nil } k.cdc.MustUnmarshal(a, &drops) @@ -218,6 +228,10 @@ func (k Keeper) RemoveDropOwner( drops.Uids, _ = removeUid(drops.Uids, drop.Uid) drops.Sum = drops.Sum.Sub(drop.Drops) + if drops.Sum.LT(sdk.ZeroInt()) { + return sdkerrors.Wrapf(types.ErrOwnerDropSumNeg, "%s", drops.Sum) + } + b := k.cdc.MustMarshal(&drops) store1.Set(types.DropsKey( @@ -245,6 +259,7 @@ func (k Keeper) RemoveDropOwner( drop.Owner, ), d) } + return nil } // GetAllDrop returns all drop @@ -263,6 +278,22 @@ func (k Keeper) GetAllDrop(ctx sdk.Context) (list []types.Drop) { return } +// GetAllDrops returns all drops +func (k Keeper) GetAllDrops(ctx sdk.Context) (list []types.Drops) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DropsKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var val types.Drops + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} + // GetOwnerDrops returns drops from a single owner func (k Keeper) GetPairs( ctx sdk.Context, diff --git a/x/market/keeper/msg_server_cancel_order_test.go b/x/market/keeper/msg_server_cancel_order_test.go index 75578025..00f2283a 100644 --- a/x/market/keeper/msg_server_cancel_order_test.go +++ b/x/market/keeper/msg_server_cancel_order_test.go @@ -68,7 +68,7 @@ func TestCancelOrder_case1_stop(t *testing.T) { require.True(t, memberfound) require.Equal(t, memberA.DenomA, denomB) require.Equal(t, memberA.DenomB, denomA) - require.Equal(t, "136", memberA.Balance.String()) + require.Equal(t, "135", memberA.Balance.String()) require.Equal(t, memberA.Stop, uint64(0)) // Cancel Order @@ -84,7 +84,7 @@ func TestCancelOrder_case1_stop(t *testing.T) { require.True(t, memberfound) require.Equal(t, memberA.DenomA, denomB) require.Equal(t, memberA.DenomB, denomA) - require.Equal(t, "136", memberA.Balance.String()) + require.Equal(t, "135", memberA.Balance.String()) require.Equal(t, memberA.Stop, uint64(0)) //Validate Order @@ -113,7 +113,7 @@ func TestCancelOrder_case1_limit(t *testing.T) { require.True(t, memberfoundBid) require.Equal(t, memberBid.DenomA, denomA) require.Equal(t, memberBid.DenomB, denomB) - require.Equal(t, "181", memberBid.Balance.String()) + require.Equal(t, "180", memberBid.Balance.String()) require.Equal(t, memberBid.Stop, uint64(0)) // Create Order @@ -136,7 +136,7 @@ func TestCancelOrder_case1_limit(t *testing.T) { require.True(t, memberfoundBid) require.Equal(t, memberBid.DenomA, denomA) require.Equal(t, memberBid.DenomB, denomB) - require.Equal(t, "181", memberBid.Balance.String()) + require.Equal(t, "180", memberBid.Balance.String()) require.Equal(t, memberBid.Stop, uint64(0)) memberBid.Stop = orders.Uid @@ -155,7 +155,7 @@ func TestCancelOrder_case1_limit(t *testing.T) { require.True(t, memberfoundBid) require.Equal(t, memberBid.DenomA, denomA) require.Equal(t, memberBid.DenomB, denomB) - require.Equal(t, "181", memberBid.Balance.String()) + require.Equal(t, "180", memberBid.Balance.String()) require.Equal(t, memberBid.Stop, uint64(orders.Uid)) //Validate Order @@ -211,7 +211,7 @@ func TestCancelOrder_case2_stop(t *testing.T) { require.True(t, memberAskfound) require.Equal(t, memberAsk.DenomA, denomB) require.Equal(t, memberAsk.DenomB, denomA) - require.Equal(t, "136", memberAsk.Balance.String()) + require.Equal(t, "135", memberAsk.Balance.String()) require.Equal(t, memberAsk.Stop, uint64(0)) o.Next = strconv.FormatUint(beforecount, 10) @@ -236,7 +236,7 @@ func TestCancelOrder_case2_stop(t *testing.T) { require.True(t, memberBidfound) require.Equal(t, memberBid.DenomA, denomA) require.Equal(t, memberBid.DenomB, denomB) - require.Equal(t, "181", memberBid.Balance.String()) + require.Equal(t, "180", memberBid.Balance.String()) require.Equal(t, memberBid.Stop, beforecount) // Validate Order @@ -284,7 +284,7 @@ func TestCancelOrderEmptyPool(t *testing.T) { require.True(t, memberAskfound) require.Equal(t, memberAsk.DenomA, denomB) require.Equal(t, memberAsk.DenomB, denomA) - require.Equal(t, "136", memberAsk.Balance.String()) + require.Equal(t, "135", memberAsk.Balance.String()) require.Equal(t, memberAsk.Stop, uint64(0)) // Validate RedeemDrop @@ -326,7 +326,7 @@ func TestCancelOrder_case1_market_filled(t *testing.T) { require.True(t, memberfoundBid) require.Equal(t, memberBid.DenomA, denomA) require.Equal(t, memberBid.DenomB, denomB) - require.Equal(t, "181", memberBid.Balance.String()) + require.Equal(t, "180", memberBid.Balance.String()) require.Equal(t, memberBid.Stop, uint64(0)) //Create Order diff --git a/x/market/keeper/msg_server_create_drop.go b/x/market/keeper/msg_server_create_drop.go index e12117ff..6d5614ca 100644 --- a/x/market/keeper/msg_server_create_drop.go +++ b/x/market/keeper/msg_server_create_drop.go @@ -58,31 +58,24 @@ func (k msgServer) CreateDrop(goCtx context.Context, msg *types.MsgCreateDrop) ( return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "drops not >0") } - dropAmtMember1, dropAmtMember2, error := dropAmounts(drops.Add(sdk.NewIntFromUint64(1)), pool, member1, member2) + dropAmtMember1, dropAmtMember2, error := dropAmounts(drops, pool, member1, member2) if error != nil { return nil, error } - if ((dropAmtMember1.Mul(pool.Drops)).Quo(member1.Balance)).LTE((dropAmtMember2.Mul(pool.Drops)).Quo(member2.Balance)) { - drops = (dropAmtMember1.Mul(pool.Drops)).Quo(member1.Balance) - } else { - drops = (dropAmtMember2.Mul(pool.Drops)).Quo(member2.Balance) - } - - if !drops.GT(sdk.ZeroInt()) { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "drops not >0") - } - sqrtDropProduct := sqrtInt(dropAmtMember1.Mul(dropAmtMember2)) sqrtMembers := sqrtInt(member1.Balance.Mul(member2.Balance)) + var n uint64 = 1 + for (sqrtDropProduct.Quo(drops)).LT(sqrtMembers.Quo(pool.Drops)) { - dropAmtMember1, dropAmtMember2, error = dropAmounts(drops.Add(sdk.NewIntFromUint64(1)), pool, member1, member2) + dropAmtMember1, dropAmtMember2, error = dropAmounts(drops.Add(sdk.NewIntFromUint64(n)), pool, member1, member2) if error != nil { return nil, error } sqrtDropProduct = sqrtInt(dropAmtMember1.Mul(dropAmtMember2)) + n++ } dropProduct := dropAmtMember1.Mul(dropAmtMember2) diff --git a/x/market/keeper/msg_server_create_drop_test.go b/x/market/keeper/msg_server_create_drop_test.go index 0d7a09b0..23812991 100644 --- a/x/market/keeper/msg_server_create_drop_test.go +++ b/x/market/keeper/msg_server_create_drop_test.go @@ -129,7 +129,7 @@ func TestCreateDrop(t *testing.T) { rst2, found := testInput.MarketKeeper.GetPool(testInput.Context, pair) require.True(t, found) require.Equal(t, rst2.Pair, pair) - require.Equal(t, "165", rst2.Drops.String()) + require.Equal(t, "166", rst2.Drops.String()) require.Equal(t, "154", rst2.Leaders[0].Drops.String()) require.Equal(t, rst2.Leaders[0].Address, addr) require.Equal(t, rst2.Leaders[1].Address, addr2) @@ -155,7 +155,7 @@ func TestCreateDrop(t *testing.T) { pool, found = testInput.MarketKeeper.GetPool(testInput.Context, pair) require.True(t, found) require.Equal(t, pool.Pair, pair) - require.Equal(t, "1165", pool.Drops.String()) + require.Equal(t, "1166", pool.Drops.String()) require.Equal(t, 3, len(pool.Leaders)) require.Equal(t, "1000", pool.Leaders[0].Drops.String()) @@ -175,11 +175,11 @@ func TestCreateDrop(t *testing.T) { pool, found = testInput.MarketKeeper.GetPool(testInput.Context, pair) require.True(t, found) require.Equal(t, pool.Pair, pair) - require.Equal(t, "1565", pool.Drops.String()) + require.Equal(t, "1566", pool.Drops.String()) require.Equal(t, 3, len(pool.Leaders)) require.Equal(t, "1400", pool.Leaders[0].Drops.String()) require.Equal(t, "154", pool.Leaders[1].Drops.String()) - require.Equal(t, "11", pool.Leaders[2].Drops.String()) + require.Equal(t, "12", pool.Leaders[2].Drops.String()) require.Equalf(t, addr3, pool.Leaders[0].Address, pool.Leaders[0].Address) require.Equalf(t, addr, pool.Leaders[1].Address, addr3) require.Equalf(t, addr2, pool.Leaders[2].Address, pool.Leaders[2].Address) diff --git a/x/market/keeper/msg_server_create_order_test.go b/x/market/keeper/msg_server_create_order_test.go index d6c24448..399bdc8c 100644 --- a/x/market/keeper/msg_server_create_order_test.go +++ b/x/market/keeper/msg_server_create_order_test.go @@ -99,7 +99,7 @@ func TestCreateOrder(t *testing.T) { require.True(t, memberAskfound) require.Equal(t, memberAsk.DenomA, denomB) require.Equal(t, memberAsk.DenomB, denomA) - require.Equal(t, "136", memberAsk.Balance.String()) + require.Equal(t, "135", memberAsk.Balance.String()) require.Equal(t, memberAsk.Stop, uint64(0)) } @@ -201,7 +201,7 @@ func TestBookEnds(t *testing.T) { require.True(t, memberAskfound) require.Equal(t, memberAsk.DenomA, denomB) require.Equal(t, memberAsk.DenomB, denomA) - require.Equal(t, "136", memberAsk.Balance.String()) + require.Equal(t, "135", memberAsk.Balance.String()) require.Equal(t, memberAsk.Stop, uint64(0)) // Create Order Msg Type diff --git a/x/market/keeper/msg_server_create_pool.go b/x/market/keeper/msg_server_create_pool.go index 67d58a93..4e04d3b4 100644 --- a/x/market/keeper/msg_server_create_pool.go +++ b/x/market/keeper/msg_server_create_pool.go @@ -128,11 +128,12 @@ func (k msgServer) CreatePool(goCtx context.Context, msg *types.MsgCreatePool) ( } var drop = types.Drop{ - Uid: count, - Owner: msg.Creator, - Pair: pair, - Drops: drops, - Active: true, + Uid: count, + Owner: msg.Creator, + Pair: pair, + Drops: drops, + Product: coin1.Amount.Mul(coin2.Amount), + Active: true, } k.SetPool( diff --git a/x/market/keeper/msg_server_market_order_test.go b/x/market/keeper/msg_server_market_order_test.go index d34c55b3..ee9c11e7 100644 --- a/x/market/keeper/msg_server_market_order_test.go +++ b/x/market/keeper/msg_server_market_order_test.go @@ -69,7 +69,7 @@ func TestMarketOrder(t *testing.T) { require.True(t, memberAskFound) require.Equal(t, memberAsk.DenomA, denomB) require.Equal(t, memberAsk.DenomB, denomA) - require.Equal(t, "121", memberAsk.Balance.String()) + require.Equal(t, "120", memberAsk.Balance.String()) require.Equal(t, memberAsk.Stop, uint64(0)) // Validate order estimation diff --git a/x/market/keeper/msg_server_redeem_drop.go b/x/market/keeper/msg_server_redeem_drop.go index f46a3473..f5cc2a32 100644 --- a/x/market/keeper/msg_server_redeem_drop.go +++ b/x/market/keeper/msg_server_redeem_drop.go @@ -107,10 +107,13 @@ func (k msgServer) RedeemDrop(goCtx context.Context, msg *types.MsgRedeemDrop) ( drop, ) - k.RemoveDropOwner( + err := k.RemoveDropOwner( ctx, drop, ) + if err != nil { + return nil, err + } k.SetPool( ctx, diff --git a/x/market/keeper/msg_server_redeem_drop_test.go b/x/market/keeper/msg_server_redeem_drop_test.go index a6140f84..4784203b 100644 --- a/x/market/keeper/msg_server_redeem_drop_test.go +++ b/x/market/keeper/msg_server_redeem_drop_test.go @@ -96,12 +96,12 @@ func TestRedeemDrop(t *testing.T) { require.True(t, memberFoundA) require.Equal(t, memberA.DenomA, denomB) require.Equal(t, memberA.DenomB, denomA) - require.Equal(t, memberA.Balance.String(), "31") + require.Equal(t, "30", memberA.Balance.String()) require.True(t, memberFoundB) require.Equal(t, memberB.DenomA, denomA) require.Equal(t, memberB.DenomB, denomB) - require.Equal(t, memberB.Balance.String(), "41") + require.Equal(t, "40", memberB.Balance.String()) createPoolCoinA, err := sdk.ParseCoinNormalized(p.CoinA) require.NoError(t, err) diff --git a/x/market/keeper/msg_server_simulate_test.go b/x/market/keeper/msg_server_simulate_test.go index da6c896a..891d26b3 100644 --- a/x/market/keeper/msg_server_simulate_test.go +++ b/x/market/keeper/msg_server_simulate_test.go @@ -88,7 +88,7 @@ func TestSimulate(t *testing.T) { users := []User{user1, user2, user3} - for i := 1; i < 100000; i++ { + for i := 1; i < 200000; i++ { j := rand.IntN(6) k := rand.IntN(2) diff --git a/x/market/types/errors.go b/x/market/types/errors.go index 97b43b84..3831f53f 100644 --- a/x/market/types/errors.go +++ b/x/market/types/errors.go @@ -66,4 +66,6 @@ var ( ErrProductLessThanExpected = sdkerrors.Register(ModuleName, 28, "product less than expected") // nolint: gomnd // ErrSqrtProdDropRatio - sqrt product over drops ratio inconsistency ErrSqrtProdDropRatio = sdkerrors.Register(ModuleName, 29, "sqrt prod over drop less than expected") // nolint: gomnd + // ErrOwnerDropSumNeg - owner drop sum negative + ErrOwnerDropSumNeg = sdkerrors.Register(ModuleName, 30, "owner drop sum is negative") // nolint: gomnd )