@@ -17,19 +17,20 @@ import {
1717 CollateralOrderData ,
1818 CollateralParameters ,
1919 CollateralPermitData ,
20+ CollateralSwapOrder ,
2021 CollateralSwapParams ,
2122 CollateralSwapPostParams ,
2223 CollateralSwapQuoteParams ,
23- CollateralSwapOrder ,
2424 CollateralSwapTradeParams ,
2525 EncodedOrder ,
2626 FlashLoanHint ,
2727 FlashLoanHookAmounts ,
2828} from './types'
2929import {
3030 AAVE_ADAPTER_FACTORY ,
31- AAVE_COLLATERAL_SWAP_ADAPTER_HOOK ,
31+ AAVE_HOOK_ADAPTER_PER_TYPE ,
3232 AAVE_POOL_ADDRESS ,
33+ AaveFlashLoanType ,
3334 ADAPTER_DOMAIN_NAME ,
3435 ADAPTER_DOMAIN_VERSION ,
3536 ADAPTER_SIGNATURE_TYPES ,
@@ -42,6 +43,8 @@ import {
4243import { aaveAdapterFactoryAbi } from './abi/AaveAdapterFactory'
4344import { collateralSwapAdapterHookAbi } from './abi/CollateralSwapAdapterHook'
4445import { SupportedChainId } from '@cowprotocol/sdk-config'
46+ import { debtSwapAdapterAbi } from './abi/DebtSwapAdapter'
47+ import { repayWithCollateralAdapterAbi } from './abi/RepayWithCollateralAdapter'
4548
4649/**
4750 * SDK for executing Aave flash loan operations, particularly collateral swaps.
@@ -86,12 +89,16 @@ export class AaveCollateralSwapSdk {
8689
8790 const { quoteResults, postSwapOrderFromQuote } = quoteAndPost
8891
89- const { swapSettings, instanceAddress } = await this . getOrderPostingSettings ( quoteParams , {
90- sellAmount,
91- buyAmount : quoteResults . amountsAndCosts . afterSlippage . buyAmount ,
92- orderToSign : quoteResults . orderToSign ,
93- collateralPermit : settings ?. collateralPermit ,
94- } )
92+ const { swapSettings, instanceAddress } = await this . getOrderPostingSettings (
93+ AaveFlashLoanType . CollateralSwap ,
94+ quoteParams ,
95+ {
96+ sellAmount,
97+ buyAmount : quoteResults . amountsAndCosts . afterSlippage . buyAmount ,
98+ orderToSign : quoteResults . orderToSign ,
99+ collateralPermit : settings ?. collateralPermit ,
100+ } ,
101+ )
95102
96103 const collateralParams : CollateralParameters = {
97104 instanceAddress,
@@ -178,6 +185,7 @@ export class AaveCollateralSwapSdk {
178185 * ```
179186 */
180187 async getOrderPostingSettings (
188+ flashLoanType : AaveFlashLoanType ,
181189 params : CollateralSwapTradeParams ,
182190 settings : CollateralSwapOrder ,
183191 ) : Promise < CollateralSwapPostParams > {
@@ -199,7 +207,13 @@ export class AaveCollateralSwapSdk {
199207 buyAssetAmount : buyAmount . toString ( ) ,
200208 }
201209
202- const instanceAddress = await this . getExpectedInstanceAddress ( chainId , trader , hookAmounts , encodedOrder )
210+ const instanceAddress = await this . getExpectedInstanceAddress (
211+ flashLoanType ,
212+ chainId ,
213+ trader ,
214+ hookAmounts ,
215+ encodedOrder ,
216+ )
203217
204218 const flashLoanHint : FlashLoanHint = {
205219 amount, // this is actually in UNDERLYING but aave tokens are 1:1
@@ -210,6 +224,7 @@ export class AaveCollateralSwapSdk {
210224 }
211225
212226 const hooks = await this . getOrderHooks (
227+ flashLoanType ,
213228 chainId ,
214229 trader ,
215230 instanceAddress ,
@@ -322,6 +337,7 @@ export class AaveCollateralSwapSdk {
322337 }
323338
324339 async getExpectedInstanceAddress (
340+ flashLoanType : AaveFlashLoanType ,
325341 chainId : SupportedChainId ,
326342 trader : AccountAddress ,
327343 hookAmounts : FlashLoanHookAmounts ,
@@ -331,7 +347,7 @@ export class AaveCollateralSwapSdk {
331347
332348 return ( await getGlobalAdapter ( ) . readContract ( {
333349 address : AAVE_ADAPTER_FACTORY [ chainId ] ,
334- args : [ AAVE_COLLATERAL_SWAP_ADAPTER_HOOK [ chainId ] , hookData ] ,
350+ args : [ AAVE_HOOK_ADAPTER_PER_TYPE [ flashLoanType ] [ chainId ] , hookData ] ,
335351 functionName : 'getInstanceDeterministicAddress' ,
336352 abi : aaveAdapterFactoryAbi ,
337353 } ) ) as AccountAddress
@@ -363,14 +379,15 @@ export class AaveCollateralSwapSdk {
363379 }
364380
365381 private getPreHookCallData (
382+ flashLoanType : AaveFlashLoanType ,
366383 chainId : SupportedChainId ,
367384 trader : AccountAddress ,
368385 hookAmounts : FlashLoanHookAmounts ,
369386 order : EncodedOrder ,
370387 instanceAddress : AccountAddress ,
371388 ) : string {
372389 const hookData = this . buildHookOrderData ( trader , hookAmounts , order )
373- const adapterImplementation = AAVE_COLLATERAL_SWAP_ADAPTER_HOOK [ chainId ]
390+ const adapterImplementation = AAVE_HOOK_ADAPTER_PER_TYPE [ flashLoanType ] [ chainId ]
374391
375392 return getGlobalAdapter ( ) . utils . encodeFunction ( aaveAdapterFactoryAbi , 'deployAndTransferFlashLoan' , [
376393 adapterImplementation ,
@@ -402,22 +419,52 @@ export class AaveCollateralSwapSdk {
402419 }
403420 }
404421
405- private getPostHookCallData ( collateralPermit : CollateralPermitData = EMPTY_PERMIT ) : string {
422+ private getFlashLoanPostHook ( flashLoanType : AaveFlashLoanType , collateralPermit ?: CollateralPermitData ) : string {
423+ if ( flashLoanType === AaveFlashLoanType . DebtSwap ) {
424+ return this . getDebtSwapPostHookCallData ( collateralPermit )
425+ }
426+
427+ if ( flashLoanType === AaveFlashLoanType . RepayCollateral ) {
428+ return this . getRepayPostHookCallData ( collateralPermit )
429+ }
430+
431+ return this . getCollateralSwapPostHookCallData ( collateralPermit )
432+ }
433+
434+ private getCollateralSwapPostHookCallData ( collateralPermit : CollateralPermitData = EMPTY_PERMIT ) : string {
406435 return getGlobalAdapter ( ) . utils . encodeFunction ( collateralSwapAdapterHookAbi , 'collateralSwapWithFlashLoan' , [
407436 collateralPermit ,
408437 ] )
409438 }
410439
440+ private getDebtSwapPostHookCallData ( collateralPermit : CollateralPermitData = EMPTY_PERMIT ) : string {
441+ return getGlobalAdapter ( ) . utils . encodeFunction ( debtSwapAdapterAbi , 'debtSwapWithFlashLoan' , [ collateralPermit ] )
442+ }
443+
444+ private getRepayPostHookCallData ( collateralPermit : CollateralPermitData = EMPTY_PERMIT ) : string {
445+ return getGlobalAdapter ( ) . utils . encodeFunction ( repayWithCollateralAdapterAbi , 'repayDebtWithFlashLoan' , [
446+ collateralPermit ,
447+ ] )
448+ }
449+
411450 private async getOrderHooks (
451+ flashLoanType : AaveFlashLoanType ,
412452 chainId : SupportedChainId ,
413453 trader : AccountAddress ,
414454 expectedInstanceAddress : AccountAddress ,
415455 hookAmounts : FlashLoanHookAmounts ,
416456 order : EncodedOrder ,
417457 collateralPermit ?: CollateralPermitData ,
418458 ) : Promise < LatestAppDataDocVersion [ 'metadata' ] [ 'hooks' ] > {
419- const preHookCallData = this . getPreHookCallData ( chainId , trader , hookAmounts , order , expectedInstanceAddress )
420- const postHookCallData = this . getPostHookCallData ( collateralPermit )
459+ const preHookCallData = this . getPreHookCallData (
460+ flashLoanType ,
461+ chainId ,
462+ trader ,
463+ hookAmounts ,
464+ order ,
465+ expectedInstanceAddress ,
466+ )
467+ const postHookCallData = this . getFlashLoanPostHook ( flashLoanType , collateralPermit )
421468
422469 return {
423470 pre : [
0 commit comments