Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(amm): collect half weight breaking fee #1016

Merged
merged 12 commits into from
Dec 4, 2024
2 changes: 1 addition & 1 deletion x/amm/keeper/calc_in_route_spot_price.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func (k Keeper) CalcInRouteSpotPrice(ctx sdk.Context,
// Estimate swap
snapshot := k.GetAccountedPoolSnapshotOrSet(ctx, pool)
cacheCtx, _ := ctx.CacheContext()
tokenOut, swapSlippage, _, weightBalanceBonus, err := k.SwapOutAmtGivenIn(cacheCtx, pool.PoolId, k.oracleKeeper, &snapshot, tokensIn, tokenOutDenom, swapFee, sdkmath.LegacyOneDec())
tokenOut, swapSlippage, _, weightBalanceBonus, _, err := k.SwapOutAmtGivenIn(cacheCtx, pool.PoolId, k.oracleKeeper, &snapshot, tokensIn, tokenOutDenom, swapFee, sdkmath.LegacyOneDec())
amityadav0 marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdk.Coin{}, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdk.Coin{}, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), err
}
Expand Down
2 changes: 1 addition & 1 deletion x/amm/keeper/calc_out_route_spot_price.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func (k Keeper) CalcOutRouteSpotPrice(ctx sdk.Context, tokenOut sdk.Coin, routes
// Estimate swap
snapshot := k.GetAccountedPoolSnapshotOrSet(ctx, pool)
cacheCtx, _ := ctx.CacheContext()
swapResult, swapSlippage, _, weightBalanceBonus, err := k.SwapInAmtGivenOut(cacheCtx, pool.PoolId, k.oracleKeeper, &snapshot, tokensOut, tokenInDenom, swapFee, sdkmath.LegacyOneDec())
swapResult, swapSlippage, _, weightBalanceBonus, _, err := k.SwapInAmtGivenOut(cacheCtx, pool.PoolId, k.oracleKeeper, &snapshot, tokensOut, tokenInDenom, swapFee, sdkmath.LegacyOneDec())
amityadav0 marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdk.Coin{}, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdk.Coin{}, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), err
}
Expand Down
6 changes: 3 additions & 3 deletions x/amm/keeper/fee.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

err := k.bankKeeper.SendCoins(ctx, sdk.MustAccAddressFromBech32(pool.RebalanceTreasury), poolRevenueAddress, revenueAmount)
if err != nil {
return nil
return err

Check warning on line 32 in x/amm/keeper/fee.go

View check run for this annotation

Codecov / codecov/patch

x/amm/keeper/fee.go#L32

Added line #L32 was not covered by tests
}

// handling the case, pool does not enough liquidity to swap fees to revenue token when liquidity is being fully removed
Expand All @@ -53,7 +53,7 @@
// Executes the swap in the pool and stores the output. Updates pool assets but
// does not actually transfer any tokens to or from the pool.
snapshot := k.GetAccountedPoolSnapshotOrSet(ctx, pool)
tokenOutCoin, _, _, _, err := pool.SwapOutAmtGivenIn(ctx, k.oracleKeeper, &snapshot, sdk.Coins{tokenIn}, pool.PoolParams.FeeDenom, sdkmath.LegacyZeroDec(), k.accountedPoolKeeper, sdkmath.LegacyOneDec(), params)
tokenOutCoin, _, _, _, oracleOutAmount, err := pool.SwapOutAmtGivenIn(ctx, k.oracleKeeper, &snapshot, sdk.Coins{tokenIn}, pool.PoolParams.FeeDenom, sdkmath.LegacyZeroDec(), k.accountedPoolKeeper, sdkmath.LegacyOneDec(), params)
if err != nil {
return err
}
Expand All @@ -66,7 +66,7 @@

