عندما يرسل شخص ما عملات معدنية إلى الحساب الاحتياطي للمجمع ، فقد يتسبب ذلك في بعض المشكلات بما في ذلك:
https://github.com/tendermint/l Liquidity/releases/tag/v1.2.5
يؤدي إجراء هذا الاختبار إلى حالة من الذعر:
func TestSwapHalfZeroReserve(t *testing.T) {
simapp, ctx := createTestInput()
params := simapp.LiquidityKeeper.GetParams(ctx)
pool, addr, err := createPool(simapp, ctx, sdk.NewInt(1000000), sdk.NewInt(1000000), DenomX, DenomY)
require.NoError(t, err)
pc := simapp.BankKeeper.GetBalance(ctx, addr, pool.PoolCoinDenom)
_, err = simapp.LiquidityKeeper.WithdrawLiquidityPoolToBatch(ctx, types.NewMsgWithdrawWithinBatch(addr, pool.Id, pc))
require.NoError(t, err)
liquidity.BeginBlocker(ctx, simapp.LiquidityKeeper)
liquidity.EndBlocker(ctx, simapp.LiquidityKeeper)
require.True(t, simapp.BankKeeper.GetBalance(ctx, pool.GetReserveAccount(), DenomX).IsZero())
require.True(t, simapp.BankKeeper.GetBalance(ctx, pool.GetReserveAccount(), DenomY).IsZero())
err = simapp.BankKeeper.SendCoins(ctx, addr, pool.GetReserveAccount(), sdk.NewCoins(sdk.NewInt64Coin(DenomX, 10000)))
require.NoError(t, err)
_, err = simapp.LiquidityKeeper.SwapLiquidityPoolToBatch(ctx,
types.NewMsgSwapWithinBatch(
addr, pool.Id, types.DefaultSwapTypeId, sdk.NewInt64Coin(DenomX, 1000), DenomY, sdk.MustNewDecFromStr("1.0"), params.SwapFeeRate), 0)
require.NoError(t, err)
liquidity.BeginBlocker(ctx, simapp.LiquidityKeeper)
liquidity.EndBlocker(ctx, simapp.LiquidityKeeper)
}
إذا حددنا تجمعًا مستنفدًا على أنه تجمع لا يحتوي على أي عملة من العملات المعدنية ، وليس تجمعًا باحتياطي صفري ، فيمكننا منع السلسلة من الذعر في المواقف المذكورة.
سأعمل على ذلك.
الشيء الذي يمكن أخذه في الاعتبار هو الاستفادة من حسابات الوحدات المدرجة في القائمة السوداء (عبر الوحدة البنكية) من استلام الرموز المميزة ، ولكن هذا يعد تغييرًا أكبر مقارنة بالحل أعلاه.
@ migueldingli1997 فكرنا في هذا النهج في البداية ، ولكن نظرًا لأن ReserveAcc
يتم إنشاؤه ديناميكيًا عند وجود مجموعة جديدة ، نعتقد أن التنفيذ يتطلب تغييرًا أكبر إلى blockedAddrs
. ما زلنا نستكشف هذا الأسلوب لمعرفة ما إذا كان هناك حل بديل.
نعم هذا صحيح. الحل البديل لذلك هو استخدام حساب وحدة واحدة فقط (تم إنشاؤه عند التكوين ومع القيود المناسبة) ولكن بعد ذلك سيتعين عليك تتبع أرصدة الاحتياطي لكل تجمع في وحدة السيولة ، بدلاً من تركه للبنك وحدة. أنا أفهم أن هذا قد لا يكون مرغوبًا فيه.
التعليق الأكثر فائدة
إذا حددنا تجمعًا مستنفدًا على أنه تجمع لا يحتوي على أي عملة من العملات المعدنية ، وليس تجمعًا باحتياطي صفري ، فيمكننا منع السلسلة من الذعر في المواقف المذكورة.
سأعمل على ذلك.