Cuando alguien envía monedas a la cuenta de reserva de un grupo, puede causar algunos problemas que incluyen:
https://github.com/tendermint/liquidity/releases/tag/v1.2.5
Ejecutar esta prueba provoca pánico:
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)
}
Si definimos un grupo agotado como un grupo con suministro de monedas de grupo cero , no un grupo con reserva cero , podemos evitar que la cadena entre en pánico en las situaciones mencionadas.
Trabajaré en eso.
Algo que se puede considerar es hacer uso de las cuentas del módulo que están en la lista negra (a través del módulo bancario) para recibir tokens, pero este es un cambio mayor en comparación con la solución anterior.
@ migueldingli1997 Pensamos en ese enfoque al principio, pero dado que ReserveAcc
se crea dinámicamente cuando hay un nuevo grupo, creemos que la implementación requiere un cambio mayor a blockedAddrs
. Todavía estamos explorando este enfoque para ver si existe una solución.
Sí, eso es correcto. Una solución alternativa es usar solo una cuenta de módulo (creada en la génesis y con las restricciones apropiadas), pero luego tendrá que realizar un seguimiento de los saldos de reserva para cada grupo en el módulo de liquidez, en lugar de dejarlo en manos del banco. módulo. Sin embargo, entiendo que esto podría no ser deseable.
Comentario más útil
Si definimos un grupo agotado como un grupo con suministro de monedas de grupo cero , no un grupo con reserva cero , podemos evitar que la cadena entre en pánico en las situaciones mencionadas.
Trabajaré en eso.