Liquidity: معالجة مشاكل إرسال العملات المعدنية إلى الحساب الاحتياطي

تم إنشاؤها على ٢٧ مايو ٢٠٢١  ·  4تعليقات  ·  مصدر: tendermint/liquidity

ملخص الخطأ

عندما يرسل شخص ما عملات معدنية إلى الحساب الاحتياطي للمجمع ، فقد يتسبب ذلك في بعض المشكلات بما في ذلك:

  • تجمع مع رصيد صفري في جانب واحد من العملة الاحتياطية ، مما يؤدي إلى حساب سعر التجميع غير الصحيح

    • عن طريق سحب جميع العملات من المجمع ثم إرسال عملة احتياطية واحدة فقط مباشرة إلى الحساب الاحتياطي

  • ذعر في منطق الإيداع ، عند حساب نسبة العملة الاحتياطية (قسمة على خطأ صفري مع تجمع موصوف أعلاه)
  • ...

إصدار

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)
}

للاستخدام الإداري

  • [x] ليست مشكلة مكررة
  • [x] تم وضع العلامات المناسبة
  • [] تم وضع علامة على المساهمين المناسبين
  • [] المساهم المعين / المعين ذاتيًا
bug

التعليق الأكثر فائدة

إذا حددنا تجمعًا مستنفدًا على أنه تجمع لا يحتوي على أي عملة من العملات المعدنية ، وليس تجمعًا باحتياطي صفري ، فيمكننا منع السلسلة من الذعر في المواقف المذكورة.

سأعمل على ذلك.

ال 4 كومينتر

إذا حددنا تجمعًا مستنفدًا على أنه تجمع لا يحتوي على أي عملة من العملات المعدنية ، وليس تجمعًا باحتياطي صفري ، فيمكننا منع السلسلة من الذعر في المواقف المذكورة.

سأعمل على ذلك.

الشيء الذي يمكن أخذه في الاعتبار هو الاستفادة من حسابات الوحدات المدرجة في القائمة السوداء (عبر الوحدة البنكية) من استلام الرموز المميزة ، ولكن هذا يعد تغييرًا أكبر مقارنة بالحل أعلاه.

@ migueldingli1997 فكرنا في هذا النهج في البداية ، ولكن نظرًا لأن ReserveAcc يتم إنشاؤه ديناميكيًا عند وجود مجموعة جديدة ، نعتقد أن التنفيذ يتطلب تغييرًا أكبر إلى blockedAddrs . ما زلنا نستكشف هذا الأسلوب لمعرفة ما إذا كان هناك حل بديل.

نعم هذا صحيح. الحل البديل لذلك هو استخدام حساب وحدة واحدة فقط (تم إنشاؤه عند التكوين ومع القيود المناسبة) ولكن بعد ذلك سيتعين عليك تتبع أرصدة الاحتياطي لكل تجمع في وحدة السيولة ، بدلاً من تركه للبنك وحدة. أنا أفهم أن هذا قد لا يكون مرغوبًا فيه.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات