@cowprotocol/sdk-flash-loans 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -84,6 +84,32 @@ interface CollateralPermitData {
84
84
  s: string;
85
85
  }
86
86
 
87
+ declare const HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000";
88
+ declare enum AaveFlashLoanType {
89
+ CollateralSwap = "CollateralSwap",
90
+ DebtSwap = "DebtSwap",
91
+ RepayCollateral = "RepayCollateral"
92
+ }
93
+ declare const AAVE_POOL_ADDRESS: Record<SupportedChainId, string>;
94
+ declare const AAVE_ADAPTER_FACTORY: Record<SupportedChainId, string>;
95
+ declare const AAVE_HOOK_ADAPTER_PER_TYPE: Record<AaveFlashLoanType, Record<SupportedChainId, string>>;
96
+ declare const DEFAULT_HOOK_GAS_LIMIT: {
97
+ pre: bigint;
98
+ post: bigint;
99
+ };
100
+ declare const PERCENT_SCALE = 10000;
101
+ declare const DEFAULT_VALIDITY: number;
102
+ declare const GAS_ESTIMATION_ADDITION_PERCENT = 10;
103
+ declare const ADAPTER_DOMAIN_NAME = "AaveAdapterFactory";
104
+ declare const ADAPTER_DOMAIN_VERSION = "1";
105
+ declare const ADAPTER_SIGNATURE_TYPES: {
106
+ AdapterOrderSig: {
107
+ name: string;
108
+ type: string;
109
+ }[];
110
+ };
111
+ declare const EMPTY_PERMIT: CollateralPermitData;
112
+
87
113
  /**
88
114
  * SDK for executing Aave flash loan operations, particularly collateral swaps.
89
115
  *
@@ -157,7 +183,7 @@ declare class AaveCollateralSwapSdk {
157
183
  * @throws Will throw if contract address calculation fails or gas estimation fails.
158
184
  * ```
159
185
  */
160
- getOrderPostingSettings(params: CollateralSwapTradeParams, settings: CollateralSwapOrder): Promise<CollateralSwapPostParams>;
186
+ getOrderPostingSettings(flashLoanType: AaveFlashLoanType, params: CollateralSwapTradeParams, settings: CollateralSwapOrder): Promise<CollateralSwapPostParams>;
161
187
  /**
162
188
  * Checks the current allowance for the flash loan adapter to spend collateral tokens.
163
189
  *
@@ -209,7 +235,7 @@ declare class AaveCollateralSwapSdk {
209
235
  * ```
210
236
  */
211
237
  approveCollateral(params: CollateralParameters): Promise<TransactionResponse>;
212
- getExpectedInstanceAddress(chainId: SupportedChainId, trader: AccountAddress, hookAmounts: FlashLoanHookAmounts, order: EncodedOrder): Promise<AccountAddress>;
238
+ getExpectedInstanceAddress(flashLoanType: AaveFlashLoanType, chainId: SupportedChainId, trader: AccountAddress, hookAmounts: FlashLoanHookAmounts, order: EncodedOrder): Promise<AccountAddress>;
213
239
  private approveCollateralIfNeeded;
