Liquidity: Menangani masalah pengiriman koin ke rekening cadangan

Dibuat pada 27 Mei 2021  ·  4Komentar  ·  Sumber: tendermint/liquidity

Ringkasan Bug

Ketika seseorang mengirim koin ke rekening cadangan pool, itu dapat menyebabkan beberapa masalah termasuk:

  • Kumpulan dengan saldo nol di satu sisi koin cadangan, yang mengarah ke perhitungan harga kumpulan yang salah

    • Dengan menarik semua koin dari kumpulan dan kemudian mengirim hanya satu koin cadangan langsung ke akun cadangan

  • Kepanikan dalam logika setoran, saat menghitung rasio koin cadangan (dibagi dengan nol kesalahan dengan kumpulan yang dijelaskan di atas)
  • ...

Versi: kapan

https://github.com/tenderint/liquidity/releases/tag/v1.2.5

Langkah-langkah untuk Reproduksi

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

Untuk Penggunaan Admin

  • [x] Bukan masalah duplikat
  • [x] Label yang sesuai diterapkan
  • [ ] Kontributor yang tepat ditandai
  • [ ] Kontributor ditugaskan/ditugaskan sendiri
bug

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.

Semua 4 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat