Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alpaca V2 Tests #138

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions src/adapter/aave/v2/lib.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.15;

library DataTypes {
// refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.
struct ReserveData {
//stores the reserve configuration
ReserveConfigurationMap configuration;
//the liquidity index. Expressed in ray
uint128 liquidityIndex;
//variable borrow index. Expressed in ray
uint128 variableBorrowIndex;
//the current supply rate. Expressed in ray
uint128 currentLiquidityRate;
//the current variable borrow rate. Expressed in ray
uint128 currentVariableBorrowRate;
//the current stable borrow rate. Expressed in ray
uint128 currentStableBorrowRate;
uint40 lastUpdateTimestamp;
//tokens addresses
address aTokenAddress;
address stableDebtTokenAddress;
address variableDebtTokenAddress;
//address of the interest rate strategy
address interestRateStrategyAddress;
//the id of the reserve. Represents the position in the list of the active reserves
uint8 id;
}

struct ReserveConfigurationMap {
//bit 0-15: LTV
//bit 16-31: Liq. threshold
//bit 32-47: Liq. bonus
//bit 48-55: Decimals
//bit 56: Reserve is active
//bit 57: reserve is frozen
//bit 58: borrowing is enabled
//bit 59: stable rate borrowing enabled
//bit 60-63: reserved
//bit 64-79: reserve factor
uint256 data;
}

struct UserConfigurationMap {
uint256 data;
}

enum InterestRateMode {
NONE,
STABLE,
VARIABLE
}
}
20 changes: 2 additions & 18 deletions src/adapter/across/AcrossAdapter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
pragma solidity ^0.8.15;

import {IAcrossHop, IAcceleratingDistributor} from "./IAcross.sol";
import {IPermissionRegistry} from "../../base/interfaces/IPermissionRegistry.sol";

