From 6141119f4db96ac58592a6aa525cb7539bb72e83 Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 12:12:50 +0900 Subject: [PATCH 1/7] add api support to charge fees on paraswap --- src/components/Aggregator/adapters/paraswap.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/Aggregator/adapters/paraswap.ts b/src/components/Aggregator/adapters/paraswap.ts index 632c17b7..2fd3e4d5 100644 --- a/src/components/Aggregator/adapters/paraswap.ts +++ b/src/components/Aggregator/adapters/paraswap.ts @@ -45,7 +45,7 @@ export async function getQuote( from: string, to: string, amount: string, - { fromToken, toToken, userAddress, slippage, amountOut } + { fromToken, toToken, userAddress, slippage, amountOut, feeAddress, feeBps } ) { // ethereum = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE // amount should include decimals @@ -74,7 +74,13 @@ export async function getQuote( takeSurplus: true, priceRoute: data.priceRoute, isCapSurplus: true, - ...(side === 'BUY' ? { destAmount: data.priceRoute.destAmount } : { srcAmount: data.priceRoute.srcAmount }) + ...(side === 'BUY' ? { destAmount: data.priceRoute.destAmount } : { srcAmount: data.priceRoute.srcAmount }), + ...(feeAddress && feeBps + ? { + partnerAdress: feeAddress, + partnerFeeBps: feeBps + } + : {}) }), headers: { 'Content-Type': 'application/json' From ffc757caf65e384e016b49e06cb38a71477dc220 Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 12:28:07 +0900 Subject: [PATCH 2/7] kyberswap --- src/components/Aggregator/adapters/kyberswap.ts | 3 ++- src/components/Aggregator/types.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Aggregator/adapters/kyberswap.ts b/src/components/Aggregator/adapters/kyberswap.ts index 363d204d..3be25f31 100644 --- a/src/components/Aggregator/adapters/kyberswap.ts +++ b/src/components/Aggregator/adapters/kyberswap.ts @@ -58,10 +58,11 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenFrom = from === zeroAddress ? nativeToken : from; const tokenTo = to === zeroAddress ? nativeToken : to; + const feesPathParams = extra.feeAddress && extra.feeBps ? `&feeReceiver=${extra.feeAddress}&feeAmount=${extra.feeBps}&isInBps=true&chargeFeeBy=currency_out` : ''; const quote = await fetch( `https://aggregator-api.kyberswap.com/${ chainToId[chain] - }/api/v1/routes?tokenIn=${tokenFrom}&tokenOut=${tokenTo}&amountIn=${amount}&gasInclude=true`, + }/api/v1/routes?tokenIn=${tokenFrom}&tokenOut=${tokenTo}&amountIn=${amount}&gasInclude=true${feesPathParams}`, { headers: { 'x-client-id': clientId diff --git a/src/components/Aggregator/types.ts b/src/components/Aggregator/types.ts index f74f657d..c6362105 100644 --- a/src/components/Aggregator/types.ts +++ b/src/components/Aggregator/types.ts @@ -2,4 +2,6 @@ export interface ExtraData { userAddress: string; slippage: string; amountOut: string; + feeAddress?: string; + feeBps?: number; } From f9ad17b6d24600ac8acc7ba842e1807312cd8ba5 Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 12:36:09 +0900 Subject: [PATCH 3/7] odos --- src/components/Aggregator/adapters/odos/index.ts | 3 ++- src/components/Aggregator/types.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/Aggregator/adapters/odos/index.ts b/src/components/Aggregator/adapters/odos/index.ts index eb6f43ad..1e7d02a1 100644 --- a/src/components/Aggregator/adapters/odos/index.ts +++ b/src/components/Aggregator/adapters/odos/index.ts @@ -68,7 +68,8 @@ export async function getQuote(chain: string, from: string, to: string, amount: referralCode, // optional: disableRFQs: true, - compact: true + compact: true, + ...(extra.referralCode ? { referralCode: extra.referralCode } : {}) }) }).then((res) => res.json()); diff --git a/src/components/Aggregator/types.ts b/src/components/Aggregator/types.ts index c6362105..c841fdeb 100644 --- a/src/components/Aggregator/types.ts +++ b/src/components/Aggregator/types.ts @@ -4,4 +4,5 @@ export interface ExtraData { amountOut: string; feeAddress?: string; feeBps?: number; + referralCode?: string; } From 154add62e810bb3c3bfb64e386467298eb9ff8a3 Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 12:55:48 +0900 Subject: [PATCH 4/7] 1inch --- src/components/Aggregator/adapters/1inch.ts | 8 +++++--- src/components/Aggregator/adapters/kyberswap.ts | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/Aggregator/adapters/1inch.ts b/src/components/Aggregator/adapters/1inch.ts index bd1a4b4d..5a0ced1a 100644 --- a/src/components/Aggregator/adapters/1inch.ts +++ b/src/components/Aggregator/adapters/1inch.ts @@ -56,15 +56,17 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenTo = to === zeroAddress ? nativeToken : to; const authHeader = process.env.INCH_API_KEY ? { 'Authorization': `Bearer ${process.env.INCH_API_KEY as string}` } : {}; const tokenApprovalAddress = spenders[chain]; - + //fee in % not bps, min 0 max 3 + const fees = extra.feeBps ? Math.min(extra.feeBps / 100, 3) : 0; + const feesPathParams = extra.feeAddress && extra.feeBps ? `&referrer=${extra.feeAddress}&fee=${fees}` : `&referrer=${altReferralAddress}`; const [data, swapData] = await Promise.all([ fetch( - `${apiEndpoint}${chainToId[chain]}/quote?src=${tokenFrom}&dst=${tokenTo}&amount=${amount}&includeGas=true`, + `${apiEndpoint}${chainToId[chain]}/quote?src=${tokenFrom}&dst=${tokenTo}&amount=${amount}&fee=${fees}&includeGas=true${feesPathParams}`, { headers: authHeader as any } ).then((r) => r.json()), extra.userAddress !== zeroAddress ? fetch( - `${apiEndpoint}${chainToId[chain]}/swap?src=${tokenFrom}&dst=${tokenTo}&amount=${amount}&from=${extra.userAddress}&origin=${extra.userAddress}&slippage=${extra.slippage}&referrer=${altReferralAddress}&disableEstimate=true`, + `${apiEndpoint}${chainToId[chain]}/swap?src=${tokenFrom}&dst=${tokenTo}&amount=${amount}&from=${extra.userAddress}&origin=${extra.userAddress}&slippage=${extra.slippage}${feesPathParams}&disableEstimate=true`, { headers: authHeader as any } ).then((r) => r.json()) : null diff --git a/src/components/Aggregator/adapters/kyberswap.ts b/src/components/Aggregator/adapters/kyberswap.ts index 3be25f31..03a5e8dc 100644 --- a/src/components/Aggregator/adapters/kyberswap.ts +++ b/src/components/Aggregator/adapters/kyberswap.ts @@ -58,7 +58,7 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenFrom = from === zeroAddress ? nativeToken : from; const tokenTo = to === zeroAddress ? nativeToken : to; - const feesPathParams = extra.feeAddress && extra.feeBps ? `&feeReceiver=${extra.feeAddress}&feeAmount=${extra.feeBps}&isInBps=true&chargeFeeBy=currency_out` : ''; + const feesPathParams = extra.feeAddress && extra.feeBps ? `&feeReceiver=${extra.feeAddress}&feeAmount=${extra.feeBps}&isInBps=true&chargeFeeBy=currency_in` : ''; const quote = await fetch( `https://aggregator-api.kyberswap.com/${ chainToId[chain] From 80195b9465e5681ea5323f1bc7cc7664c3fb786b Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 13:26:17 +0900 Subject: [PATCH 5/7] cowswap --- src/components/Aggregator/adapters/cowswap/index.ts | 2 +- src/components/Aggregator/types.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Aggregator/adapters/cowswap/index.ts b/src/components/Aggregator/adapters/cowswap/index.ts index 8e3c7eae..fe7afb88 100644 --- a/src/components/Aggregator/adapters/cowswap/index.ts +++ b/src/components/Aggregator/adapters/cowswap/index.ts @@ -76,7 +76,7 @@ export async function getQuote(chain: string, from: string, to: string, amount: sellToken: tokenFrom, buyToken: tokenTo, receiver: extra.userAddress, - appData: '0xf249b3db926aa5b5a1b18f3fec86b9cc99b9a8a99ad7e8034242d2838ae97422', // generated using https://explorer.cow.fi/appdata?tab=encode + appData: extra.appData || '0xf249b3db926aa5b5a1b18f3fec86b9cc99b9a8a99ad7e8034242d2838ae97422', // generated using https://explorer.cow.fi/appdata?tab=encode partiallyFillable: false, sellTokenBalance: 'erc20', buyTokenBalance: 'erc20', diff --git a/src/components/Aggregator/types.ts b/src/components/Aggregator/types.ts index c841fdeb..1609bbc2 100644 --- a/src/components/Aggregator/types.ts +++ b/src/components/Aggregator/types.ts @@ -5,4 +5,5 @@ export interface ExtraData { feeAddress?: string; feeBps?: number; referralCode?: string; + appData?: string; } From 9f964457b40632c02471d9cf1318ec02af2eea99 Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 13:28:01 +0900 Subject: [PATCH 6/7] fix --- src/components/Aggregator/adapters/odos/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/Aggregator/adapters/odos/index.ts b/src/components/Aggregator/adapters/odos/index.ts index 1e7d02a1..2d7a5a94 100644 --- a/src/components/Aggregator/adapters/odos/index.ts +++ b/src/components/Aggregator/adapters/odos/index.ts @@ -65,11 +65,10 @@ export async function getQuote(chain: string, from: string, to: string, amount: ], userAddr: extra.userAddress, // checksummed user address slippageLimitPercent: extra.slippage, // set your slippage limit percentage (1 = 1%), - referralCode, + referralCode: extra.referralCode || referralCode, // optional: disableRFQs: true, - compact: true, - ...(extra.referralCode ? { referralCode: extra.referralCode } : {}) + compact: true }) }).then((res) => res.json()); From 66cbde2a72927b68691acd5e5c8de981ed8859d1 Mon Sep 17 00:00:00 2001 From: mintdart <96025197+mintdart@users.noreply.github.com> Date: Fri, 2 May 2025 13:48:53 +0900 Subject: [PATCH 7/7] 0x --- src/components/Aggregator/adapters/0x.ts | 6 ++++-- src/components/Aggregator/adapters/0xGasless.ts | 6 ++++-- src/components/Aggregator/adapters/1inch.ts | 2 +- src/components/Aggregator/adapters/kyberswap.ts | 2 +- src/components/Aggregator/adapters/paraswap.ts | 6 +++--- src/components/Aggregator/types.ts | 2 +- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/Aggregator/adapters/0x.ts b/src/components/Aggregator/adapters/0x.ts index 1a03126d..86d6b667 100644 --- a/src/components/Aggregator/adapters/0x.ts +++ b/src/components/Aggregator/adapters/0x.ts @@ -33,13 +33,15 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenTo = to === zeroAddress ? nativeToken : to; const amountParam = extra.amountOut && extra.amountOut !== '0' ? `buyAmount=${extra.amountOut}` : `sellAmount=${amount}`; - + // fees = percentage (denoted as a decimal between 0 - 1.0 where 1.0 represents 100%) + const fees = extra.feeBps ? Math.max(extra.feeBps / (100 * 100), 1) : 0; + const feesPathParams = extra.feeRecipient && extra.feeBps ? `&feeRecipient=${extra.feeRecipient}&buyTokenPercentageFee=${fees}&feeRecipientTradeSurplus=${extra.feeRecipient}` : `&feeRecipientTradeSurplus=${feeCollectorAddress}`; const data = await fetch( `${chainToId[chain]}swap/v1/quote?buyToken=${tokenTo}&${amountParam}&sellToken=${tokenFrom}&slippagePercentage=${ extra.slippage / 100 }&affiliateAddress=${defillamaReferrerAddress}&enableSlippageProtection=false&intentOnFilling=true&takerAddress=${ extra.userAddress - }&skipValidation=true&feeRecipientTradeSurplus=${feeCollectorAddress}`, + }&skipValidation=true${feesPathParams}`, { headers: { '0x-api-key': process.env.OX_API_KEY as string diff --git a/src/components/Aggregator/adapters/0xGasless.ts b/src/components/Aggregator/adapters/0xGasless.ts index 8a108326..190eb26e 100644 --- a/src/components/Aggregator/adapters/0xGasless.ts +++ b/src/components/Aggregator/adapters/0xGasless.ts @@ -36,13 +36,15 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenTo = to === zeroAddress ? nativeToken : to; const amountParam = extra.amountOut && extra.amountOut !== '0' ? `buyAmount=${extra.amountOut}` : `sellAmount=${amount}`; - + // fees = percentage (denoted as a decimal between 0 - 1.0 where 1.0 represents 100%) + const fees = extra.feeBps ? Math.max(extra.feeBps / (100 * 100), 1) : 0; + const feesPathParams = extra.feeRecipient && extra.feeBps ? `&feeRecipient=${extra.feeRecipient}&feeSellTokenPercentage=${fees}` : `&feeRecipient=${feeCollectorAddress}&feeSellTokenPercentage=0.0015`; const data = await fetch( `https://api.0x.org/tx-relay/v1/swap/quote?buyToken=${tokenTo}&${amountParam}&sellToken=${tokenFrom}&checkApproval=true&slippagePercentage=${ extra.slippage / 100 }&affiliateAddress=${defillamaReferrerAddress}&takerAddress=${ extra.userAddress - }&feeRecipient=${feeCollectorAddress}&feeSellTokenPercentage=0.0015`, + }${feesPathParams}`, { headers: { '0x-api-key': process.env.OX_API_KEY as string, diff --git a/src/components/Aggregator/adapters/1inch.ts b/src/components/Aggregator/adapters/1inch.ts index 5a0ced1a..e447a534 100644 --- a/src/components/Aggregator/adapters/1inch.ts +++ b/src/components/Aggregator/adapters/1inch.ts @@ -58,7 +58,7 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenApprovalAddress = spenders[chain]; //fee in % not bps, min 0 max 3 const fees = extra.feeBps ? Math.min(extra.feeBps / 100, 3) : 0; - const feesPathParams = extra.feeAddress && extra.feeBps ? `&referrer=${extra.feeAddress}&fee=${fees}` : `&referrer=${altReferralAddress}`; + const feesPathParams = extra.feeRecipient && extra.feeBps ? `&referrer=${extra.feeRecipient}&fee=${fees}` : `&referrer=${altReferralAddress}`; const [data, swapData] = await Promise.all([ fetch( `${apiEndpoint}${chainToId[chain]}/quote?src=${tokenFrom}&dst=${tokenTo}&amount=${amount}&fee=${fees}&includeGas=true${feesPathParams}`, diff --git a/src/components/Aggregator/adapters/kyberswap.ts b/src/components/Aggregator/adapters/kyberswap.ts index 03a5e8dc..db0b9223 100644 --- a/src/components/Aggregator/adapters/kyberswap.ts +++ b/src/components/Aggregator/adapters/kyberswap.ts @@ -58,7 +58,7 @@ export async function getQuote(chain: string, from: string, to: string, amount: const tokenFrom = from === zeroAddress ? nativeToken : from; const tokenTo = to === zeroAddress ? nativeToken : to; - const feesPathParams = extra.feeAddress && extra.feeBps ? `&feeReceiver=${extra.feeAddress}&feeAmount=${extra.feeBps}&isInBps=true&chargeFeeBy=currency_in` : ''; + const feesPathParams = extra.feeRecipient && extra.feeBps ? `&feeReceiver=${extra.feeRecipient}&feeAmount=${extra.feeBps}&isInBps=true&chargeFeeBy=currency_in` : ''; const quote = await fetch( `https://aggregator-api.kyberswap.com/${ chainToId[chain] diff --git a/src/components/Aggregator/adapters/paraswap.ts b/src/components/Aggregator/adapters/paraswap.ts index 2fd3e4d5..ecc75a0c 100644 --- a/src/components/Aggregator/adapters/paraswap.ts +++ b/src/components/Aggregator/adapters/paraswap.ts @@ -45,7 +45,7 @@ export async function getQuote( from: string, to: string, amount: string, - { fromToken, toToken, userAddress, slippage, amountOut, feeAddress, feeBps } + { fromToken, toToken, userAddress, slippage, amountOut, feeRecipient, feeBps } ) { // ethereum = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE // amount should include decimals @@ -75,9 +75,9 @@ export async function getQuote( priceRoute: data.priceRoute, isCapSurplus: true, ...(side === 'BUY' ? { destAmount: data.priceRoute.destAmount } : { srcAmount: data.priceRoute.srcAmount }), - ...(feeAddress && feeBps + ...(feeRecipient && feeBps ? { - partnerAdress: feeAddress, + partnerAdress: feeRecipient, partnerFeeBps: feeBps } : {}) diff --git a/src/components/Aggregator/types.ts b/src/components/Aggregator/types.ts index 1609bbc2..e56812f0 100644 --- a/src/components/Aggregator/types.ts +++ b/src/components/Aggregator/types.ts @@ -2,7 +2,7 @@ export interface ExtraData { userAddress: string; slippage: string; amountOut: string; - feeAddress?: string; + feeRecipient?: string; feeBps?: number; referralCode?: string; appData?: string;