Switch Adapters

These switch adapters integrate Aave's Flash Loans and the ParaSwap DEX aggregator smart contracts to facilitate advanced actions such as repaying borrow positions using collateral, switching collateral assets, switching borrow positions, and withdrawing and switching assets. They allow users to perform complex operations in a single transaction, leveraging the liquidity of the Aave protocol and the atomic switching capabilities of decentralized exchanges.

The table below outlines switch feature availability across V3 markets on the Aave Labs interface:

MarketRepay With CollateralCollateral SwitchDebt SwitchWithdraw & Switch
Ethereum
Ethereum Lido
Ethereum EtherFi
Arbitrum
Avalanche
Base
BNB
Optimism
Polygon
Gnosis
Fantom
Harmony
Metis
Scroll
ZKsync

Repay With Collateral

The ParaSwapRepayAdapter contract enables users to repay their borrow positions on Aave using their supplied collateral directly, without the need to unwind their positions or provide additional liquidity. It leverages Aave's Flash Loans and the ParaSwap DEX aggregator to switch the user's collateral for the borrowed asset and repay the borrow position in a single atomic transaction.

By using this adapter, users can efficiently manage their positions and reduce their borrow positions using their existing collateral, saving on transaction costs and avoiding manual steps.

The source code is available on GitHub.

Reference Integration: useCollateralRepaySwap.tsx

Write Methods

executeOperation

function executeOperation(    address asset,    uint256 amount,    uint256 premium,    address initiator,    bytes calldata params) external override nonReentrant returns (bool)

Uses the received funds from the flash loan to repay a borrow position on the protocol on behalf of the user. Then, pulls the collateral from the user and switches it to the debt asset to repay the flash loan.

The user should give this contract allowance to pull the aTokens in order to withdraw the underlying asset, switch it, and repay the flash loan.

Supports only one asset on the flash loan.

The params parameter should be the ABI-encoded values of the following:

  • IERC20Detailed debtAsset — The address of the borrow position asset

  • uint256 debtRepayAmount — The amount of the borrow position to be repaid

  • uint256 buyAllBalanceOffset — Offset in the ParaSwap calldata if switching all balance

  • uint256 rateMode — The rate mode of the borrow position to be repaid

  • bytes paraswapData — Data for the ParaSwap Adapter

  • PermitSignature permitSignature — Struct containing the permit signature, set to zeroes if not used

Input Parameters:
NameTypeDescription
assetaddressThe address of the flash-borrowed asset
amountuint256The amount of the flash-borrowed asset
premiumuint256The fee of the flash-borrowed asset
initiatoraddressThe address of the flash loan initiator
paramsbytesThe byte-encoded parameters passed when initiating the flash loan
Return Values:
TypeDescription
boolTrue if the execution of the operation succeeds, false otherwise

swapAndRepay

function swapAndRepay(    IERC20Detailed collateralAsset,    IERC20Detailed debtAsset,    uint256 collateralAmount,    uint256 debtRepayAmount,    uint256 debtRateMode,    uint256 buyAllBalanceOffset,    bytes calldata paraswapData,    PermitSignature calldata permitSignature) external nonReentrant

Switches the user's collateral for the debt asset and then repays the borrow position on the protocol on behalf of the user without using flash loans. This method can be used when the temporary transfer of the collateral asset to this contract does not affect the user's position.

The user should give this contract allowance to pull the aTokens in order to withdraw the underlying asset.

Input Parameters:
NameTypeDescription
collateralAssetIERC20DetailedThe address of the collateral asset to be switched
debtAssetIERC20DetailedThe address of the debt asset
collateralAmountuint256The maximum amount of the collateral to be switched
debtRepayAmountuint256The amount of the borrow position to be repaid, or maximum amount when repaying all
debtRateModeuint256The rate mode of the borrow position to be repaid
buyAllBalanceOffsetuint256Offset in the ParaSwap calldata if switching all balance, otherwise 0
paraswapDatabytesData for the ParaSwap Adapter
permitSignaturePermitSignatureStruct containing the permit signature, set to zeroes if not used

PermitSignature Struct

struct PermitSignature {    uint256 deadline;    uint8 v;    bytes32 r;    bytes32 s;}
Members:
NameTypeDescription
deadlineuint256The deadline timestamp for the permit signature
vuint8The V parameter of the ECDSA signature
rbytes32The R parameter of the ECDSA signature
sbytes32The S parameter of the ECDSA signature

