* feat: Aave aToken deposit/withdrawal [TKR-111] (#293) * feat: AaveV2 deposit/withdrawal integration WIP * feat: add basic Aave Reserves cache with data from subgraphs WIP * feat: hook up Aave Reserves integration * fix: set allowance before trade & use ERC20 token interface * refactor: pass aToken to mixin to avoid lookup * fix: migrate from swap/revert to normal sampling * fix: Aave gas estimate & refactor to clean up code * feat: Create a sampler no operation type and make AaveV2Sampler a no-op * fix: Clipper merge conflict resolution issues * fix: don't fetch unnecessary Aave pool data & clean up code * chore: Add changelog entries * feat: cToken deposit/withdrawal [TKR-222] (#294) * feat: first stab at a CompoundSampler implementation * feat: MixinCompound implementation WIP * feat: Compound integration with cache WIP * fix: decimals scaling in CompoundSampler * feat: handle minting and redeeming of cETH * fix: adjust Compound gas schedule * refactor: clean up code and add comments in cToken cache * fix: MixinCompound check allowance on WETH withdrawal & fix indentation * fix: address review comments and clean up code * chore: add changelog entries * feat: enable AaveV2 on Avalanche * chore: add freshly deployed FQT on Polygon, Avalanche * fix: temporarily disable on Ethereum mainnet until we redeploy EP * fix: address PR comments and update changelogs * fix: correct contract-addresses changelog note
94 lines
3.4 KiB
Solidity
94 lines
3.4 KiB
Solidity
// SPDX-License-Identifier: Apache-2.0
|
|
/*
|
|
|
|
Copyright 2021 ZeroEx Intl.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
pragma solidity ^0.6.5;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol";
|
|
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
|
|
|
// Minimal Aave V2 LendingPool interface
|
|
interface ILendingPool {
|
|
/**
|
|
* @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.
|
|
* - E.g. User deposits 100 USDC and gets in return 100 aUSDC
|
|
* @param asset The address of the underlying asset to deposit
|
|
* @param amount The amount to be deposited
|
|
* @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user
|
|
* wants to receive them on his own wallet, or a different address if the beneficiary of aTokens
|
|
* is a different wallet
|
|
* @param referralCode Code used to register the integrator originating the operation, for potential rewards.
|
|
* 0 if the action is executed directly by the user, without any middle-man
|
|
**/
|
|
function deposit(
|
|
address asset,
|
|
uint256 amount,
|
|
address onBehalfOf,
|
|
uint16 referralCode
|
|
) external;
|
|
|
|
/**
|
|
* @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned
|
|
* E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC
|
|
* @param asset The address of the underlying asset to withdraw
|
|
* @param amount The underlying amount to be withdrawn
|
|
* - Send the value type(uint256).max in order to withdraw the whole aToken balance
|
|
* @param to Address that will receive the underlying, same as msg.sender if the user
|
|
* wants to receive it on his own wallet, or a different address if the beneficiary is a
|
|
* different wallet
|
|
* @return The final amount withdrawn
|
|
**/
|
|
function withdraw(
|
|
address asset,
|
|
uint256 amount,
|
|
address to
|
|
) external returns (uint256);
|
|
}
|
|
|
|
contract MixinAaveV2 {
|
|
using LibERC20TokenV06 for IERC20TokenV06;
|
|
|
|
function _tradeAaveV2(
|
|
IERC20TokenV06 sellToken,
|
|
IERC20TokenV06 buyToken,
|
|
uint256 sellAmount,
|
|
bytes memory bridgeData
|
|
)
|
|
internal
|
|
returns (uint256)
|
|
{
|
|
(ILendingPool lendingPool, address aToken) = abi.decode(bridgeData, (ILendingPool, address));
|
|
|
|
sellToken.approveIfBelow(
|
|
address(lendingPool),
|
|
sellAmount
|
|
);
|
|
|
|
if (address(buyToken) == aToken) {
|
|
lendingPool.deposit(address(sellToken), sellAmount, address(this), 0);
|
|
// 1:1 mapping token -> aToken and have the same number of decimals as the underlying token
|
|
return sellAmount;
|
|
} else if (address(sellToken) == aToken) {
|
|
return lendingPool.withdraw(address(buyToken), sellAmount, address(this));
|
|
}
|
|
|
|
revert("MixinAaveV2/UNSUPPORTED_TOKEN_PAIR");
|
|
}
|
|
}
|