Skip to main content

Repay

Learn how to repay a debt on Morpho, onchain via a smart contract & offchain via ethers.js.

Repay the debt of anyone, offchain through Etherscan or with ethers.js, or onchain using a smart contract. Here are concrete examples 👇

Morpho AaveV2 Optimizer​

// SPDX-License-Identifier: GNU AGPLv3
pragma solidity ^0.8.16;

import {IMorpho} from "./interfaces/IMorpho.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IWETH9 {
function deposit() external payable;
}

contract MorphoAaveV2Repayer {
address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public constant AWETH = 0x030bA81f1c18d280636F32af80b9AAd02Cf0854e;

address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address public constant ADAI = 0x028171bCA77440897B824Ca71D1c56caC55b68A3;

address public constant MORPHO = 0x777777c9898D384F785Ee44Acfe945efDFf5f3E0;

function _repayERC20(
address _aToken,
address _underlying,
uint256 _amount
) internal {
IERC20(_underlying).approve(MORPHO, _amount);
IMorpho(MORPHO).repay(
_aToken,
address(this), // the address of the user you want to repay on behalf of
_amount
);
}

function repayDAI(uint256 _amount) public {
_repayERC20(
ADAI, // the DAI market, represented by the aDAI ERC20 token
DAI,
_amount
);
}

function repayETH() public payable {
// first wrap ETH into WETH
IWETH9(WETH).deposit{value: msg.value}();

_repayERC20(
AWETH, // the WETH market, represented by the aWETH ERC20 token
WETH,
msg.value
);
}
}

Morpho CompoundV2 Optimizer​

// SPDX-License-Identifier: GNU AGPLv3
pragma solidity ^0.8.16;

import {IMorpho} from "@morpho-org/morpho-core-v1/contracts/compound/interfaces/IMorpho.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IWETH9 {
function deposit() external payable;
}

contract MorphoCompoundRepayer {
address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public constant CETH = 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5;

address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address public constant CDAI = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;

address public constant MORPHO = 0x8888882f8f843896699869179fB6E4f7e3B58888;

function _repayERC20(
address _cToken,
address _underlying,
uint256 _amount
) internal {
IERC20(_underlying).approve(MORPHO, _amount);
IMorpho(MORPHO).repay(
_cToken,
address(this), // the address of the user you want to repay on behalf of
_amount
);
}

function repayDAI(uint256 _amount) external {
_repayERC20(
CDAI, // the DAI market, represented by the cDAI ERC20 token
DAI,
_amount
);
}

function repayETH() external payable {
// first wrap ETH into WETH
IWETH9(WETH).deposit{value: msg.value}();

_repayERC20(
CETH, // the WETH market, represented by the cETH ERC20 token
WETH,
msg.value
);
}
}