* 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
58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
import { BigNumber } from '@0x/utils';
|
|
|
|
import { ZERO_AMOUNT } from '../constants';
|
|
export interface AaveInfo {
|
|
lendingPool: string;
|
|
aToken: string;
|
|
underlyingToken: string;
|
|
}
|
|
// tslint:disable-next-line:no-unnecessary-class
|
|
export class AaveV2Sampler {
|
|
public static sampleSellsFromAaveV2(
|
|
aaveInfo: AaveInfo,
|
|
takerToken: string,
|
|
makerToken: string,
|
|
takerTokenAmounts: BigNumber[],
|
|
): BigNumber[] {
|
|
// Deposit/Withdrawal underlying <-> aToken is always 1:1
|
|
if (
|
|
(takerToken.toLowerCase() === aaveInfo.aToken.toLowerCase() &&
|
|
makerToken.toLowerCase() === aaveInfo.underlyingToken.toLowerCase()) ||
|
|
(takerToken.toLowerCase() === aaveInfo.underlyingToken.toLowerCase() &&
|
|
makerToken.toLowerCase() === aaveInfo.aToken.toLowerCase())
|
|
) {
|
|
return takerTokenAmounts;
|
|
}
|
|
|
|
// Not matching the reserve return 0 results
|
|
const numSamples = takerTokenAmounts.length;
|
|
|
|
const makerTokenAmounts = new Array(numSamples);
|
|
makerTokenAmounts.fill(ZERO_AMOUNT);
|
|
return makerTokenAmounts;
|
|
}
|
|
|
|
public static sampleBuysFromAaveV2(
|
|
aaveInfo: AaveInfo,
|
|
takerToken: string,
|
|
makerToken: string,
|
|
makerTokenAmounts: BigNumber[],
|
|
): BigNumber[] {
|
|
// Deposit/Withdrawal underlying <-> aToken is always 1:1
|
|
if (
|
|
(takerToken.toLowerCase() === aaveInfo.aToken.toLowerCase() &&
|
|
makerToken.toLowerCase() === aaveInfo.underlyingToken.toLowerCase()) ||
|
|
(takerToken.toLowerCase() === aaveInfo.underlyingToken.toLowerCase() &&
|
|
makerToken.toLowerCase() === aaveInfo.aToken.toLowerCase())
|
|
) {
|
|
return makerTokenAmounts;
|
|
}
|
|
|
|
// Not matching the reserve return 0 results
|
|
const numSamples = makerTokenAmounts.length;
|
|
const takerTokenAmounts = new Array(numSamples);
|
|
takerTokenAmounts.fill(ZERO_AMOUNT);
|
|
return takerTokenAmounts;
|
|
}
|
|
}
|