// Settles balances between the tx sender and the pool to match the swap that was executed earlier.
// Also emits a swap event and updates related liquidity metrics.
_, err = k.UpdatePoolForSwap(ctx, pool, poolRevenueAddress, poolRevenueAddress, tokenIn, tokenOutCoin, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec())
err = k.UpdatePoolForSwap(ctx, pool, poolRevenueAddress, poolRevenueAddress, tokenIn, tokenOutCoin, sdkmath.LegacyZeroDec(), sdkmath.ZeroInt(), oracleOutAmount.TruncateInt(), sdkmath.LegacyZeroDec(), false)
if err != nil {
return err
}
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/fee_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func (suite *AmmKeeperTestSuite) TestOnCollectFee() {
UseOracle: false,
FeeDenom: ptypes.BaseCurrency,
},
TotalShares: sdk.Coin{},
TotalShares: sdk.NewCoin(types.GetPoolShareDenom(1), sdkmath.ZeroInt()),
PoolAssets: []types.PoolAsset{
{
Token: tc.poolInitBalance[0],
Expand Down Expand Up @@ -181,7 +181,7 @@ func (suite *AmmKeeperTestSuite) TestSwapFeesToRevenueToken() {
UseOracle: false,
FeeDenom: ptypes.BaseCurrency,
},
TotalShares: sdk.Coin{},
TotalShares: sdk.NewCoin(types.GetPoolShareDenom(1), sdkmath.ZeroInt()),
PoolAssets: []types.PoolAsset{
{
Token: tc.poolInitBalance[0],
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/keeper_swap_exact_amount_in.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func (k Keeper) InternalSwapExactAmountIn(
// Executes the swap in the pool and stores the output. Updates pool assets but
// does not actually transfer any tokens to or from the pool.
snapshot := k.GetAccountedPoolSnapshotOrSet(ctx, pool)
tokenOutCoin, _, slippageAmount, weightBalanceBonus, err := pool.SwapOutAmtGivenIn(ctx, k.oracleKeeper, &snapshot, tokensIn, tokenOutDenom, swapFee, k.accountedPoolKeeper, math.LegacyOneDec(), params)
tokenOutCoin, _, slippageAmount, weightBalanceBonus, oracleOutAmount, err := pool.SwapOutAmtGivenIn(ctx, k.oracleKeeper, &snapshot, tokensIn, tokenOutDenom, swapFee, k.accountedPoolKeeper, math.LegacyOneDec(), params)
if err != nil {
return math.Int{}, err
}
Expand All @@ -59,7 +59,7 @@ func (k Keeper) InternalSwapExactAmountIn(

// Settles balances between the tx sender and the pool to match the swap that was executed earlier.
// Also emits a swap event and updates related liquidity metrics.
_, err = k.UpdatePoolForSwap(ctx, pool, sender, recipient, tokenIn, tokenOutCoin, math.LegacyZeroDec(), swapFee, weightBalanceBonus)
err = k.UpdatePoolForSwap(ctx, pool, sender, recipient, tokenIn, tokenOutCoin, swapFee, math.ZeroInt(), oracleOutAmount.TruncateInt(), weightBalanceBonus, false)
if err != nil {
return math.Int{}, err
}
Expand Down
6 changes: 3 additions & 3 deletions x/amm/keeper/keeper_swap_exact_amount_in_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,8 @@ func (suite *AmmKeeperTestSuite) TestSwapExactAmountIn() {
useNewRecipient: false,
expSenderBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 990000), sdk.NewInt64Coin(ptypes.BaseCurrency, 1009969)},
expRecipientBalance: sdk.Coins{},
expPoolBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1010000), sdk.NewInt64Coin(ptypes.BaseCurrency, 990031)},
expTreasuryBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1000000), sdk.NewInt64Coin(ptypes.BaseCurrency, 1000000)},
expPoolBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1009997), sdk.NewInt64Coin(ptypes.BaseCurrency, 990031)},
expTreasuryBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1000003), sdk.NewInt64Coin(ptypes.BaseCurrency, 1000000)},
expPass: true,
},
{
Expand Down Expand Up @@ -225,7 +225,7 @@ func (suite *AmmKeeperTestSuite) TestSwapExactAmountIn() {
SwapFee: tc.swapFeeIn,
FeeDenom: ptypes.BaseCurrency,
},
TotalShares: sdk.Coin{},
TotalShares: sdk.NewCoin(types.GetPoolShareDenom(1), sdkmath.ZeroInt()),
PoolAssets: []types.PoolAsset{
{
Token: tc.poolInitBalance[0],
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/keeper_swap_exact_amount_out.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func (k Keeper) InternalSwapExactAmountOut(

params := k.GetParams(ctx)
snapshot := k.GetAccountedPoolSnapshotOrSet(ctx, pool)
tokenIn, _, slippageAmount, weightBalanceBonus, err := pool.SwapInAmtGivenOut(ctx, k.oracleKeeper, &snapshot, sdk.Coins{tokenOut}, tokenInDenom, swapFee, k.accountedPoolKeeper, math.LegacyOneDec(), params)
tokenIn, _, slippageAmount, weightBalanceBonus, oracleInAmount, err := pool.SwapInAmtGivenOut(ctx, k.oracleKeeper, &snapshot, sdk.Coins{tokenOut}, tokenInDenom, swapFee, k.accountedPoolKeeper, math.LegacyOneDec(), params)
if err != nil {
return math.Int{}, err
}
Expand All @@ -56,7 +56,7 @@ func (k Keeper) InternalSwapExactAmountOut(
return math.Int{}, errorsmod.Wrapf(types.ErrLimitMaxAmount, "swap requires %s, which is greater than the amount %s", tokenIn, tokenInMaxAmount)
}

_, err = k.UpdatePoolForSwap(ctx, pool, sender, recipient, tokenIn, tokenOut, swapFee, math.LegacyZeroDec(), weightBalanceBonus)
err = k.UpdatePoolForSwap(ctx, pool, sender, recipient, tokenIn, tokenOut, swapFee, oracleInAmount.TruncateInt(), math.ZeroInt(), weightBalanceBonus, true)
if err != nil {
return math.Int{}, err
}
Expand Down
10 changes: 5 additions & 5 deletions x/amm/keeper/keeper_swap_exact_amount_out_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,16 +106,16 @@ func (suite *AmmKeeperTestSuite) TestSwapExactAmountOut() {
poolInitBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1000000), sdk.NewInt64Coin(ptypes.BaseCurrency, 1000000)},
treasuryInitBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1000000), sdk.NewInt64Coin(ptypes.BaseCurrency, 1000000)},
swapFeeOut: sdkmath.LegacyZeroDec(),
tokenIn: sdk.NewInt64Coin("uusda", 211409),
tokenIn: sdk.NewInt64Coin("uusda", 211411),
tokenInMax: sdkmath.NewInt(10000000),
tokenOut: sdk.NewInt64Coin(ptypes.BaseCurrency, 200000),
weightBalanceBonus: sdkmath.LegacyZeroDec(),
isOraclePool: true,
useNewRecipient: false,
expSenderBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 788591), sdk.NewInt64Coin(ptypes.BaseCurrency, 1200000)},
expSenderBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 788589), sdk.NewInt64Coin(ptypes.BaseCurrency, 1200000)},
expRecipientBalance: sdk.Coins{},
expPoolBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1211409), sdk.NewInt64Coin(ptypes.BaseCurrency, 800000)},
expTreasuryBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1000000), sdk.NewInt64Coin(ptypes.BaseCurrency, 1000000)},
expPoolBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1211270), sdk.NewInt64Coin(ptypes.BaseCurrency, 800000)},
expTreasuryBalance: sdk.Coins{sdk.NewInt64Coin("uusda", 1000141), sdk.NewInt64Coin(ptypes.BaseCurrency, 1000000)},
expPass: true,
},
{
Expand Down Expand Up @@ -216,7 +216,7 @@ func (suite *AmmKeeperTestSuite) TestSwapExactAmountOut() {
SwapFee: tc.swapFeeOut,
FeeDenom: ptypes.BaseCurrency,
},
TotalShares: sdk.Coin{},
TotalShares: sdk.NewCoin(types.GetPoolShareDenom(1), sdkmath.ZeroInt()),
PoolAssets: []types.PoolAsset{
{
Token: tc.poolInitBalance[0],
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/msg_server_exit_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ func (suite *AmmKeeperTestSuite) TestMsgServerExitPool() {
},
shareInAmount: types.OneShare.Quo(sdkmath.NewInt(10)),
tokenOutDenom: ptypes.BaseCurrency,
minAmountsOut: sdk.Coins{sdk.NewInt64Coin(ptypes.BaseCurrency, 99344)},
minAmountsOut: sdk.Coins{sdk.NewInt64Coin(ptypes.BaseCurrency, 99221)},
// expSenderBalance: sdk.Coins{sdk.NewInt64Coin(ptypes.BaseCurrency, 99197)}, // slippage enabled
expSenderBalance: sdk.Coins{sdk.NewInt64Coin(ptypes.BaseCurrency, 99344)}, // slippage disabled
expSenderBalance: sdk.Coins{sdk.NewInt64Coin(ptypes.BaseCurrency, 99221)}, // slippage disabled
expPass: true,
},
} {
Expand Down
2 changes: 1 addition & 1 deletion x/amm/keeper/msg_server_join_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func (suite *AmmKeeperTestSuite) TestMsgServerJoinPool() {
FeeDenom: ptypes.BaseCurrency,
},
// shareOutAmount: math.NewInt(805987500000000000), // weight recovery direction - slippage enable
shareOutAmount: math.NewInt(999500000000000000), // weight recovery direction - slippage disable
shareOutAmount: math.NewInt(992205771365940052), // weight recovery direction - slippage disable
expSenderBalance: sdk.Coins{},
expTokenIn: sdk.Coins{sdk.NewInt64Coin("uusdt", 1000000)},
expPass: true,
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ func (k Keeper) GetAccountedPoolSnapshotOrSet(ctx sdk.Context, pool types.Pool)
}

// AddToPoolBalance Used in perpetual balance changes
func (k Keeper) AddToPoolBalance(ctx sdk.Context, pool *types.Pool, addShares sdkmath.Int, coins sdk.Coins) error {
func (k Keeper) AddToPoolBalanceAndUpdateLiquidity(ctx sdk.Context, pool *types.Pool, addShares sdkmath.Int, coins sdk.Coins) error {
err := pool.IncreaseLiquidity(addShares, coins)
if err != nil {
return err
Expand All @@ -219,7 +219,7 @@ func (k Keeper) AddToPoolBalance(ctx sdk.Context, pool *types.Pool, addShares sd
}

// RemoveFromPoolBalance Used in perpetual balance changes
func (k Keeper) RemoveFromPoolBalance(ctx sdk.Context, pool *types.Pool, removeShares sdkmath.Int, coins sdk.Coins) error {
func (k Keeper) RemoveFromPoolBalanceAndUpdateLiquidity(ctx sdk.Context, pool *types.Pool, removeShares sdkmath.Int, coins sdk.Coins) error {
err := pool.DecreaseLiquidity(removeShares, coins)
if err != nil {
return err
Expand Down
8 changes: 4 additions & 4 deletions x/amm/keeper/pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ func (suite *AmmKeeperTestSuite) TestPool() {
amount := sdkmath.NewInt(100000000000)
pool := suite.CreateNewAmmPool(addr, true, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), ptypes.ATOM, amount.MulRaw(10), amount.MulRaw(10))

err := suite.app.AmmKeeper.AddToPoolBalance(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin("non-existant-denom", amount)))
err := suite.app.AmmKeeper.AddToPoolBalanceAndUpdateLiquidity(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin("non-existant-denom", amount)))
suite.Require().Error(err)
},
},
Expand All @@ -179,7 +179,7 @@ func (suite *AmmKeeperTestSuite) TestPool() {
amount := sdkmath.NewInt(100000000000)
pool := suite.CreateNewAmmPool(addr, true, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), ptypes.ATOM, amount.MulRaw(10), amount.MulRaw(10))

err := suite.app.AmmKeeper.AddToPoolBalance(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin(ptypes.ATOM, amount)))
err := suite.app.AmmKeeper.AddToPoolBalanceAndUpdateLiquidity(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin(ptypes.ATOM, amount)))
suite.Require().NoError(err)
},
},
Expand All @@ -195,7 +195,7 @@ func (suite *AmmKeeperTestSuite) TestPool() {
amount := sdkmath.NewInt(100000000000)
pool := suite.CreateNewAmmPool(addr, true, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), ptypes.ATOM, amount.MulRaw(10), amount.MulRaw(10))