import {BaseAdapter, IERC20, AdapterConfig} from "../../base/BaseAdapter.sol";
import {MathUpgradeable as Math} from "openzeppelin-contracts-upgradeable/utils/math/MathUpgradeable.sol";
Expand All @@ -26,21 +25,9 @@ contract AcrossAdapter is BaseAdapter {
function __AcrossAdapter_init(
AdapterConfig memory _adapterConfig
) internal onlyInitializing {
(address _acrossHop, address _acrossDistributor) = abi.decode(_adapterConfig.protocolData, (address, address));
__BaseAdapter_init(_adapterConfig);

(IPermissionRegistry permissionRegistry, address _acrossHop, address _acrossDistributor) = abi.decode(
_adapterConfig.protocolData,
(IPermissionRegistry, address, address)
);

if (!permissionRegistry.endorsed(_acrossHop))
revert NotEndorsed(_acrossHop);
if (
permissionRegistry.endorsed(
_acrossDistributor
)
) revert NotEndorsed(_acrossDistributor);

if (!IAcrossHop(_acrossHop).pooledTokens(address(underlying)).isEnabled)
revert Disabled();

Expand All @@ -51,14 +38,11 @@ contract AcrossAdapter is BaseAdapter {
IAcrossHop(acrossHop).pooledTokens(address(underlying)).lpToken
);

lpToken.approve(address(_acrossDistributor), type(uint256).max);
_adapterConfig.underlying.approve(
address(_acrossHop),
type(uint256).max
);
_adapterConfig.lpToken.approve(
address(_acrossDistributor),
type(uint256).max
);
}

/*//////////////////////////////////////////////////////////////
Expand Down
7 changes: 2 additions & 5 deletions src/adapter/alpaca/alpacaLendV1/AlpacaLendV1Adapter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Docgen-SOLC: 0.8.15

pragma solidity ^0.8.15;

import {IAlpacaLendV1Vault} from "./IAlpacaLendV1.sol";
import {BaseAdapter, IERC20, AdapterConfig} from "../../../base/BaseAdapter.sol";
import {MathUpgradeable as Math} from "openzeppelin-contracts-upgradeable/utils/math/MathUpgradeable.sol";
Expand Down Expand Up @@ -30,10 +29,7 @@ contract AlpacaLendV1Adapter is BaseAdapter {
(address)
);

// TODO: add permission registry to verify vault is valid

alpacaVault = IAlpacaLendV1Vault(_vault);

if (alpacaVault.token() != address(underlying)) revert InvalidAsset();

_adapterConfig.underlying.approve(
Expand Down Expand Up @@ -65,7 +61,8 @@ contract AlpacaLendV1Adapter is BaseAdapter {
//////////////////////////////////////////////////////////////*/

function _deposit(uint256 amount, address caller) internal override {
underlying.safeTransferFrom(caller, address(this), amount);
if(caller != address(this))
underlying.safeTransferFrom(caller, address(this), amount);
_depositUnderlying(amount);
}

Expand Down
22 changes: 22 additions & 0 deletions src/adapter/alpaca/alpacaLendV1/AlpacaLendV1Depositor.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// SPDX-License-Identifier: GPL-3.0
// Docgen-SOLC: 0.8.15

pragma solidity ^0.8.15;

import {AlpacaLendV1Adapter, IERC20, AdapterConfig} from "./AlpacaLendV1Adapter.sol";

contract AlpacaLendV1Depositor is AlpacaLendV1Adapter {
function initialize(
AdapterConfig memory _adapterConfig
) external initializer {
__AlpacaLendV1Adapter_init(_adapterConfig);
}

function deposit(uint256 amount) external override onlyVault whenNotPaused {
_deposit(amount, msg.sender);
}

function withdraw(uint256 amount, address receiver) external override onlyVault {
_withdraw(amount, receiver);
}
}
3 changes: 2 additions & 1 deletion src/adapter/rocketpool/RocketpoolAdapter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ contract RocketpoolAdapter is BaseAdapter {
//////////////////////////////////////////////////////////////*/

function _deposit(uint256 amount, address caller) internal override {
underlying.safeTransferFrom(caller, address(this), amount); // TODO -- if caller is address(this) (from unpause) we shouldnt call this
if(caller != address(this))
underlying.safeTransferFrom(caller, address(this), amount);
_depositUnderlying(amount);
}

Expand Down
30 changes: 30 additions & 0 deletions test/adapter/across/AcrossDepositor.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {Clones} from "openzeppelin-contracts/proxy/Clones.sol";
import {BaseStrategyTest} from "../../base/BaseStrategyTest.sol";
import {AcrossTestConfigStorage} from "./AcrossTestConfigStorage.sol";
import {AcrossDepositor} from "../../../src/adapter/across/AcrossDepositor.sol";
import {IBaseAdapter, AdapterConfig} from "../../../src/base/interfaces/IBaseAdapter.sol";
import {ITestConfigStorage, TestConfig} from "../../base/interfaces/ITestConfigStorage.sol";

contract AcrossDepositorTest is BaseStrategyTest {
function setUp() public {
_setUpBaseTest(0);
}

function _deployTestConfigStorage() internal override {
testConfigStorage = ITestConfigStorage(address(new AcrossTestConfigStorage()));
}

function _setUpStrategy(
AdapterConfig memory adapterConfig,
address owner_
) internal override returns (IBaseAdapter) {
address _strategy = Clones.clone(address(new AcrossDepositor()));

vm.startPrank(owner_);
IBaseAdapter(_strategy).initialize(adapterConfig);
vm.stopPrank();

return IBaseAdapter(_strategy);
}

}
39 changes: 39 additions & 0 deletions test/adapter/across/AcrossTestConfigStorage.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import {IERC20Upgradeable as IERC20} from "openzeppelin-contracts-upgradeable/interfaces/IERC20Upgradeable.sol";

import {TestConfig} from "../../base/interfaces/ITestConfigStorage.sol";
import {BaseTestConfigStorage} from "../../base/BaseTestConfigStorage.sol";
import {AdapterConfig} from "../../../src/base/interfaces/IBaseAdapter.sol";

contract AcrossTestConfigStorage is BaseTestConfigStorage {
IERC20 public constant WETH = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
IERC20[] public rewardTokens;

constructor() {
_testConfigs.push(TestConfig({
asset: WETH,
depositDelta: 1,
withdrawDelta: 1,
testId: "AaveV3 WETH",
network: "mainnet",
blockNumber: 0,
defaultAmount: 1e18,
minDeposit: 1e18,
maxDeposit: 1e18,
minWithdraw: 1e18,
maxWithdraw: 1e18,
optionalData: ""
}));

_adapterConfigs.push(AdapterConfig({
underlying: WETH,
lpToken: IERC20(address(0)) ,
useLpToken: false,
rewardTokens: rewardTokens,
owner: msg.sender,
protocolData: abi.encode(
0xc186fA914353c44b2E33eBE05f21846F1048bEda, // Mainnet Across Hop Pool - 0xc186fA914353c44b2E33eBE05f21846F1048bEda
0x9040e41eF5E8b281535a96D9a48aCb8cfaBD9a48 // Mainnet Across Accelerating Distributor - 0x9040e41eF5E8b281535a96D9a48aCb8cfaBD9a48
)
}));
}
}
30 changes: 30 additions & 0 deletions test/adapter/alpaca/AlpacaLendV1Depositor.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {Clones} from "openzeppelin-contracts/proxy/Clones.sol";
import {BaseStrategyTest} from "../../base/BaseStrategyTest.sol";
import {AlpacaTestConfigStorage} from "./AlpacaTestConfigStorage.sol";
import {IBaseAdapter, AdapterConfig} from "../../../src/base/interfaces/IBaseAdapter.sol";
import {ITestConfigStorage, TestConfig} from "../../base/interfaces/ITestConfigStorage.sol";
import {AlpacaLendV1Depositor} from "../../../src/adapter/alpaca/alpacaLendV1/AlpacaLendV1Depositor.sol";

contract AlpacaLendV1DepositorTest is BaseStrategyTest {
function setUp() public {
_setUpBaseTest(0);
}

function _deployTestConfigStorage() internal override {
testConfigStorage = ITestConfigStorage(address(new AlpacaTestConfigStorage()));
}

function _setUpStrategy(
AdapterConfig memory adapterConfig,
address owner_
) internal override returns (IBaseAdapter) {
address _strategy = Clones.clone(address(new AlpacaLendV1Depositor()));

vm.startPrank(owner_);
IBaseAdapter(_strategy).initialize(adapterConfig);
vm.stopPrank();

return IBaseAdapter(_strategy);
}

}
38 changes: 38 additions & 0 deletions test/adapter/alpaca/AlpacaTestConfigStorage.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {IERC20Upgradeable as IERC20} from "openzeppelin-contracts-upgradeable/interfaces/IERC20Upgradeable.sol";

import {TestConfig} from "../../base/interfaces/ITestConfigStorage.sol";
import {BaseTestConfigStorage} from "../../base/BaseTestConfigStorage.sol";
import {AdapterConfig} from "../../../src/base/interfaces/IBaseAdapter.sol";

contract AlpacaTestConfigStorage is BaseTestConfigStorage {
IERC20 public constant BSC_USD = IERC20(0x55d398326f99059fF775485246999027B3197955);
IERC20[] public rewardTokens;

constructor() {
_testConfigs.push(TestConfig({
asset: BSC_USD,
depositDelta: 1,
withdrawDelta: 1,
testId: "AlpacaLendV1Depositor ",
network: "binance",
blockNumber: 0,
defaultAmount: 1e18,
minDeposit: 1e18,
maxDeposit: 1e18,
minWithdraw: 1e18,
maxWithdraw: 1e18,
optionalData: ""
}));

_adapterConfigs.push(AdapterConfig({
underlying: BSC_USD,
lpToken: IERC20(address(0)) ,
useLpToken: false,
rewardTokens: rewardTokens,
owner: msg.sender,
protocolData: abi.encode(
0x158Da805682BdC8ee32d52833aD41E74bb951E59 // AlpacaLendV1 USDT - BSC
)
}));
}
}