Liquidity: Решение проблем с отправкой монет на резервный счет

Созданный на 27 мая 2021  ·  4Комментарии  ·  Источник: tendermint/liquidity

Резюме ошибки

Когда кто-то отправляет монеты на резервную учетную запись пула, это может вызвать некоторые проблемы, в том числе:

  • Пул с нулевым балансом на одной стороне резервной монеты, что приводит к неправильному расчету цены пула

    • Забрав все монеты из пула, а затем отправив только одну резервную монету непосредственно на резервный счет.

  • Паника в логике депозита при вычислении коэффициента резервных монет (ошибка деления на ноль с описанным выше пулом)
  • ...

Версия

https://github.com/tendermint/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] Применены соответствующие ярлыки
  • [] Отмечены соответствующие участники
  • [] Автор назначен / назначен самим себе

Самый полезный комментарий

Если мы определим истощенный пул как пул с нулевым запасом монет в пуле , а не как пул с нулевым резервом , мы можем предотвратить панику в цепочке в упомянутых ситуациях.

Я буду работать над этим.

Все 4 Комментарий

Если мы определим истощенный пул как пул с нулевым запасом монет в пуле , а не как пул с нулевым резервом , мы можем предотвратить панику в цепочке в упомянутых ситуациях.

Я буду работать над этим.

Можно рассмотреть возможность использования учетных записей модуля, которые занесены в черный список (через модуль банка) из-за получения токенов, но это более серьезное изменение по сравнению с вышеуказанным решением.

@ migueldingli1997 Сначала мы думали об этом подходе, но поскольку ReserveAcc создается динамически при появлении нового пула, мы думаем, что реализация требует большего изменения blockedAddrs . Мы все еще изучаем этот подход, чтобы увидеть, есть ли обходной путь.

Ага, это правильно. Обходной путь для этого - использовать только одну учетную запись модуля (созданную на этапе создания и с соответствующими ограничениями), но тогда вам придется отслеживать резервные балансы для каждого пула в модуле ликвидности, а не оставлять это на усмотрение банка. модуль. Однако я понимаю, что это может быть нежелательно.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

James-Osmo picture James-Osmo  ·  4Комментарии

CodingAgainstChaos picture CodingAgainstChaos  ·  3Комментарии

noahwhite picture noahwhite  ·  3Комментарии

hsdk123 picture hsdk123  ·  3Комментарии

bhuvan picture bhuvan  ·  3Комментарии