per-asset fees
This commit is contained in:
@@ -268,8 +268,8 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
/// @param bases_ scaling _bases for each token
|
||||
/// @param totalSupply_ current total LP token supply
|
||||
/// @return amountInUsed actual input amount used (excluding fee)
|
||||
/// @return fee fee amount charged
|
||||
/// @return lpMinted LP _tokens that would be minted
|
||||
/// @return lpMinted LP tokens that would be minted
|
||||
/// @return inFee fee amount charged
|
||||
function swapMintAmounts(
|
||||
uint256 inputTokenIndex,
|
||||
uint256 maxAmountIn,
|
||||
@@ -277,7 +277,7 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
LMSRStabilized.State memory lmsrState,
|
||||
uint256[] memory bases_,
|
||||
uint256 totalSupply_
|
||||
) public pure returns (uint256 amountInUsed, uint256 fee, uint256 lpMinted) {
|
||||
) public pure returns (uint256 amountInUsed, uint256 lpMinted, uint256 inFee) {
|
||||
require(inputTokenIndex < bases_.length, "swapMintAmounts: idx");
|
||||
require(maxAmountIn > 0, "swapMintAmounts: input zero");
|
||||
require(lmsrState.nAssets > 0, "swapMintAmounts: uninit pool");
|
||||
@@ -304,11 +304,11 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
require(amountInUsed > 0, "swapMintAmounts: input zero after internal conversion");
|
||||
|
||||
// Compute fee on the actual used input (ceiling)
|
||||
fee = 0;
|
||||
inFee = 0;
|
||||
if (swapFeePpm > 0) {
|
||||
fee = (amountInUsed * swapFeePpm + 999999) / 1000000; // ceil fee
|
||||
inFee = (amountInUsed * swapFeePpm + 999999) / 1000000; // ceil fee
|
||||
}
|
||||
uint256 totalTransfer = amountInUsed + fee;
|
||||
uint256 totalTransfer = amountInUsed + inFee;
|
||||
require(totalTransfer > 0 && totalTransfer <= maxAmountIn, "swapMintAmounts: transfer exceeds max");
|
||||
|
||||
// Compute old and new scaled size metrics to determine LP minted
|
||||
@@ -345,7 +345,7 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
/// @param maxAmountIn maximum uint token input (inclusive of fee)
|
||||
/// @param deadline optional deadline
|
||||
/// @param swapFeePpm fee in parts-per-million for this pool
|
||||
/// @return lpMinted actual LP minted (uint)
|
||||
/// @return amountInUsed actual input used (uint256), lpMinted actual LP minted (uint256), inFee fee taken from the input (uint256)
|
||||
function swapMint(
|
||||
address payer,
|
||||
address receiver,
|
||||
@@ -354,7 +354,7 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
uint256 deadline,
|
||||
uint256 swapFeePpm,
|
||||
uint256 protocolFeePpm
|
||||
) external payable native killable nonReentrant returns (uint256 lpMinted) {
|
||||
) external payable native killable nonReentrant returns (uint256 amountInUsed, uint256 lpMinted, uint256 inFee) {
|
||||
uint256 n = _tokens.length;
|
||||
require(inputTokenIndex < n, "swapMint: idx");
|
||||
require(maxAmountIn > 0, "swapMint: input zero");
|
||||
@@ -435,7 +435,10 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
emit IPartyPool.SwapMint(payer, receiver, _tokens[inputTokenIndex],
|
||||
totalTransfer, actualLpToMint, feeUintActual-protoShare, protoShare);
|
||||
|
||||
return actualLpToMint;
|
||||
amountInUsed = amountInUint;
|
||||
lpMinted = actualLpToMint;
|
||||
inFee = feeUintActual;
|
||||
return (amountInUsed, lpMinted, inFee);
|
||||
}
|
||||
|
||||
/// @notice Calculate the amounts for a burn swap operation
|
||||
@@ -454,7 +457,7 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
LMSRStabilized.State memory lmsrState,
|
||||
uint256[] memory bases_,
|
||||
uint256 totalSupply_
|
||||
) public pure returns (uint256 amountOut) {
|
||||
) public pure returns (uint256 amountOut, uint256 outFee) {
|
||||
require(outputTokenIndex < bases_.length, "burnSwapAmounts: idx");
|
||||
require(lpAmount > 0, "burnSwapAmounts: zero lp");
|
||||
require(totalSupply_ > 0, "burnSwapAmounts: empty supply");
|
||||
@@ -470,6 +473,13 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
||||
// Convert payoutInternal -> uint (floor) to favor pool
|
||||
amountOut = _internalToUintFloorPure(payoutInternal, bases_[outputTokenIndex]);
|
||||
require(amountOut > 0, "burnSwapAmounts: output zero");
|
||||
|
||||
// Compute gross payout (no swap fee) to derive token-side fee = gross - net
|
||||
int128 alphaGross = ABDKMath64x64.divu(lpAmount, totalSupply_); // gross fraction (no swap fee)
|
||||
(int128 payoutGrossInternal, ) = LMSRStabilized.swapAmountsForBurn(lmsrState.nAssets, lmsrState.kappa, lmsrState.qInternal,
|
||||
outputTokenIndex, alphaGross);
|
||||
uint256 payoutGrossUint = _internalToUintFloorPure(payoutGrossInternal, bases_[outputTokenIndex]);
|
||||
outFee = (payoutGrossUint > amountOut) ? (payoutGrossUint - amountOut) : 0;
|
||||
}
|
||||
|
||||
/// @notice Burn LP _tokens then swap the redeemed proportional basket into a single asset `outputTokenIndex` and send to receiver.
|
||||
|
||||
Reference in New Issue
Block a user