Skip to content

Commit

Permalink
Merge pull request paraswap#424 from paraswap/fix/fix-pos-when-no-par…
Browse files Browse the repository at this point in the history
…tner-fee

Fix/fix pos when no partner fee
  • Loading branch information
mwamedacen authored Jun 22, 2023
2 parents 41537b9 + bd81c42 commit e0afe26
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 50 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@paraswap/dex-lib",
"version": "2.22.2",
"version": "2.22.3",
"main": "build/index.js",
"types": "build/index.d.ts",
"repository": "https://github.com/paraswap/paraswap-dex-lib",
Expand Down
27 changes: 19 additions & 8 deletions src/router/buy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
PayloadEncoder,
encodeFeePercent,
encodeFeePercentForReferrer,
encodePartnerAddressForFeeLogic,
} from './payload-encoder';
import {
Address,
Expand Down Expand Up @@ -61,6 +62,22 @@ export class Buy extends PayloadEncoder implements IRouter<BuyParam> {
minMaxAmount,
priceRoute.srcAmount,
);

const [partner, feePercent] = referrerAddress
? [referrerAddress, encodeFeePercentForReferrer(SwapSide.BUY)]
: [
encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}),
encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.BUY,
),
];

const buyData: ContractBuyData = {
adapter,
fromToken: priceRoute.srcToken,
Expand All @@ -70,14 +87,8 @@ export class Buy extends PayloadEncoder implements IRouter<BuyParam> {
expectedAmount: priceRoute.srcAmount,
beneficiary,
route,
partner: referrerAddress || partnerAddress,
feePercent: referrerAddress
? encodeFeePercentForReferrer(SwapSide.BUY)
: encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.BUY,
),
partner,
feePercent,
permit,
deadline,
uuid: uuidToBytes16(uuid),
Expand Down
26 changes: 18 additions & 8 deletions src/router/directswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { assert } from 'ts-essentials';
import {
encodeFeePercent,
encodeFeePercentForReferrer,
encodePartnerAddressForFeeLogic,
} from './payload-encoder';

export class DirectSwap<DexDirectReturn> implements IRouter<DexDirectReturn> {
Expand Down Expand Up @@ -69,6 +70,21 @@ export class DirectSwap<DexDirectReturn> implements IRouter<DexDirectReturn> {
? priceRoute.destAmount
: priceRoute.srcAmount;

const [partner, feePercent] = referrerAddress
? [referrerAddress, encodeFeePercentForReferrer(priceRoute.side)]
: [
encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}),
encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
priceRoute.side,
),
];

return dex.getDirectParam!(
priceRoute.srcToken,
priceRoute.destToken,
Expand All @@ -79,15 +95,9 @@ export class DirectSwap<DexDirectReturn> implements IRouter<DexDirectReturn> {
priceRoute.side,
permit,
uuid,
referrerAddress
? encodeFeePercentForReferrer(priceRoute.side)
: encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
priceRoute.side,
),
feePercent,
deadline,
referrerAddress || partnerAddress,
partner,
beneficiary,
priceRoute.contractMethod,
);
Expand Down
27 changes: 19 additions & 8 deletions src/router/megaswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
PayloadEncoder,
encodeFeePercent,
encodeFeePercentForReferrer,
encodePartnerAddressForFeeLogic,
} from './payload-encoder';
import {
Address,
Expand Down Expand Up @@ -50,21 +51,31 @@ export class MegaSwap extends PayloadEncoder implements IRouter<MegaSwapParam> {
const { megaSwapPaths, networkFee } = this.getMegaSwapPathsWithNetworkFee(
priceRoute.bestRoute,
);

const [partner, feePercent] = referrerAddress
? [referrerAddress, encodeFeePercentForReferrer(SwapSide.SELL)]
: [
encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}),
encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.SELL,
),
];

const sellData: ContractMegaSwapSellData = {
fromToken: priceRoute.srcToken,
fromAmount: priceRoute.srcAmount,
toAmount: minMaxAmount,
expectedAmount: priceRoute.destAmount,
beneficiary,
path: megaSwapPaths,
partner: referrerAddress || partnerAddress,
feePercent: referrerAddress
? encodeFeePercentForReferrer(SwapSide.SELL)
: encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.SELL,
),
partner,
feePercent,
permit,
deadline,
uuid: uuidToBytes16(uuid),
Expand Down
27 changes: 19 additions & 8 deletions src/router/multiswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
PayloadEncoder,
encodeFeePercent,
encodeFeePercentForReferrer,
encodePartnerAddressForFeeLogic,
} from './payload-encoder';
import {
Address,
Expand Down Expand Up @@ -58,21 +59,31 @@ export class MultiSwap
const { paths, networkFee } = this.getContractPathsWithNetworkFee(
priceRoute.bestRoute[0].swaps,
);

const [partner, feePercent] = referrerAddress
? [referrerAddress, encodeFeePercentForReferrer(SwapSide.SELL)]
: [
encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}),
encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.SELL,
),
];