Collateral Switch

The ParaSwapLiquiditySwapAdapter contract allows users to switch their supplied collateral from one asset to another in a single transaction using Aave's Flash Loans and the ParaSwap DEX aggregator.

This adapter enables users to rebalance their collateral positions without needing to withdraw and re-supply assets manually. By leveraging flash loans, the user can switch their existing collateral to a new asset and supply it back into the Aave protocol in a single transaction.

The source code is available on GitHub.

Reference Integration: useCollateralSwap.tsx

Write Methods

executeOperation

function executeOperation(    address asset,    uint256 amount,    uint256 premium,    address initiator,    bytes calldata params) external override nonReentrant returns (bool)

Switches the received amount from the flash loan into the specified asset. The received funds from the switch are then supplied into the protocol on behalf of the user.

The user should give this contract allowance to pull the aTokens in order to withdraw the underlying asset and repay the flash loan.

The params parameter should be the ABI-encoded values of the following:

  • IERC20Detailed assetToSwapTo — The address of the underlying asset to be switched to and supplied

  • uint256 minAmountToReceive — The minimum amount to be received from the switch

  • uint256 swapAllBalanceOffset — Offset in the Augustus calldata if switching all balance, otherwise 0

  • bytes swapCalldata — Calldata for ParaSwap's Augustus Swapper contract

  • IParaSwapAugustus augustus — Address of ParaSwap's Augustus Swapper contract

  • PermitSignature permitParams — Struct containing the permit signature, set to zeroes if not used

Input Parameters:
NameTypeDescription
assetaddressThe address of the flash-borrowed asset
amountuint256The amount of the flash-borrowed asset
premiumuint256The fee of the flash-borrowed asset
initiatoraddressThe address of the flash loan initiator
paramsbytesThe byte-encoded parameters passed when initiating the flash loan
Return Values:
TypeDescription
boolTrue if the execution of the operation succeeds, false otherwise

swapAndDeposit

function swapAndDeposit(    IERC20Detailed assetToSwapFrom,    IERC20Detailed assetToSwapTo,    uint256 amountToSwap,    uint256 minAmountToReceive,    uint256 swapAllBalanceOffset,    bytes calldata swapCalldata,    IParaSwapAugustus augustus,    PermitSignature calldata permitParams) external nonReentrant

Switches an amount of an asset to another and supplies the new asset amount on behalf of the user without using a flash loan. This method can be used when the temporary transfer of the collateral asset to this contract does not affect the user's position.

The user should give this contract allowance to pull the aTokens in order to withdraw the underlying asset and perform the switch.

Input Parameters:
NameTypeDescription
assetToSwapFromIERC20DetailedThe address of the underlying asset to be switched from
assetToSwapToIERC20DetailedThe address of the underlying asset to be switched to and supplied
amountToSwapuint256Amount to be switched, or maximum amount when switching all balance
minAmountToReceiveuint256Minimum amount to be received from the switch
swapAllBalanceOffsetuint256Offset in Augustus calldata if switching all balance, otherwise 0
swapCalldatabytesCalldata for ParaSwap's Augustus Swapper contract
augustusIParaSwapAugustusAddress of ParaSwap's Augustus Swapper contract
permitParamsPermitSignatureStruct containing the permit signature, set to zeroes if not used

Borrow Position Switch

The ParaSwapDebtSwapAdapter contracts allow users to switch their borrow positions from one asset to another. They leverage Aave's Flash Loans and the ParaSwap DEX aggregator to perform the switch in a single atomic transaction.

There are two versions of the adapter:

  • ParaSwapDebtSwapAdapterV3: The standard version that supports switching any borrow position asset.

  • ParaSwapDebtSwapAdapterV3GHO: A specialized version that supports GHO, where GHO can be flash minted via the ERC-3156 interface.

ParaSwapDebtSwapAdapterV3

The ParaSwapDebtSwapAdapterV3 contract allows users to switch their borrow positions from one asset to another, enabling borrow position refinancing on the Aave protocol.

This adapter leverages Aave's Flash Loans and the ParaSwap DEX aggregator to perform the borrow position switch in a single transaction.

Write Methods