214
240
  calculateFlashLoanAmounts({ sellAmount, flashLoanFeePercent }: {
215
241
  sellAmount: bigint;
@@ -220,50 +246,12 @@ declare class AaveCollateralSwapSdk {
220
246
  };
221
247
  private getPreHookCallData;
222
248
  private buildHookOrderData;
223
- private getPostHookCallData;
249
+ private getFlashLoanPostHook;
250
+ private getCollateralSwapPostHookCallData;
251
+ private getDebtSwapPostHookCallData;
252
+ private getRepayPostHookCallData;
224
253
  private getOrderHooks;
225
254
  private adapterEIP1271Signature;
226
255
  }
227
256
 
228
- declare const HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000";
229
- declare const AAVE_POOL_ADDRESS: Record<SupportedChainId, string>;
230
- declare const AAVE_ADAPTER_FACTORY: {
231
- 100: string;
232
- 1: string;
233
- 56: string;
234
- 137: string;
235
- 232: string;
236
- 8453: string;
237
- 42161: string;
238
- 43114: string;
239
- 11155111: string;
240
- };
241
- declare const AAVE_COLLATERAL_SWAP_ADAPTER_HOOK: {
242
- 100: string;
243
- 1: string;
244
- 56: string;
245
- 137: string;
246
- 232: string;
247
- 8453: string;
248
- 42161: string;
249
- 43114: string;
250
- 11155111: string;
251
- };
252
- declare const DEFAULT_HOOK_GAS_LIMIT: {
253
- pre: bigint;
254
- post: bigint;
255
- };
256
- declare const PERCENT_SCALE = 10000;
257
- declare const DEFAULT_VALIDITY: number;
258
- declare const GAS_ESTIMATION_ADDITION_PERCENT = 10;
259
- declare const ADAPTER_DOMAIN_NAME = "AaveAdapterFactory";
260
- declare const ADAPTER_DOMAIN_VERSION = "1";
261
- declare const ADAPTER_SIGNATURE_TYPES: {
262
- AdapterOrderSig: {
263
- name: string;
264
- type: string;
265
- }[];
266
- };
267
- declare const EMPTY_PERMIT: CollateralPermitData;
268
-
269
- export { AAVE_ADAPTER_FACTORY, AAVE_COLLATERAL_SWAP_ADAPTER_HOOK, AAVE_POOL_ADDRESS, ADAPTER_DOMAIN_NAME, ADAPTER_DOMAIN_VERSION, ADAPTER_SIGNATURE_TYPES, AaveCollateralSwapSdk, type CollateralOrderData, type CollateralParameters, type CollateralPermitData, type CollateralSwapOrder, type CollateralSwapParams, type CollateralSwapPostParams, type CollateralSwapQuoteParams, type CollateralSwapTradeParams, DEFAULT_HOOK_GAS_LIMIT, DEFAULT_VALIDITY, EMPTY_PERMIT, type EncodedOrder, type FlashLoanHint, type FlashLoanHookAmounts, GAS_ESTIMATION_ADDITION_PERCENT, HASH_ZERO, PERCENT_SCALE };
257
+ export { AAVE_ADAPTER_FACTORY, AAVE_HOOK_ADAPTER_PER_TYPE, AAVE_POOL_ADDRESS, ADAPTER_DOMAIN_NAME, ADAPTER_DOMAIN_VERSION, ADAPTER_SIGNATURE_TYPES, AaveCollateralSwapSdk, AaveFlashLoanType, type CollateralOrderData, type CollateralParameters, type CollateralPermitData, type CollateralSwapOrder, type CollateralSwapParams, type CollateralSwapPostParams, type CollateralSwapQuoteParams, type CollateralSwapTradeParams, DEFAULT_HOOK_GAS_LIMIT, DEFAULT_VALIDITY, EMPTY_PERMIT, type EncodedOrder, type FlashLoanHint, type FlashLoanHookAmounts, GAS_ESTIMATION_ADDITION_PERCENT, HASH_ZERO, PERCENT_SCALE };
package/dist/index.d.ts CHANGED
@@ -84,6 +84,32 @@ interface CollateralPermitData {
84
84
  s: string;
85
85
  }
86
86
 
87
+ declare const HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000";
88
+ declare enum AaveFlashLoanType {
89
+ CollateralSwap = "CollateralSwap",
90
+ DebtSwap = "DebtSwap",
91
+ RepayCollateral = "RepayCollateral"
92
+ }
93
+ declare const AAVE_POOL_ADDRESS: Record<SupportedChainId, string>;
94
+ declare const AAVE_ADAPTER_FACTORY: Record<SupportedChainId, string>;
95
+ declare const AAVE_HOOK_ADAPTER_PER_TYPE: Record<AaveFlashLoanType, Record<SupportedChainId, string>>;
96
+ declare const DEFAULT_HOOK_GAS_LIMIT: {
97
+ pre: bigint;
98
+ post: bigint;
99
+ };
100
+ declare const PERCENT_SCALE = 10000;
101
+ declare const DEFAULT_VALIDITY: number;
102
+ declare const GAS_ESTIMATION_ADDITION_PERCENT = 10;
103
+ declare const ADAPTER_DOMAIN_NAME = "AaveAdapterFactory";
104
+ declare const ADAPTER_DOMAIN_VERSION = "1";
105
+ declare const ADAPTER_SIGNATURE_TYPES: {
106
+ AdapterOrderSig: {
107
+ name: string;
108
+ type: string;
109
+ }[];
110
+ };
111
+ declare const EMPTY_PERMIT: CollateralPermitData;
112
+
87
113
  /**
88
114
  * SDK for executing Aave flash loan operations, particularly collateral swaps.
89
115
  *
@@ -157,7 +183,7 @@ declare class AaveCollateralSwapSdk {
157
183
  * @throws Will throw if contract address calculation fails or gas estimation fails.
158
184
  * ```
159
185
  */
160
- getOrderPostingSettings(params: CollateralSwapTradeParams, settings: CollateralSwapOrder): Promise<CollateralSwapPostParams>;
186
+ getOrderPostingSettings(flashLoanType: AaveFlashLoanType, params: CollateralSwapTradeParams, settings: CollateralSwapOrder): Promise<CollateralSwapPostParams>;
161
187
  /**
162
188
  * Checks the current allowance for the flash loan adapter to spend collateral tokens.
163
189
  *
@@ -209,7 +235,7 @@ declare class AaveCollateralSwapSdk {
209
235
  * ```
210
236
  */
211
237
  approveCollateral(params: CollateralParameters): Promise<TransactionResponse>;
212
- getExpectedInstanceAddress(chainId: SupportedChainId, trader: AccountAddress, hookAmounts: FlashLoanHookAmounts, order: EncodedOrder): Promise<AccountAddress>;
238
+ getExpectedInstanceAddress(flashLoanType: AaveFlashLoanType, chainId: SupportedChainId, trader: AccountAddress, hookAmounts: FlashLoanHookAmounts, order: EncodedOrder): Promise<AccountAddress>;
213
239
  private approveCollateralIfNeeded;
214
240
  calculateFlashLoanAmounts({ sellAmount, flashLoanFeePercent }: {
215
241
  sellAmount: bigint;
@@ -220,50 +246,12 @@ declare class AaveCollateralSwapSdk {
220
246
  };
221
247
  private getPreHookCallData;
222
248
  private buildHookOrderData;
223
- private getPostHookCallData;
249
+ private getFlashLoanPostHook;
250
+ private getCollateralSwapPostHookCallData;
251
+ private getDebtSwapPostHookCallData;
252
+ private getRepayPostHookCallData;
224
253
  private getOrderHooks;
225
254
  private adapterEIP1271Signature;
226
255
  }
227
256
 
228
- declare const HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000";
229
- declare const AAVE_POOL_ADDRESS: Record<SupportedChainId, string>;
230
- declare const AAVE_ADAPTER_FACTORY: {
231
- 100: string;
232
- 1: string;
233
- 56: string;
234
- 137: string;
235
- 232: string;
236
- 8453: string;
237
- 42161: string;
238
- 43114: string;
239
- 11155111: string;
240
- };
241
- declare const AAVE_COLLATERAL_SWAP_ADAPTER_HOOK: {
242
- 100: string;
243
- 1: string;
244
- 56: string;
245
- 137: string;
246
- 232: string;
247
- 8453: string;
248
- 42161: string;
249
- 43114: string;
250
- 11155111: string;
251
- };
252
- declare const DEFAULT_HOOK_GAS_LIMIT: {
253
- pre: bigint;
254
- post: bigint;
255
- };
256
- declare const PERCENT_SCALE = 10000;
257
- declare const DEFAULT_VALIDITY: number;
258
- declare const GAS_ESTIMATION_ADDITION_PERCENT = 10;
259
- declare const ADAPTER_DOMAIN_NAME = "AaveAdapterFactory";
260
- declare const ADAPTER_DOMAIN_VERSION = "1";
261
- declare const ADAPTER_SIGNATURE_TYPES: {
262
- AdapterOrderSig: {
263
- name: string;
264
- type: string;
265
- }[];
266
- };
267
- declare const EMPTY_PERMIT: CollateralPermitData;
268
-
269
- export { AAVE_ADAPTER_FACTORY, AAVE_COLLATERAL_SWAP_ADAPTER_HOOK, AAVE_POOL_ADDRESS, ADAPTER_DOMAIN_NAME, ADAPTER_DOMAIN_VERSION, ADAPTER_SIGNATURE_TYPES, AaveCollateralSwapSdk, type CollateralOrderData, type CollateralParameters, type CollateralPermitData, type CollateralSwapOrder, type CollateralSwapParams, type CollateralSwapPostParams, type CollateralSwapQuoteParams, type CollateralSwapTradeParams, DEFAULT_HOOK_GAS_LIMIT, DEFAULT_VALIDITY, EMPTY_PERMIT, type EncodedOrder, type FlashLoanHint, type FlashLoanHookAmounts, GAS_ESTIMATION_ADDITION_PERCENT, HASH_ZERO, PERCENT_SCALE };
257
+ export { AAVE_ADAPTER_FACTORY, AAVE_HOOK_ADAPTER_PER_TYPE, AAVE_POOL_ADDRESS, ADAPTER_DOMAIN_NAME, ADAPTER_DOMAIN_VERSION, ADAPTER_SIGNATURE_TYPES, AaveCollateralSwapSdk, AaveFlashLoanType, type CollateralOrderData, type CollateralParameters, type CollateralPermitData, type CollateralSwapOrder, type CollateralSwapParams, type CollateralSwapPostParams, type CollateralSwapQuoteParams, type CollateralSwapTradeParams, DEFAULT_HOOK_GAS_LIMIT, DEFAULT_VALIDITY, EMPTY_PERMIT, type EncodedOrder, type FlashLoanHint, type FlashLoanHookAmounts, GAS_ESTIMATION_ADDITION_PERCENT, HASH_ZERO, PERCENT_SCALE };
package/dist/index.js CHANGED
@@ -21,12 +21,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  AAVE_ADAPTER_FACTORY: () => AAVE_ADAPTER_FACTORY,
24
- AAVE_COLLATERAL_SWAP_ADAPTER_HOOK: () => AAVE_COLLATERAL_SWAP_ADAPTER_HOOK,
24
+ AAVE_HOOK_ADAPTER_PER_TYPE: () => AAVE_HOOK_ADAPTER_PER_TYPE,
25
25
  AAVE_POOL_ADDRESS: () => AAVE_POOL_ADDRESS,
26
26
  ADAPTER_DOMAIN_NAME: () => ADAPTER_DOMAIN_NAME,
27
27
  ADAPTER_DOMAIN_VERSION: () => ADAPTER_DOMAIN_VERSION,
28
28
  ADAPTER_SIGNATURE_TYPES: () => ADAPTER_SIGNATURE_TYPES,
29
29
  AaveCollateralSwapSdk: () => AaveCollateralSwapSdk,
30
+ AaveFlashLoanType: () => AaveFlashLoanType,
30
31
  DEFAULT_HOOK_GAS_LIMIT: () => DEFAULT_HOOK_GAS_LIMIT,
31
32
  DEFAULT_VALIDITY: () => DEFAULT_VALIDITY,
32
33
  EMPTY_PERMIT: () => EMPTY_PERMIT,
@@ -44,14 +45,21 @@ var import_sdk_order_book = require("@cowprotocol/sdk-order-book");
44
45
  // src/aave/const.ts
45
46
  var import_sdk_config = require("@cowprotocol/sdk-config");
46
47
  var HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000";
48
+ var AaveFlashLoanType = /* @__PURE__ */ ((AaveFlashLoanType2) => {
49
+ AaveFlashLoanType2["CollateralSwap"] = "CollateralSwap";
50
+ AaveFlashLoanType2["DebtSwap"] = "DebtSwap";
51
+ AaveFlashLoanType2["RepayCollateral"] = "RepayCollateral";
52
+ return AaveFlashLoanType2;
53
+ })(AaveFlashLoanType || {});
47
54
  var AAVE_POOL_ADDRESS = (0, import_sdk_config.mapAddressToSupportedNetworks)("0xb50201558B00496A145fE76f7424749556E326D8");
48
- var AAVE_ADAPTER_FACTORY = {
49
- ...(0, import_sdk_config.mapAddressToSupportedNetworks)("0x1186B5ad42E3e6d6c6901FC53b4A367540E6EcFE"),
50
- [import_sdk_config.SupportedChainId.GNOSIS_CHAIN]: "0x889ee28C0a8a41a312546A8eeD77b4b097C84016"
51
- };
52
- var AAVE_COLLATERAL_SWAP_ADAPTER_HOOK = {
53
- ...(0, import_sdk_config.mapAddressToSupportedNetworks)("0xe80eE1e73f120b1106179Ae3D582CA4Fd768d517"),
54
- [import_sdk_config.SupportedChainId.GNOSIS_CHAIN]: "0x0aeC794e544B81D96149a4C8C1cC57c6F31A978A"
55
+ var AAVE_ADAPTER_FACTORY = (0, import_sdk_config.mapAddressToSupportedNetworks)("0x889ee28C0a8a41a312546A8eeD77b4b097C84016");
56
+ var AAVE_COLLATERAL_SWAP_ADAPTER_HOOK = (0, import_sdk_config.mapAddressToSupportedNetworks)("0x0aeC794e544B81D96149a4C8C1cC57c6F31A978A");
57
+ var AAVE_DEBT_SWAP_ADAPTER_HOOK = (0, import_sdk_config.mapAddressToSupportedNetworks)("0x2d13ADCFa398073d7406e5e1aF3dD14663cdBF30");
58
+ var AAVE_REPAY_COLLATERAL_ADAPTER_HOOK = (0, import_sdk_config.mapAddressToSupportedNetworks)("0x193fd444802D6BC18a9AE0613D33C024F16A9dDC");
59
+ var AAVE_HOOK_ADAPTER_PER_TYPE = {
60
+ ["CollateralSwap" /* CollateralSwap */]: AAVE_COLLATERAL_SWAP_ADAPTER_HOOK,
61
+ ["DebtSwap" /* DebtSwap */]: AAVE_DEBT_SWAP_ADAPTER_HOOK,
62
+ ["RepayCollateral" /* RepayCollateral */]: AAVE_REPAY_COLLATERAL_ADAPTER_HOOK
55
63
  };
56
64
  var DEFAULT_HOOK_GAS_LIMIT = {
57
65
  pre: 300000n,
@@ -309,6 +317,94 @@ var collateralSwapAdapterHookAbi = [
309
317
  }
310
318
  ];
311
319
 
320
+ // src/aave/abi/DebtSwapAdapter.ts
321
+ var debtSwapAdapterAbi = [
322
+ {
323
+ type: "function",
324
+ name: "debtSwapWithFlashLoan",
325
+ inputs: [
326
+ {
327
+ name: "creditDelegationSig",
328
+ type: "tuple",
329
+ internalType: "struct DataTypes.CreditDelegationSig",
330
+ components: [
331
+ {
332
+ name: "amount",
333
+ type: "uint256",
334
+ internalType: "uint256"
335
+ },
336
+ {
337
+ name: "deadline",
338
+ type: "uint256",
339
+ internalType: "uint256"
340
+ },
341
+ {
342
+ name: "v",
343
+ type: "uint8",
344
+ internalType: "uint8"
345
+ },
346
+ {
347
+ name: "r",
348
+ type: "bytes32",
349
+ internalType: "bytes32"
350
+ },
351
+ {
352
+ name: "s",
353
+ type: "bytes32",
354
+ internalType: "bytes32"
355
+ }
356
+ ]
357
+ }
358
+ ],
359
+ outputs: [],
360
+ stateMutability: "nonpayable"
361
+ }
362
+ ];
363
+
364
+ // src/aave/abi/RepayWithCollateralAdapter.ts
365
+ var repayWithCollateralAdapterAbi = [
366
+ {
367
+ type: "function",
368
+ name: "repayDebtWithFlashLoan",
369
+ inputs: [
370
+ {
371
+ name: "erc20Permit",
372
+ type: "tuple",
373
+ internalType: "struct DataTypes.Permit",
374
+ components: [
375
+ {
376
+ name: "amount",
377
+ type: "uint256",
378
+ internalType: "uint256"
379
+ },
380
+ {
381
+ name: "deadline",
382
+ type: "uint256",
383
+ internalType: "uint256"
384
+ },
385
+ {
386
+ name: "v",
387
+ type: "uint8",
388
+ internalType: "uint8"
389
+ },
390
+ {
391
+ name: "r",
392
+ type: "bytes32",
393
+ internalType: "bytes32"
394
+ },
395
+ {
396
+ name: "s",
397
+ type: "bytes32",
398
+ internalType: "bytes32"
399
+ }
400
+ ]
401
+ }
402
+ ],
403
+ outputs: [],
404
+ stateMutability: "nonpayable"
405
+ }
406
+ ];
407
+
312
408
  // src/aave/AaveCollateralSwapSdk.ts
313
409
  var AaveCollateralSwapSdk = class {
314
410
  /**
@@ -340,12 +436,16 @@ var AaveCollateralSwapSdk = class {
340
436
  const sellAmount = BigInt(amount);
341
437
  const quoteAndPost = await tradingSdk.getQuote(quoteParams);
342
438
  const { quoteResults, postSwapOrderFromQuote } = quoteAndPost;
343
- const { swapSettings, instanceAddress } = await this.getOrderPostingSettings(quoteParams, {
344
- sellAmount,
345
- buyAmount: quoteResults.amountsAndCosts.afterSlippage.buyAmount,
346
- orderToSign: quoteResults.orderToSign,
347
- collateralPermit: settings?.collateralPermit
348
- });
439
+ const { swapSettings, instanceAddress } = await this.getOrderPostingSettings(
440
+ "CollateralSwap" /* CollateralSwap */,
441
+ quoteParams,
442
+ {
443
+ sellAmount,
444
+ buyAmount: quoteResults.amountsAndCosts.afterSlippage.buyAmount,
445
+ orderToSign: quoteResults.orderToSign,
446
+ collateralPermit: settings?.collateralPermit
447
+ }
448
+ );
349
449
  const collateralParams = {
350
450
  instanceAddress,
351
451
  trader: quoteParams.owner,
@@ -419,7 +519,7 @@ var AaveCollateralSwapSdk = class {
419
519
  * @throws Will throw if contract address calculation fails or gas estimation fails.
420
520
  * ```
421
521
  */
422
- async getOrderPostingSettings(params, settings) {
522
+ async getOrderPostingSettings(flashLoanType, params, settings) {
423
523
  const { sellAmount, buyAmount, orderToSign, collateralPermit } = settings;
424
524
  const { chainId, flashLoanFeeAmount, validTo, owner: trader } = params;
425
525
  const amount = sellAmount.toString();
@@ -434,7 +534,13 @@ var AaveCollateralSwapSdk = class {
434
534
  sellAssetAmount: amount,
435
535
  buyAssetAmount: buyAmount.toString()
436
536
  };
437
- const instanceAddress = await this.getExpectedInstanceAddress(chainId, trader, hookAmounts, encodedOrder);
537
+ const instanceAddress = await this.getExpectedInstanceAddress(
538
+ flashLoanType,
539
+ chainId,
540
+ trader,
541
+ hookAmounts,
542
+ encodedOrder
543
+ );
438
544
  const flashLoanHint = {
439
545
  amount,
440
546
  // this is actually in UNDERLYING but aave tokens are 1:1
@@ -444,6 +550,7 @@ var AaveCollateralSwapSdk = class {
444
550
  token: orderToSign.sellToken
445
551
  };
446
552
  const hooks = await this.getOrderHooks(
553
+ flashLoanType,
447
554
  chainId,
448
555
  trader,
449
556
  instanceAddress,
@@ -546,11 +653,11 @@ var AaveCollateralSwapSdk = class {
546
653
  };
547
654
  return adapter.signer.sendTransaction(txParams);
548
655
  }
549
- async getExpectedInstanceAddress(chainId, trader, hookAmounts, order) {
656
+ async getExpectedInstanceAddress(flashLoanType, chainId, trader, hookAmounts, order) {
550
657
  const hookData = this.buildHookOrderData(trader, hookAmounts, order);
551
658
  return await (0, import_sdk_common.getGlobalAdapter)().readContract({
552
659
  address: AAVE_ADAPTER_FACTORY[chainId],
553
- args: [AAVE_COLLATERAL_SWAP_ADAPTER_HOOK[chainId], hookData],
660
+ args: [AAVE_HOOK_ADAPTER_PER_TYPE[flashLoanType][chainId], hookData],
554
661
  functionName: "getInstanceDeterministicAddress",
555
662
  abi: aaveAdapterFactoryAbi
556
663
  });
@@ -571,9 +678,9 @@ var AaveCollateralSwapSdk = class {
571
678
  sellAmountToSign: sellAmount - flashLoanFeeAmount
572
679
  };
573
680
  }
574
- getPreHookCallData(chainId, trader, hookAmounts, order, instanceAddress) {
681
+ getPreHookCallData(flashLoanType, chainId, trader, hookAmounts, order, instanceAddress) {
575
682
  const hookData = this.buildHookOrderData(trader, hookAmounts, order);
576
- const adapterImplementation = AAVE_COLLATERAL_SWAP_ADAPTER_HOOK[chainId];
683
+ const adapterImplementation = AAVE_HOOK_ADAPTER_PER_TYPE[flashLoanType][chainId];
577
684
  return (0, import_sdk_common.getGlobalAdapter)().utils.encodeFunction(aaveAdapterFactoryAbi, "deployAndTransferFlashLoan", [
578
685
  adapterImplementation,
579
686
  { ...hookData, receiver: instanceAddress }
@@ -597,14 +704,38 @@ var AaveCollateralSwapSdk = class {
597
704
  hookBuyTokenAmount: hookAmounts.buyAssetAmount
598
705
  };
599
706
  }
600
- getPostHookCallData(collateralPermit = EMPTY_PERMIT) {
707
+ getFlashLoanPostHook(flashLoanType, collateralPermit) {
708
+ if (flashLoanType === "DebtSwap" /* DebtSwap */) {
709
+ return this.getDebtSwapPostHookCallData(collateralPermit);
710
+ }
711
+ if (flashLoanType === "RepayCollateral" /* RepayCollateral */) {
712
+ return this.getRepayPostHookCallData(collateralPermit);
713
+ }
714
+ return this.getCollateralSwapPostHookCallData(collateralPermit);
715
+ }
716
+ getCollateralSwapPostHookCallData(collateralPermit = EMPTY_PERMIT) {
601
717
  return (0, import_sdk_common.getGlobalAdapter)().utils.encodeFunction(collateralSwapAdapterHookAbi, "collateralSwapWithFlashLoan", [
602
718
  collateralPermit
603
719
  ]);
604
720
  }
605
- async getOrderHooks(chainId, trader, expectedInstanceAddress, hookAmounts, order, collateralPermit) {
606
- const preHookCallData = this.getPreHookCallData(chainId, trader, hookAmounts, order, expectedInstanceAddress);
607
- const postHookCallData = this.getPostHookCallData(collateralPermit);
721
+ getDebtSwapPostHookCallData(collateralPermit = EMPTY_PERMIT) {
722
+ return (0, import_sdk_common.getGlobalAdapter)().utils.encodeFunction(debtSwapAdapterAbi, "debtSwapWithFlashLoan", [collateralPermit]);
723
+ }
724
+ getRepayPostHookCallData(collateralPermit = EMPTY_PERMIT) {
725
+ return (0, import_sdk_common.getGlobalAdapter)().utils.encodeFunction(repayWithCollateralAdapterAbi, "repayDebtWithFlashLoan", [
726
+ collateralPermit
727
+ ]);
728
+ }
729
+ async getOrderHooks(flashLoanType, chainId, trader, expectedInstanceAddress, hookAmounts, order, collateralPermit) {
730
+ const preHookCallData = this.getPreHookCallData(
731
+ flashLoanType,
732
+ chainId,
733
+ trader,
734
+ hookAmounts,
735
+ order,
736
+ expectedInstanceAddress
737
+ );
738
+ const postHookCallData = this.getFlashLoanPostHook(flashLoanType, collateralPermit);
608
739
  return {
609
740
  pre: [
610
741
  {
@@ -648,12 +779,13 @@ var AaveCollateralSwapSdk = class {
648
779
  // Annotate the CommonJS export names for ESM import in node:
649
780
  0 && (module.exports = {
650
781
  AAVE_ADAPTER_FACTORY,
651
- AAVE_COLLATERAL_SWAP_ADAPTER_HOOK,
782
+ AAVE_HOOK_ADAPTER_PER_TYPE,
652
783
  AAVE_POOL_ADDRESS,
653
784
  ADAPTER_DOMAIN_NAME,
654
785
  ADAPTER_DOMAIN_VERSION,
655
786
  ADAPTER_SIGNATURE_TYPES,
656
787
  AaveCollateralSwapSdk,
788
+ AaveFlashLoanType,
657
789
  DEFAULT_HOOK_GAS_LIMIT,
658
790
  DEFAULT_VALIDITY,
659
791
  EMPTY_PERMIT,
package/dist/index.mjs CHANGED
@@ -9,16 +9,23 @@ import { OrderSigningUtils } from "@cowprotocol/sdk-order-signing";
9
9
  import { SigningScheme } from "@cowprotocol/sdk-order-book";
10
10
 
11
11
  // src/aave/const.ts
12
- import { mapAddressToSupportedNetworks, SupportedChainId } from "@cowprotocol/sdk-config";
12
+ import { mapAddressToSupportedNetworks } from "@cowprotocol/sdk-config";
13
13
  var HASH_ZERO = "0x0000000000000000000000000000000000000000000000000000000000000000";
14
+ var AaveFlashLoanType = /* @__PURE__ */ ((AaveFlashLoanType2) => {
15
+ AaveFlashLoanType2["CollateralSwap"] = "CollateralSwap";
16
+ AaveFlashLoanType2["DebtSwap"] = "DebtSwap";
17
+ AaveFlashLoanType2["RepayCollateral"] = "RepayCollateral";
18
+ return AaveFlashLoanType2;
19
+ })(AaveFlashLoanType || {});
14
20
  var AAVE_POOL_ADDRESS = mapAddressToSupportedNetworks("0xb50201558B00496A145fE76f7424749556E326D8");
15
- var AAVE_ADAPTER_FACTORY = {
16
- ...mapAddressToSupportedNetworks("0x1186B5ad42E3e6d6c6901FC53b4A367540E6EcFE"),
17
- [SupportedChainId.GNOSIS_CHAIN]: "0x889ee28C0a8a41a312546A8eeD77b4b097C84016"
18
- };
19
- var AAVE_COLLATERAL_SWAP_ADAPTER_HOOK = {
20
- ...mapAddressToSupportedNetworks("0xe80eE1e73f120b1106179Ae3D582CA4Fd768d517"),
21
- [SupportedChainId.GNOSIS_CHAIN]: "0x0aeC794e544B81D96149a4C8C1cC57c6F31A978A"
21
+ var AAVE_ADAPTER_FACTORY = mapAddressToSupportedNetworks("0x889ee28C0a8a41a312546A8eeD77b4b097C84016");
22
+ var AAVE_COLLATERAL_SWAP_ADAPTER_HOOK = mapAddressToSupportedNetworks("0x0aeC794e544B81D96149a4C8C1cC57c6F31A978A");
23
+ var AAVE_DEBT_SWAP_ADAPTER_HOOK = mapAddressToSupportedNetworks("0x2d13ADCFa398073d7406e5e1aF3dD14663cdBF30");
24
+ var AAVE_REPAY_COLLATERAL_ADAPTER_HOOK = mapAddressToSupportedNetworks("0x193fd444802D6BC18a9AE0613D33C024F16A9dDC");
25
+ var AAVE_HOOK_ADAPTER_PER_TYPE = {
26
+ ["CollateralSwap" /* CollateralSwap */]: AAVE_COLLATERAL_SWAP_ADAPTER_HOOK,
27
+ ["DebtSwap" /* DebtSwap */]: AAVE_DEBT_SWAP_ADAPTER_HOOK,
28
+ ["RepayCollateral" /* RepayCollateral */]: AAVE_REPAY_COLLATERAL_ADAPTER_HOOK
22
29
  };
23
30
  var DEFAULT_HOOK_GAS_LIMIT = {
24
31
  pre: 300000n,
@@ -276,6 +283,94 @@ var collateralSwapAdapterHookAbi = [
276
283
  }
277
284
  ];
278
285
 
286
+ // src/aave/abi/DebtSwapAdapter.ts
287
+ var debtSwapAdapterAbi = [
288
+ {
289
+ type: "function",
290
+ name: "debtSwapWithFlashLoan",
291
+ inputs: [
292
+ {
293
+ name: "creditDelegationSig",
294
+ type: "tuple",
295
+ internalType: "struct DataTypes.CreditDelegationSig",
296
+ components: [
297
+ {
298
+ name: "amount",
299
+ type: "uint256",
300
+ internalType: "uint256"
301
+ },
302
+ {
303
+ name: "deadline",
304
+ type: "uint256",
305
+ internalType: "uint256"
306
+ },
307
+ {
308
+ name: "v",
309
+ type: "uint8",
310
+ internalType: "uint8"
311
+ },
312
+ {
313
+ name: "r",
314
+ type: "bytes32",
315
+ internalType: "bytes32"
316
+ },
317
+ {
318
+ name: "s",
319
+ type: "bytes32",
320
+ internalType: "bytes32"
321
+ }
322
+ ]
323
+ }
324
+ ],
325
+ outputs: [],
326
+ stateMutability: "nonpayable"
327
+ }
328
+ ];
329
+
330
+ // src/aave/abi/RepayWithCollateralAdapter.ts
331
+ var repayWithCollateralAdapterAbi = [
332
+ {
333
+ type: "function",
334
+ name: "repayDebtWithFlashLoan",
335
+ inputs: [
336
+ {
337
+ name: "erc20Permit",
338
+ type: "tuple",
339
+ internalType: "struct DataTypes.Permit",
340
+ components: [
341
+ {
342
+ name: "amount",
343
+ type: "uint256",
344
+ internalType: "uint256"
345
+ },
346
+ {
347
+ name: "deadline",
348
+ type: "uint256",
349
+ internalType: "uint256"
350
+ },
351
+ {
352
+ name: "v",
353
+ type: "uint8",
354
+ internalType: "uint8"
355
+ },
356
+ {
357
+ name: "r",
358
+ type: "bytes32",
359
+ internalType: "bytes32"
360
+ },
361
+ {
362
+ name: "s",
363
+ type: "bytes32",
364
+ internalType: "bytes32"
365
+ }
366
+ ]
367
+ }
368
+ ],
369
+ outputs: [],
370
+ stateMutability: "nonpayable"
371
+ }
372
+ ];
373
+
279
374
  // src/aave/AaveCollateralSwapSdk.ts
280
375
  var AaveCollateralSwapSdk = class {
281
376
  /**
@@ -307,12 +402,16 @@ var AaveCollateralSwapSdk = class {
307
402
  const sellAmount = BigInt(amount);
308
403
  const quoteAndPost = await tradingSdk.getQuote(quoteParams);
309
404
  const { quoteResults, postSwapOrderFromQuote } = quoteAndPost;
310
- const { swapSettings, instanceAddress } = await this.getOrderPostingSettings(quoteParams, {
311
- sellAmount,
312
- buyAmount: quoteResults.amountsAndCosts.afterSlippage.buyAmount,
313
- orderToSign: quoteResults.orderToSign,
314
- collateralPermit: settings?.collateralPermit
315
- });
405
+ const { swapSettings, instanceAddress } = await this.getOrderPostingSettings(
406
+ "CollateralSwap" /* CollateralSwap */,
407
+ quoteParams,
408
+ {
409
+ sellAmount,
410
+ buyAmount: quoteResults.amountsAndCosts.afterSlippage.buyAmount,
411
+ orderToSign: quoteResults.orderToSign,
412
+ collateralPermit: settings?.collateralPermit
413
+ }
414
+ );
316
415
  const collateralParams = {
317
416
  instanceAddress,
318
417
  trader: quoteParams.owner,
@@ -386,7 +485,7 @@ var AaveCollateralSwapSdk = class {
386
485
  * @throws Will throw if contract address calculation fails or gas estimation fails.
387
486
  * ```
388
487
  */
389
- async getOrderPostingSettings(params, settings) {
488
+ async getOrderPostingSettings(flashLoanType, params, settings) {
390
489
  const { sellAmount, buyAmount, orderToSign, collateralPermit } = settings;
391
490
  const { chainId, flashLoanFeeAmount, validTo, owner: trader } = params;
392
491
  const amount = sellAmount.toString();
@@ -401,7 +500,13 @@ var AaveCollateralSwapSdk = class {
401
500
  sellAssetAmount: amount,
402
501
  buyAssetAmount: buyAmount.toString()
403
502
  };
404
- const instanceAddress = await this.getExpectedInstanceAddress(chainId, trader, hookAmounts, encodedOrder);
503
+ const instanceAddress = await this.getExpectedInstanceAddress(
504
+ flashLoanType,
505
+ chainId,
506
+ trader,
507
+ hookAmounts,
508
+ encodedOrder
509
+ );
405
510
  const flashLoanHint = {
406
511
  amount,
407
512
  // this is actually in UNDERLYING but aave tokens are 1:1
@@ -411,6 +516,7 @@ var AaveCollateralSwapSdk = class {
411
516
  token: orderToSign.sellToken
412
517
  };
413
518
  const hooks = await this.getOrderHooks(
519
+ flashLoanType,
414
520
  chainId,
415
521
  trader,
416
522
  instanceAddress,
@@ -513,11 +619,11 @@ var AaveCollateralSwapSdk = class {
513
619
  };
514
620
  return adapter.signer.sendTransaction(txParams);
515
621
  }
516
- async getExpectedInstanceAddress(chainId, trader, hookAmounts, order) {
622
+ async getExpectedInstanceAddress(flashLoanType, chainId, trader, hookAmounts, order) {
517
623
  const hookData = this.buildHookOrderData(trader, hookAmounts, order);
518
624
  return await getGlobalAdapter().readContract({
519
625
  address: AAVE_ADAPTER_FACTORY[chainId],
520
- args: [AAVE_COLLATERAL_SWAP_ADAPTER_HOOK[chainId], hookData],
626
+ args: [AAVE_HOOK_ADAPTER_PER_TYPE[flashLoanType][chainId], hookData],
521
627
  functionName: "getInstanceDeterministicAddress",
522
628
  abi: aaveAdapterFactoryAbi
523
629
  });
@@ -538,9 +644,9 @@ var AaveCollateralSwapSdk = class {
538
644
  sellAmountToSign: sellAmount - flashLoanFeeAmount
539
645
  };
540
646
  }
541
- getPreHookCallData(chainId, trader, hookAmounts, order, instanceAddress) {
647
+ getPreHookCallData(flashLoanType, chainId, trader, hookAmounts, order, instanceAddress) {
542
648
  const hookData = this.buildHookOrderData(trader, hookAmounts, order);
543
- const adapterImplementation = AAVE_COLLATERAL_SWAP_ADAPTER_HOOK[chainId];
649
+ const adapterImplementation = AAVE_HOOK_ADAPTER_PER_TYPE[flashLoanType][chainId];
544
650
  return getGlobalAdapter().utils.encodeFunction(aaveAdapterFactoryAbi, "deployAndTransferFlashLoan", [
545
651
  adapterImplementation,
546
652
  { ...hookData, receiver: instanceAddress }
@@ -564,14 +670,38 @@ var AaveCollateralSwapSdk = class {
564
670
  hookBuyTokenAmount: hookAmounts.buyAssetAmount
565
671
  };
566
672
  }
567
- getPostHookCallData(collateralPermit = EMPTY_PERMIT) {
673
+ getFlashLoanPostHook(flashLoanType, collateralPermit) {
674
+ if (flashLoanType === "DebtSwap" /* DebtSwap */) {
675
+ return this.getDebtSwapPostHookCallData(collateralPermit);
676
+ }
677
+ if (flashLoanType === "RepayCollateral" /* RepayCollateral */) {
678
+ return this.getRepayPostHookCallData(collateralPermit);
679
+ }
680
+ return this.getCollateralSwapPostHookCallData(collateralPermit);
681
+ }
682
+ getCollateralSwapPostHookCallData(collateralPermit = EMPTY_PERMIT) {
568
683
  return getGlobalAdapter().utils.encodeFunction(collateralSwapAdapterHookAbi, "collateralSwapWithFlashLoan", [
569
684
  collateralPermit
570
685
  ]);
571
686
  }
572
- async getOrderHooks(chainId, trader, expectedInstanceAddress, hookAmounts, order, collateralPermit) {
573
- const preHookCallData = this.getPreHookCallData(chainId, trader, hookAmounts, order, expectedInstanceAddress);
574
- const postHookCallData = this.getPostHookCallData(collateralPermit);
687
+ getDebtSwapPostHookCallData(collateralPermit = EMPTY_PERMIT) {
688
+ return getGlobalAdapter().utils.encodeFunction(debtSwapAdapterAbi, "debtSwapWithFlashLoan", [collateralPermit]);
689
+ }
690
+ getRepayPostHookCallData(collateralPermit = EMPTY_PERMIT) {
691
+ return getGlobalAdapter().utils.encodeFunction(repayWithCollateralAdapterAbi, "repayDebtWithFlashLoan", [
692
+ collateralPermit
693
+ ]);
694
+ }
695
+ async getOrderHooks(flashLoanType, chainId, trader, expectedInstanceAddress, hookAmounts, order, collateralPermit) {
696
+ const preHookCallData = this.getPreHookCallData(
697
+ flashLoanType,
698
+ chainId,
699
+ trader,
700
+ hookAmounts,
701
+ order,
702
+ expectedInstanceAddress
703
+ );
704
+ const postHookCallData = this.getFlashLoanPostHook(flashLoanType, collateralPermit);
575
705
  return {
576
706
  pre: [
577
707
  {
@@ -614,12 +744,13 @@ var AaveCollateralSwapSdk = class {
614
744
  };
615
745
  export {
616
746
  AAVE_ADAPTER_FACTORY,
617
- AAVE_COLLATERAL_SWAP_ADAPTER_HOOK,
747
+ AAVE_HOOK_ADAPTER_PER_TYPE,
618
748
  AAVE_POOL_ADDRESS,
619
749
  ADAPTER_DOMAIN_NAME,
620
750
  ADAPTER_DOMAIN_VERSION,
621
751
  ADAPTER_SIGNATURE_TYPES,
622
752
  AaveCollateralSwapSdk,
753
+ AaveFlashLoanType,
623
754
  DEFAULT_HOOK_GAS_LIMIT,
624
755
  DEFAULT_VALIDITY,
625
756
  EMPTY_PERMIT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/sdk-flash-loans",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Flash loans for CoW Protocol",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -15,10 +15,10 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@cowprotocol/sdk-common": "0.2.2",
18
- "@cowprotocol/sdk-trading": "0.4.2",
19
18
  "@cowprotocol/sdk-app-data": "4.1.4",
20
- "@cowprotocol/sdk-order-book": "0.1.3",
21
19
  "@cowprotocol/sdk-order-signing": "0.1.7",
20
+ "@cowprotocol/sdk-trading": "0.4.2",
21
+ "@cowprotocol/sdk-order-book": "0.1.3",
22
22
  "@cowprotocol/sdk-config": "0.2.0"
23
23
  },
24
24
  "devDependencies": {
@@ -34,8 +34,8 @@
34
34
  "ts-jest": "^29.0.0",
35
35
  "ethers": "^5.7.2",
36
36
  "viem": "2.30.5",
37
- "@cow-sdk/typescript-config": "0.0.0-beta.0",
38
37
  "@cowprotocol/sdk-ethers-v5-adapter": "0.1.3",
38
+ "@cow-sdk/typescript-config": "0.0.0-beta.0",
39
39
  "@cowprotocol/sdk-ethers-v6-adapter": "0.1.3",
40
40
  "@cowprotocol/sdk-viem-adapter": "0.1.3"
41
41
  },
@@ -46,7 +46,9 @@
46
46
  "test": "jest",
47
47
  "test:coverage": "jest --coverage --json --outputFile=jest.results.json && npx coveralls < ./coverage/lcov.info",
48
48
  "test:coverage:html": "jest --silent=false --coverage --coverageReporters html",
49
- "test:aave-collateral-integration": "npx jest --testNamePattern=^AaveFlashLoanIntegration",
49
+ "test:integration:aave-collateral-swap": "npx jest --testNamePattern=^AaveFlashLoanIntegration.collateralSwap",
50
+ "test:integration:aave-debt-swap": "npx jest --testNamePattern=^AaveFlashLoanIntegration.debtSwap",
51
+ "test:integration:aave-repay-collateral": "npx jest --testNamePattern=^AaveFlashLoanIntegration.repayCollateral",
50
52
  "typecheck": "tsc --noEmit"
51
53
  }
52
54
  }