const sellData: ContractSellData = {
fromToken: priceRoute.srcToken,
fromAmount: priceRoute.srcAmount,
toAmount: minMaxAmount,
expectedAmount: priceRoute.destAmount,
beneficiary,
path: paths,
partner: referrerAddress || partnerAddress,
feePercent: referrerAddress
? encodeFeePercentForReferrer(SwapSide.SELL)
: encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.SELL,
),
partner,
feePercent,
permit,
deadline,
uuid: uuidToBytes16(uuid),
Expand Down
27 changes: 26 additions & 1 deletion src/router/payload-encoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import {
Address,
Adapters,
} from '../types';
import { SwapSide } from '../constants';
import { NULL_ADDRESS, SwapSide } from '../constants';
import { DexAdapterService } from '../dex';
import { convertToBasisPoints } from '../utils';
import { assert } from 'ts-essentials';

const OneShift14 = 1n << 14n;
const OneShift15 = 1n << 15n;
Expand All @@ -25,6 +26,29 @@ const REFERRER_FEE = 2500n | OneShift14 | OneShift16 | OneShift248;

const HALF_SPLIT = '5000';

export function encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}: {
partnerAddress: string;
partnerFeePercent: string;
positiveSlippageToUser: boolean;
}): string {
const isPartnerTakeNoFeeNoPos =
+partnerFeePercent === 0 && positiveSlippageToUser == true;

// nullify partner address to fallback default circuit contract without partner/referrer (no harm as no fee taken at all)
const partner = isPartnerTakeNoFeeNoPos ? NULL_ADDRESS : partnerAddress;

// invariant checks
if (+partnerFeePercent > 0 && partner !== partnerAddress) {
throw new Error('logic error: should return partner address if fee is set');
}

return partner;
}

export function encodeFeePercent(
partnerFeePercent: string,
positiveSlippageToUser: boolean,
Expand All @@ -47,6 +71,7 @@ export function encodeFeePercent(
}

// Set 14th bit if positiveSlippageToUser is true
// Upd: not used onchain anymore but better to keep to prevent collisions and ensure continuity of analytics
if (positiveSlippageToUser) fee |= OneShift14;

// Set 15th bit to take fee from srcToken
Expand Down
26 changes: 18 additions & 8 deletions src/router/simpleswap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { DexAdapterService } from '../dex';
import {
encodeFeePercent,
encodeFeePercentForReferrer,
encodePartnerAddressForFeeLogic,
} from './payload-encoder';

type SimpleSwapParam = [ConstractSimpleData];
Expand Down Expand Up @@ -285,6 +286,21 @@ export abstract class SimpleRouter extends SimpleRouterBase<SimpleSwapParam> {
minMaxAmount,
);

const [partner, feePercent] = referrerAddress
? [referrerAddress, encodeFeePercentForReferrer(this.side)]
: [
encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}),
encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
this.side,
),
];

const sellData: ConstractSimpleData = {
...partialContractSimpleData,
fromToken: priceRoute.srcToken,
Expand All @@ -298,14 +314,8 @@ export abstract class SimpleRouter extends SimpleRouterBase<SimpleSwapParam> {
? priceRoute.destAmount
: priceRoute.srcAmount,
beneficiary,
partner: referrerAddress || partnerAddress,
feePercent: referrerAddress
? encodeFeePercentForReferrer(this.side)
: encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
this.side,
),
partner,
feePercent,
permit,
deadline,
uuid: uuidToBytes16(uuid),
Expand Down
26 changes: 18 additions & 8 deletions src/router/simpleswapnft.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { DexAdapterService } from '../dex';
import {
encodeFeePercent,
encodeFeePercentForReferrer,
encodePartnerAddressForFeeLogic,
} from './payload-encoder';
import { PartialContractSimpleData, SimpleRouterBase } from './simpleswap';
import { BI_ADDR_MASK } from '../bigint-constants';
Expand Down Expand Up @@ -95,6 +96,21 @@ export class SimpleBuyNFT extends SimpleRouterBase<SimpleBuyNFTParam> {
};
};

const [partner, feePercent] = referrerAddress
? [referrerAddress, encodeFeePercentForReferrer(SwapSide.BUY)]
: [
encodePartnerAddressForFeeLogic({
partnerAddress,
partnerFeePercent,
positiveSlippageToUser,
}),
encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.BUY,
),
];

const buyData: ContractSimpleBuyNFTData = {
...partialContractSimpleData,
fromToken: priceRoute.srcToken,
Expand All @@ -104,14 +120,8 @@ export class SimpleBuyNFT extends SimpleRouterBase<SimpleBuyNFTParam> {
fromAmount: minMaxAmount,
expectedAmount: priceRoute.srcAmount,
beneficiary,
partner: referrerAddress || partnerAddress,
feePercent: referrerAddress
? encodeFeePercentForReferrer(SwapSide.BUY)
: encodeFeePercent(
partnerFeePercent,
positiveSlippageToUser,
SwapSide.BUY,
),
partner,
feePercent,
permit,
deadline,
uuid: uuidToBytes16(uuid),
Expand Down

0 comments on commit e0afe26

Please sign in to comment.