Ketika seseorang mengirim koin ke rekening cadangan pool, itu dapat menyebabkan beberapa masalah termasuk:
https://github.com/tenderint/liquidity/releases/tag/v1.2.5
Menjalankan tes ini menyebabkan kepanikan:
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)
}
Jika kita mendefinisikan kumpulan yang habis sebagai kumpulan dengan persediaan koin nol kumpulan , bukan kumpulan dengan cadangan nol , kita dapat mencegah rantai menjadi panik dalam situasi yang disebutkan.
Saya akan mengerjakannya.
Sesuatu yang dapat dipertimbangkan adalah menggunakan akun modul yang masuk daftar hitam (melalui modul bank) dari penerimaan token, tetapi ini adalah perubahan yang lebih besar dibandingkan dengan solusi di atas.
@migueldingli1997 Kami memikirkan pendekatan itu pada awalnya, tetapi karena ReserveAcc
dibuat secara dinamis ketika ada kumpulan baru, kami pikir implementasi memerlukan perubahan yang lebih besar ke blockedAddrs
. Kami masih mengeksplorasi pendekatan ini untuk melihat apakah ada solusi.
Ya itu benar. Solusi untuk itu adalah dengan menggunakan hanya satu akun modul (dibuat pada genesis dan dengan batasan yang sesuai) tetapi kemudian Anda harus melacak saldo cadangan untuk setiap kumpulan dalam modul likuiditas, daripada menyerahkannya ke bank modul. Saya mengerti bahwa ini mungkin tidak diinginkan.
Komentar yang paling membantu
Jika kita mendefinisikan kumpulan yang habis sebagai kumpulan dengan persediaan koin nol kumpulan , bukan kumpulan dengan cadangan nol , kita dapat mencegah rantai menjadi panik dalam situasi yang disebutkan.
Saya akan mengerjakannya.