@@ -19,6 +19,7 @@ import type { SingleSwap } from "../../types.js";
1919import { addressLikeToString } from "../../utils/addressLikeToString.js" ;
2020import { generateUnwrapAndTransferCall , generateWrapAndTransferCall } from "./callGenerators/weth.js" ;
2121import { getExchangeAllowance , getTotalBalance } from "../../utils/getBalance.js" ;
22+ import { generateFeePaymentCall } from "./callGenerators/feePayment.js" ;
2223
2324export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" ;
2425
@@ -27,6 +28,9 @@ export type GenerateSwapCalldataWithUnitParams = {
2728 minReturnAmount : BigNumberish ;
2829 initiatorAddress : string ;
2930 receiverAddress : string ;
31+ matcher : AddressLike ,
32+ feeToken : AddressLike ,
33+ fee : BigNumberish ;
3034 path : ArrayLike < SingleSwap > ;
3135 unit : Unit ;
3236} ;
@@ -37,6 +41,9 @@ export type GenerateSwapCalldataParams = {
3741 initiatorAddress : string ;
3842 receiverAddress : string ;
3943 path : ArrayLike < SingleSwap > ;
44+ matcher : AddressLike ,
45+ feeToken : AddressLike ,
46+ fee : BigNumberish ;
4047 exchangeContractAddress : AddressLike ;
4148 wethAddress : AddressLike ;
4249 curveRegistryAddress : AddressLike ;
@@ -50,6 +57,9 @@ export async function generateSwapCalldataWithUnit({
5057 initiatorAddress,
5158 receiverAddress,
5259 path : arrayLikePath ,
60+ matcher = ZeroAddress ,
61+ feeToken = ZeroAddress ,
62+ fee = 0 ,
5363 unit,
5464} : GenerateSwapCalldataWithUnitParams ) : Promise < {
5565 calldata : string ;
@@ -69,8 +79,10 @@ export async function generateSwapCalldataWithUnit({
6979 let path = SafeArray . from ( arrayLikePathCopy ) ;
7080
7181 path = SafeArray . from ( arrayLikePathCopy ) . map ( ( swapInfo ) => {
72- swapInfo . assetIn = assetToAddress [ swapInfo . assetIn ] ?? swapInfo . assetIn . toLowerCase ( ) ;
73- swapInfo . assetOut = assetToAddress [ swapInfo . assetOut ] ?? swapInfo . assetOut . toLowerCase ( ) ;
82+ swapInfo . assetIn = assetToAddress [ swapInfo . assetIn ] ?? swapInfo . assetIn
83+ swapInfo . assetOut = assetToAddress [ swapInfo . assetOut ] ?? swapInfo . assetOut
84+ swapInfo . assetIn = swapInfo . assetIn . toLowerCase ( )
85+ swapInfo . assetOut = swapInfo . assetOut . toLowerCase ( )
7486 return swapInfo ;
7587 } ) ;
7688
@@ -80,6 +92,9 @@ export async function generateSwapCalldataWithUnit({
8092 receiverAddress,
8193 initiatorAddress,
8294 path,
95+ matcher,
96+ feeToken,
97+ fee,
8398 exchangeContractAddress,
8499 wethAddress,
85100 curveRegistryAddress,
@@ -94,6 +109,9 @@ export async function generateSwapCalldata({
94109 initiatorAddress,
95110 receiverAddress,
96111 path : arrayLikePath ,
112+ matcher : matcherAddressLike = ZeroAddress ,
113+ feeToken : feeTokenAddressLike = ZeroAddress ,
114+ fee = 0 ,
97115 exchangeContractAddress,
98116 wethAddress : wethAddressLike ,
99117 curveRegistryAddress : curveRegistryAddressLike ,
@@ -107,7 +125,13 @@ export async function generateSwapCalldata({
107125 const wethAddress = await addressLikeToString ( wethAddressLike ) ;
108126 const curveRegistryAddress = await addressLikeToString ( curveRegistryAddressLike ) ;
109127 const swapExecutorContractAddress = await addressLikeToString ( swapExecutorContractAddressLike ) ;
110- let path = SafeArray . from ( arrayLikePath ) ;
128+ const feeToken = await addressLikeToString ( feeTokenAddressLike ) ;
129+ const matcher = await addressLikeToString ( matcherAddressLike ) ;
130+ let path = SafeArray . from ( arrayLikePath ) . map ( ( swapInfo ) => {
131+ swapInfo . assetIn = swapInfo . assetIn . toLowerCase ( )
132+ swapInfo . assetOut = swapInfo . assetOut . toLowerCase ( )
133+ return swapInfo ;
134+ } ) ;
111135
112136 const { assetIn : srcToken } = path . first ( ) ;
113137 const { assetOut : dstToken } = path . last ( ) ;
@@ -122,6 +146,7 @@ export async function generateSwapCalldata({
122146 flags : 0 ,
123147 } ;
124148 const amountNativeDecimals = await exchangeToNativeDecimals ( srcToken , amount , provider ) ;
149+ const feeNativeDecimals = await exchangeToNativeDecimals ( feeToken , fee , provider )
125150
126151 path = SafeArray . from ( arrayLikePath ) . map ( ( singleSwap ) => {
127152 if ( singleSwap . assetIn == ethers . ZeroAddress ) singleSwap . assetIn = wethAddress ;
@@ -134,6 +159,9 @@ export async function generateSwapCalldata({
134159 swapDescription ,
135160 path ,
136161 amountNativeDecimals ,
162+ matcher ,
163+ feeToken ,
164+ feeNativeDecimals ,
137165 wethAddress ,
138166 swapExecutorContractAddress ,
139167 curveRegistryAddress ,
@@ -159,6 +187,9 @@ async function processSwaps(
159187 swapDescription : LibValidator . SwapDescriptionStruct ,
160188 path : SafeArray < SingleSwap > ,
161189 amount : BigNumberish ,
190+ matcher : string ,
191+ feeToken : string ,
192+ fee : BigNumberish ,
162193 wethAddress : string ,
163194 swapExecutorContractAddress : string ,
164195 curveRegistryAddress : string ,
@@ -187,13 +218,17 @@ async function processSwaps(
187218 provider
188219 ) ) ;
189220 }
190- ( { swapDescription, calls } = await wrapOrUnwrapIfNeeded (
221+
222+ ( { swapDescription, calls} = await payFeeToMatcher ( matcher , feeToken , fee , calls , swapDescription ) ) ;
223+
224+ ( { swapDescription, calls } = wrapOrUnwrapIfNeeded (
191225 amount ,
192226 swapDescription ,
193227 calls ,
194228 swapExecutorContractAddress ,
195229 wethAddress
196230 ) ) ;
231+
197232 return { swapDescription, calls } ;
198233}
199234
@@ -259,16 +294,16 @@ async function processMultiFactorySwaps(
259294 for ( const swap of path ) {
260295 switch ( swap . factory ) {
261296 case "OrionV2" : {
262- let transferCall = await generateTransferCall ( swap . assetIn , swap . pool , 0 ) ;
297+ let transferCall = generateTransferCall ( swap . assetIn , swap . pool , 0 ) ;
263298 transferCall = pathCallWithBalance ( transferCall , swap . assetIn ) ;
264- const uni2Call = await generateUni2Call ( swap . pool , swap . assetIn , swap . assetOut , swapExecutorContractAddress ) ;
299+ const uni2Call = generateUni2Call ( swap . pool , swap . assetIn , swap . assetOut , swapExecutorContractAddress ) ;
265300 calls . push ( transferCall , uni2Call ) ;
266301 break ;
267302 }
268303 case "UniswapV2" : {
269- let transferCall = await generateTransferCall ( swap . assetIn , swap . pool , 0 ) ;
304+ let transferCall = generateTransferCall ( swap . assetIn , swap . pool , 0 ) ;
270305 transferCall = pathCallWithBalance ( transferCall , swap . assetIn ) ;
271- const uni2Call = await generateUni2Call ( swap . pool , swap . assetIn , swap . assetOut , swapExecutorContractAddress ) ;
306+ const uni2Call = generateUni2Call ( swap . pool , swap . assetIn , swap . assetOut , swapExecutorContractAddress ) ;
272307 calls . push ( transferCall , uni2Call ) ;
273308 break ;
274309 }
@@ -305,25 +340,44 @@ async function processMultiFactorySwaps(
305340 return { swapDescription, calls } ;
306341}
307342
308- async function wrapOrUnwrapIfNeeded (
343+ async function payFeeToMatcher (
344+ matcher : string ,
345+ feeToken : string ,
346+ feeAmount : BigNumberish ,
347+ calls : BytesLike [ ] ,
348+ swapDescription : LibValidator . SwapDescriptionStruct ,
349+ ) {
350+ console . log ( matcher )
351+ console . log ( feeAmount )
352+ console . log ( feeToken )
353+ console . log ( swapDescription . dstToken )
354+ if ( BigInt ( feeAmount ) !== 0n && feeToken === swapDescription . dstToken ) {
355+ const feePaymentCall = generateFeePaymentCall ( matcher , feeToken , feeAmount )
356+ calls . push ( feePaymentCall )
357+ }
358+ return { swapDescription, calls}
359+ }
360+
361+ function wrapOrUnwrapIfNeeded (
309362 amount : BigNumberish ,
310363 swapDescription : LibValidator . SwapDescriptionStruct ,
311364 calls : BytesLike [ ] ,
312365 swapExecutorContractAddress : string ,
313366 wethAddress : string
314367) {
315- if ( swapDescription . srcToken === ZeroAddress ) {
316- const wrapCall = generateWrapAndTransferCall ( swapDescription . srcReceiver , { value : amount } ) ;
368+ const { dstReceiver, srcReceiver, srcToken, dstToken} = swapDescription ;
369+ if ( srcToken === ZeroAddress ) {
370+ const wrapCall = generateWrapAndTransferCall ( srcReceiver , { value : amount } ) ;
317371 swapDescription . srcReceiver = swapExecutorContractAddress ;
318372 calls = ( [ wrapCall ] as BytesLike [ ] ) . concat ( calls ) ;
319373 }
320- if ( swapDescription . dstToken === ZeroAddress ) {
321- let unwrapCall = generateUnwrapAndTransferCall ( swapDescription . dstReceiver , 0 ) ;
374+ if ( dstToken === ZeroAddress ) {
375+ let unwrapCall = generateUnwrapAndTransferCall ( dstReceiver , 0 ) ;
322376 unwrapCall = pathCallWithBalance ( unwrapCall , wethAddress ) ;
323377 calls . push ( unwrapCall ) ;
324378 } else {
325- let transferCall = await generateTransferCall ( swapDescription . dstToken , swapDescription . dstReceiver , 0 ) ;
326- transferCall = pathCallWithBalance ( transferCall , swapDescription . dstToken ) ;
379+ let transferCall = generateTransferCall ( dstToken , dstReceiver , 0 ) ;
380+ transferCall = pathCallWithBalance ( transferCall , dstToken ) ;
327381 calls . push ( transferCall ) ;
328382 }
329383 return { swapDescription, calls } ;
0 commit comments