Liquidity: μ˜ˆλΉ„ κ³„μ’Œλ‘œ 코인을 λ³΄λ‚΄λŠ” 문제 처리

에 λ§Œλ“  2021λ…„ 05μ›” 27일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: tendermint/liquidity

버그 μš”μ•½

λˆ„κ΅°κ°€κ°€ ν’€μ˜ μ˜ˆλΉ„ κ³„μ’Œλ‘œ 코인을 보내면 λ‹€μŒκ³Ό 같은 λͺ‡ 가지 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ˜ˆλΉ„ μ½”μΈμ˜ ν•œμͺ½ 면에 μž”μ•‘μ΄ 0인 ν’€λ‘œ 인해 ν’€ 가격 계산이 잘λͺ»λ¨

    • ν’€μ—μ„œ λͺ¨λ“  코인을 μΈμΆœν•œ ν›„ ν•˜λ‚˜μ˜ μ˜ˆλΉ„ μ½”μΈλ§Œ μ˜ˆλΉ„ κ³„μ’Œλ‘œ 직접 λ³΄λ‚΄λŠ” 방식

  • μ˜ˆλΉ„ 코인 λΉ„μœ¨ 계산 μ‹œ 예금 둜직의 νŒ¨λ‹‰(μœ„μ—μ„œ μ„€λͺ…ν•œ ν’€λ‘œ 0으둜 λ‚˜λˆ„κΈ° 였λ₯˜)
  • ...

버전

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] μ μ ˆν•œ 라벨 적용
  • [ ] μ μ ˆν•œ κΈ°μ—¬μž νƒœκ·Έ
  • [ ] κΈ°μ—¬μž 지정/자체 지정

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

고갈된 ν’€ 을 μ€€λΉ„κΈˆμ΄ 0인 풀이 μ•„λ‹ˆλΌ ν’€ 코인 곡급 이 μ—†λŠ” ν’€λ‘œ μ •μ˜ν•˜λ©΄ μ–ΈκΈ‰λœ μƒν™©μ—μ„œ 체인이 νŒ¨λ‹‰ν•˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

μž‘μ—…ν•˜κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  4 λŒ“κΈ€

고갈된 ν’€ 을 μ€€λΉ„κΈˆμ΄ 0인 풀이 μ•„λ‹ˆλΌ ν’€ 코인 곡급 이 μ—†λŠ” ν’€λ‘œ μ •μ˜ν•˜λ©΄ μ–ΈκΈ‰λœ μƒν™©μ—μ„œ 체인이 νŒ¨λ‹‰ν•˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

μž‘μ—…ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ³ λ €ν•  수 μžˆλŠ” 것은 (은행 λͺ¨λ“ˆμ„ 톡해) 토큰 μˆ˜μ‹ μ—μ„œ λΈ”λž™λ¦¬μŠ€νŠΈμ— μžˆλŠ” λͺ¨λ“ˆ 계정을 μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ§€λ§Œ μ΄λŠ” μœ„μ˜ μ†”λ£¨μ…˜μ— λΉ„ν•΄ 더 큰 λ³€ν™”μž…λ‹ˆλ‹€.

@migueldingli1997 μ²˜μŒμ—λŠ” κ·Έ μ ‘κ·Ό 방식을 μƒκ°ν–ˆμ§€λ§Œ ReserveAcc μƒˆ 풀이 μžˆμ„ λ•Œ λ™μ μœΌλ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— κ΅¬ν˜„μ— blockedAddrs 더 큰 변경이 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν•΄κ²° 방법이 μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ 이 μ ‘κ·Ό 방식을 계속 탐색 μ€‘μž…λ‹ˆλ‹€.

λ„€ λ§žμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•œ ν•΄κ²° 방법은 ν•˜λ‚˜μ˜ λͺ¨λ“ˆ 계정(μ œλ„€μ‹œμŠ€ μ‹œ μƒμ„±λ˜κ³  μ μ ˆν•œ μ œν•œμ΄ 있음)만 μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ§€λ§Œ 은행에 λ§‘κΈ°λŠ” λŒ€μ‹  μœ λ™μ„± λͺ¨λ“ˆμ˜ 각 풀에 λŒ€ν•œ μ€€λΉ„κΈˆ μž”μ•‘μ„ 좔적해야 ν•©λ‹ˆλ‹€. κΈ°μ€€ 치수. κ·ΈλŸ¬λ‚˜ 이것이 λ°”λžŒμ§ν•˜μ§€ μ•Šμ„ 수 μžˆμŒμ„ μ΄ν•΄ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