executeOperation
function executeOperation(    address[] calldata assets,    uint256[] calldata amounts,    uint256[] calldata,    address initiator,    bytes calldata params) external returns (bool)

Performs the borrow position switch operation using the received funds from the flash loan.

Performs the switch and repay operation using the borrowed funds from the flash loan, and then re-borrows the new borrow position asset to maintain the overall borrow position.

The params parameter should be the ABI-encoded values required for the operation, such as:

  • The addresses of the borrow position assets involved

  • The rate modes of the borrow positions

  • ParaSwap switch data

  • Any necessary permit signatures

Input Parameters:
NameTypeDescription
assetsaddress[]The addresses of the assets being borrowed in the flash loan
amountsuint256[]The amounts of the assets being borrowed
premiumsuint256[]The fees for the flash loans
initiatoraddressThe address of the flash loan initiator
paramsbytesArbitrary data containing the parameters needed for the operation
Return Values:
TypeDescription
boolTrue if the execution of the operation succeeds, false otherwise

ParaSwapDebtSwapAdapterV3GHO

The ParaSwapDebtSwapAdapterV3GHO contract is a specialized version of the borrow position switch adapter that supports GHO, allowing users to switch their borrow positions involving GHO. It utilizes the ERC-3156 flash mint interface for GHO.

Performs the switch and repay operation using the borrowed funds from the flash loan, and then re-borrows the borrow position asset to maintain the overall borrow position.

Write Methods

onFlashLoan
function onFlashLoan(    address initiator,    address token,    uint256 amount,    uint256 fee,    bytes calldata data) external override returns (bytes32)

This is the ERC-3156 Flash Loan callback function that gets called when the contract receives a flash loan (in this case, flash mint) from the GHO Flash Minter.

Input Parameters:
NameTypeDescription
initiatoraddressThe initiator of the flash loan
tokenaddressThe address of the token being borrowed
amountuint256The amount of tokens being borrowed
feeuint256The fee for the flash loan
databytesArbitrary data containing the parameters needed for the operation
Return Values:
TypeDescription
bytes32The keccak256 hash of the string 'ERC3156FlashBorrower.onFlashLoan'

Withdraw & Switch

The ParaSwapWithdrawSwapAdapter contract allows users to withdraw their supplied assets from Aave and switch them to another asset in a single transaction using the ParaSwap DEX aggregator.

This adapter enables users to efficiently exit positions and switch their assets without having to perform multiple transactions, reducing gas costs and simplifying the user experience.

The source code is available on GitHub.

Reference Integration: WithdrawAndSwitchActions.tsx

Write Methods

withdrawAndSwap

function withdrawAndSwap(    IERC20Detailed assetToSwapFrom,    IERC20Detailed assetToSwapTo,    uint256 amountToSwap,    uint256 minAmountToReceive,    uint256 swapAllBalanceOffset,    bytes calldata swapCalldata,    IParaSwapAugustus augustus,    PermitSignature calldata permitParams) external nonReentrant

Switches an amount of an asset to another after a withdrawal and transfers the new asset to the user. The user should give this contract allowance to pull the aTokens in order to withdraw the underlying asset and perform the switch.

Input Parameters:
NameTypeDescription
assetToSwapFromIERC20DetailedThe address of the underlying asset to be switched from
assetToSwapToIERC20DetailedThe address of the underlying asset to be switched to
amountToSwapuint256Amount to be switched, or maximum amount when switching all balance
minAmountToReceiveuint256Minimum amount to be received from the switch
swapAllBalanceOffsetuint256Offset in Augustus calldata if switching all balance, otherwise 0
swapCalldatabytesCalldata for ParaSwap's Augustus Swapper contract
augustusIParaSwapAugustusAddress of ParaSwap's Augustus Swapper contract
permitParamsPermitSignatureStruct containing the permit signature, set to zeroes if not used

executeOperation

Note that in this contract, the executeOperation method is overridden but simply reverts with NOT_SUPPORTED, so it's not intended to be used.

Aave.com provides information and resources about the fundamentals of the decentralised non-custodial liquidity protocol called the Aave Protocol, comprised of open-source self-executing smart contracts that are deployed on various permissionless public blockchains, such as Ethereum (the "Aave Protocol" or the "Protocol"). Aave Labs does not control or operate any version of the Aave Protocol on any blockchain network.