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 bd1a4b4d..e447a534 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.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}&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/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/adapters/kyberswap.ts b/src/components/Aggregator/adapters/kyberswap.ts index 363d204d..db0b9223 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.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] - }/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/adapters/odos/index.ts b/src/components/Aggregator/adapters/odos/index.ts index eb6f43ad..2d7a5a94 100644 --- a/src/components/Aggregator/adapters/odos/index.ts +++ b/src/components/Aggregator/adapters/odos/index.ts @@ -65,7 +65,7 @@ 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 diff --git a/src/components/Aggregator/adapters/paraswap.ts b/src/components/Aggregator/adapters/paraswap.ts index 632c17b7..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 } + { fromToken, toToken, userAddress, slippage, amountOut, feeRecipient, 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 }), + ...(feeRecipient && feeBps + ? { + partnerAdress: feeRecipient, + partnerFeeBps: feeBps + } + : {}) }), headers: { 'Content-Type': 'application/json' diff --git a/src/components/Aggregator/types.ts b/src/components/Aggregator/types.ts index f74f657d..e56812f0 100644 --- a/src/components/Aggregator/types.ts +++ b/src/components/Aggregator/types.ts @@ -2,4 +2,8 @@ export interface ExtraData { userAddress: string; slippage: string; amountOut: string; + feeRecipient?: string; + feeBps?: number; + referralCode?: string; + appData?: string; }