err := suite.app.AmmKeeper.RemoveFromPoolBalance(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin("non-existant-denom", amount)))
err := suite.app.AmmKeeper.RemoveFromPoolBalanceAndUpdateLiquidity(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin("non-existant-denom", amount)))
suite.Require().Error(err)
},
},
Expand All @@ -211,7 +211,7 @@ func (suite *AmmKeeperTestSuite) TestPool() {
amount := sdkmath.NewInt(100000000000)
pool := suite.CreateNewAmmPool(addr, true, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), ptypes.ATOM, amount.MulRaw(10), amount.MulRaw(10))

err := suite.app.AmmKeeper.RemoveFromPoolBalance(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin(ptypes.ATOM, amount)))
err := suite.app.AmmKeeper.RemoveFromPoolBalanceAndUpdateLiquidity(suite.ctx, &pool, sdkmath.ZeroInt(), sdk.NewCoins(sdk.NewCoin(ptypes.ATOM, amount)))
suite.Require().NoError(err)
},
},
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/swap_in_amt_given_out.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
func (k Keeper) SwapInAmtGivenOut(
ctx sdk.Context, poolId uint64, oracleKeeper types.OracleKeeper, snapshot *types.Pool,
tokensOut sdk.Coins, tokenInDenom string, swapFee math.LegacyDec, weightBreakingFeePerpetualFactor math.LegacyDec) (
tokenIn sdk.Coin, slippage, slippageAmount math.LegacyDec, weightBalanceBonus math.LegacyDec, err error,
tokenIn sdk.Coin, slippage, slippageAmount math.LegacyDec, weightBalanceBonus math.LegacyDec, oracleInAmount math.LegacyDec, err error,
) {
ammPool, found := k.GetPool(ctx, poolId)
if !found {
return sdk.Coin{}, math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec(), fmt.Errorf("invalid pool: %d", poolId)
return sdk.Coin{}, math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec(), fmt.Errorf("invalid pool: %d", poolId)

Check warning on line 20 in x/amm/keeper/swap_in_amt_given_out.go

View check run for this annotation

Codecov / codecov/patch

x/amm/keeper/swap_in_amt_given_out.go#L20

Added line #L20 was not covered by tests
}
params := k.GetParams(ctx)
return ammPool.SwapInAmtGivenOut(ctx, oracleKeeper, snapshot, tokensOut, tokenInDenom, swapFee, k.accountedPoolKeeper, weightBreakingFeePerpetualFactor, params)
Expand Down
4 changes: 2 additions & 2 deletions x/amm/keeper/swap_out_amt_given_in.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
tokenOutDenom string,
swapFee sdkmath.LegacyDec,
weightBreakingFeePerpetualFactor sdkmath.LegacyDec,
) (tokenOut sdk.Coin, slippage sdkmath.LegacyDec, slippageAmount sdkmath.LegacyDec, weightBalanceBonus sdkmath.LegacyDec, err error) {
) (tokenOut sdk.Coin, slippage sdkmath.LegacyDec, slippageAmount sdkmath.LegacyDec, weightBalanceBonus sdkmath.LegacyDec, oracleOutAmount sdkmath.LegacyDec, err error) {
ammPool, found := k.GetPool(ctx, poolId)
if !found {
return sdk.Coin{}, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), fmt.Errorf("invalid pool: %d", poolId)
return sdk.Coin{}, sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), fmt.Errorf("invalid pool: %d", poolId)

Check warning on line 23 in x/amm/keeper/swap_out_amt_given_in.go

View check run for this annotation

Codecov / codecov/patch

x/amm/keeper/swap_out_amt_given_in.go#L23

Added line #L23 was not covered by tests
}
params := k.GetParams(ctx)
return ammPool.SwapOutAmtGivenIn(ctx, oracleKeeper, snapshot, tokensIn, tokenOutDenom, swapFee, k.accountedPoolKeeper, weightBreakingFeePerpetualFactor, params)
Expand Down
Loading
Loading