编译器
0.8.17+commit.8df45f5f
文件 1 的 37:AaveFlashLiquidator.sol
pragma solidity 0.8.17;
import {IFlashLoanReceiver} from "../../interfaces/aave/IFlashLoanReceiver.sol";
import {IFlashLender} from "../../interfaces/aave/IFlashLender.sol";
import {NotionalProxy} from "../../interfaces/notional/NotionalProxy.sol";
import {FlashLiquidatorBase} from "./FlashLiquidatorBase.sol";
contract AaveFlashLiquidator is IFlashLoanReceiver, FlashLiquidatorBase {
constructor(NotionalProxy notional_, address aave_)
FlashLiquidatorBase(notional_, aave_) {
}
function _flashLiquidate(
address asset,
uint256 amount,
bool withdraw,
LiquidationParams calldata params
) internal override {
address[] memory assets = new address[](1);
uint256[] memory amounts = new uint256[](1);
assets[0] = asset;
amounts[0] = amount;
IFlashLender(FLASH_LENDER).flashLoan(
address(this),
assets,
amounts,
new uint256[](1),
address(this),
abi.encode(asset, amount, withdraw, params),
0
);
}
function executeOperation(
address[] calldata assets,
uint256[] calldata amounts,
uint256[] calldata premiums,
address initiator,
bytes calldata params
) external returns (bool) {
super.handleLiquidation(premiums[0], false, params);
return true;
}
}
文件 2 的 37:AggregatorInterface.sol
pragma solidity >=0.6.0;
interface AggregatorInterface {
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}
文件 3 的 37:AggregatorV2V3Interface.sol
pragma solidity >=0.6.0;
import "./AggregatorInterface.sol";
import "./AggregatorV3Interface.sol";
interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface
{
}
文件 4 的 37:AggregatorV3Interface.sol
pragma solidity >=0.6.0;
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(uint80 _roundId)
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}
文件 5 的 37:AssetRateAdapter.sol
pragma solidity >=0.7.0;
interface AssetRateAdapter {
function token() external view returns (address);
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function underlying() external view returns (address);
function getExchangeRateStateful() external returns (int256);
function getExchangeRateView() external view returns (int256);
function getAnnualizedSupplyRate() external view returns (uint256);
}
文件 6 的 37:BoringOwnable.sol
pragma solidity 0.8.17;
contract BoringOwnableData {
address public owner;
address public pendingOwner;
}
contract BoringOwnable is BoringOwnableData {
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function transferOwnership(
address newOwner,
bool direct,
bool renounce
) external onlyOwner {
if (direct) {
require(newOwner != address(0) || renounce, "Ownable: zero address");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
pendingOwner = address(0);
} else {
pendingOwner = newOwner;
}
}
function claimOwnership() external {
address _pendingOwner = pendingOwner;
require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
emit OwnershipTransferred(owner, _pendingOwner);
owner = _pendingOwner;
pendingOwner = address(0);
}
modifier onlyOwner() {
require(msg.sender == owner, "Ownable: caller is not the owner");
_;
}
}
文件 7 的 37:CErc20Interface.sol
pragma solidity >=0.7.6;
import "./CTokenInterface.sol";
interface CErc20Interface {
function mint(uint mintAmount) external returns (uint);
function redeem(uint redeemTokens) external returns (uint);
function redeemUnderlying(uint redeemAmount) external returns (uint);
function borrow(uint borrowAmount) external returns (uint);
function repayBorrow(uint repayAmount) external returns (uint);
function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint);
function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external returns (uint);
}
文件 8 的 37:CEtherInterface.sol
pragma solidity >=0.7.6;
interface CEtherInterface {
function mint() external payable;
}
文件 9 的 37:CTokenInterface.sol
pragma solidity >=0.7.6;
interface CTokenInterface {
function underlying() external view returns (address);
function transfer(address dst, uint amount) external returns (bool);
function transferFrom(address src, address dst, uint amount) external returns (bool);
function approve(address spender, uint amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function balanceOfUnderlying(address owner) external returns (uint);
function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint);
function borrowRatePerBlock() external view returns (uint);
function supplyRatePerBlock() external view returns (uint);
function totalBorrowsCurrent() external returns (uint);
function borrowBalanceCurrent(address account) external returns (uint);
function borrowBalanceStored(address account) external view returns (uint);
function exchangeRateCurrent() external returns (uint);
function exchangeRateStored() external view returns (uint);
function getCash() external view returns (uint);
function accrueInterest() external returns (uint);
function seize(address liquidator, address borrower, uint seizeTokens) external returns (uint);
}
文件 10 的 37:Constants.sol
pragma solidity >=0.7.6;
library Constants {
uint8 internal constant CETH_DECIMAL_PLACES = 8;
int256 internal constant INTERNAL_TOKEN_PRECISION = 1e8;
uint256 internal constant INCENTIVE_ACCUMULATION_PRECISION = 1e18;
address internal constant ETH_ADDRESS = address(0);
uint256 internal constant ETH_CURRENCY_ID = 1;
uint8 internal constant ETH_DECIMAL_PLACES = 18;
int256 internal constant ETH_DECIMALS = 1e18;
uint256 internal constant MAX_DECIMAL_PLACES = 36;
address internal constant RESERVE = address(0);
bytes32 internal constant MSB = 0x8000000000000000000000000000000000000000000000000000000000000000;
bytes32 internal constant ACTIVE_MARKETS_MASK = (
MSB >> ( 90 - 1) |
MSB >> (105 - 1) |
MSB >> (135 - 1) |
MSB >> (147 - 1) |
MSB >> (183 - 1) |
MSB >> (211 - 1) |
MSB >> (251 - 1)
);
int256 internal constant PERCENTAGE_DECIMALS = 100;
uint256 internal constant MAX_TRADED_MARKET_INDEX = 7;
uint256 internal constant MAX_BITMAP_ASSETS = 20;
uint256 internal constant FIVE_MINUTES = 300;
uint256 internal constant DAY = 86400;
uint256 internal constant WEEK = DAY * 6;
uint256 internal constant MONTH = WEEK * 5;
uint256 internal constant QUARTER = MONTH * 3;
uint256 internal constant YEAR = QUARTER * 4;
uint256 internal constant DAYS_IN_WEEK = 6;
uint256 internal constant DAYS_IN_MONTH = 30;
uint256 internal constant DAYS_IN_QUARTER = 90;
uint256 internal constant MAX_DAY_OFFSET = 90;
uint256 internal constant MAX_WEEK_OFFSET = 360;
uint256 internal constant MAX_MONTH_OFFSET = 2160;
uint256 internal constant MAX_QUARTER_OFFSET = 7650;
uint256 internal constant WEEK_BIT_OFFSET = 90;
uint256 internal constant MONTH_BIT_OFFSET = 135;
uint256 internal constant QUARTER_BIT_OFFSET = 195;
uint256 internal constant IMPLIED_RATE_TIME = 360 * DAY;
int256 internal constant RATE_PRECISION = 1e9;
uint256 internal constant BASIS_POINT = uint256(RATE_PRECISION / 10000);
uint256 internal constant DELEVERAGE_BUFFER = 300 * BASIS_POINT;
uint256 internal constant FIVE_BASIS_POINTS = 5 * BASIS_POINT;
uint256 internal constant TEN_BASIS_POINTS = 10 * BASIS_POINT;
int128 internal constant RATE_PRECISION_64x64 = 0x3b9aca000000000000000000;
int128 internal constant LOG_RATE_PRECISION_64x64 = 382276781265598821176;
int256 internal constant MAX_MARKET_PROPORTION = RATE_PRECISION * 99 / 100;
uint8 internal constant FCASH_ASSET_TYPE = 1;
uint8 internal constant MIN_LIQUIDITY_TOKEN_INDEX = 2;
uint8 internal constant MAX_LIQUIDITY_TOKEN_INDEX = 8;
bytes1 internal constant BOOL_FALSE = 0x00;
bytes1 internal constant BOOL_TRUE = 0x01;
bytes1 internal constant HAS_ASSET_DEBT = 0x01;
bytes1 internal constant HAS_CASH_DEBT = 0x02;
bytes2 internal constant ACTIVE_IN_PORTFOLIO = 0x8000;
bytes2 internal constant ACTIVE_IN_BALANCES = 0x4000;
bytes2 internal constant UNMASK_FLAGS = 0x3FFF;
uint16 internal constant MAX_CURRENCIES = uint16(UNMASK_FLAGS);
int256 internal constant DEPOSIT_PERCENT_BASIS = 1e8;
uint256 internal constant SLIPPAGE_LIMIT_PRECISION = 1e8;
}
文件 11 的 37:Deployments.sol
pragma solidity >=0.7.6;
import {NotionalProxy} from "../../interfaces/notional/NotionalProxy.sol";
import {IWstETH} from "../../interfaces/IWstETH.sol";
import {IBalancerVault, IAsset} from "../../interfaces/balancer/IBalancerVault.sol";
import {WETH9} from "../../interfaces/WETH9.sol";
import {ISwapRouter as UniV3ISwapRouter} from "../../interfaces/uniswap/v3/ISwapRouter.sol";
import {IUniV2Router2} from "../../interfaces/uniswap/v2/IUniV2Router2.sol";
import {ICurveRouter} from "../../interfaces/curve/ICurveRouter.sol";
import {ICurveRegistry} from "../../interfaces/curve/ICurveRegistry.sol";
library Deployments {
NotionalProxy internal constant NOTIONAL = NotionalProxy(0x1344A36A1B56144C3Bc62E7757377D288fDE0369);
IWstETH internal constant WRAPPED_STETH = IWstETH(0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0);
address internal constant ETH_ADDRESS = address(0);
WETH9 internal constant WETH =
WETH9(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
IBalancerVault internal constant BALANCER_VAULT =
IBalancerVault(0xBA12222222228d8Ba445958a75a0704d566BF2C8);
UniV3ISwapRouter internal constant UNIV3_ROUTER = UniV3ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);
address internal constant ZERO_EX = 0xDef1C0ded9bec7F1a1670819833240f027b25EfF;
IUniV2Router2 internal constant UNIV2_ROUTER = IUniV2Router2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address internal constant ALT_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
ICurveRegistry public constant CURVE_REGISTRY = ICurveRegistry(0x90E00ACe148ca3b23Ac1bC8C240C2a7Dd9c2d7f5);
ICurveRouter public constant CURVE_ROUTER = ICurveRouter(0xfA9a30350048B2BF66865ee20363067c66f67e58);
}
文件 12 的 37:FlashLiquidatorBase.sol
pragma solidity 0.8.17;
import {NotionalProxy} from "../../interfaces/notional/NotionalProxy.sol";
import {IStrategyVault} from "../../interfaces/notional/IStrategyVault.sol";
import {CErc20Interface} from "../../interfaces/compound/CErc20Interface.sol";
import {CEtherInterface} from "../../interfaces/compound/CEtherInterface.sol";
import {WETH9} from "../../interfaces/WETH9.sol";
import {TokenUtils, IERC20} from "../utils/TokenUtils.sol";
import {Constants} from "../global/Constants.sol";
import {Token} from "../global/Types.sol";
import {BoringOwnable} from "./BoringOwnable.sol";
import {Deployments} from "../global/Deployments.sol";
abstract contract FlashLiquidatorBase is BoringOwnable {
using TokenUtils for IERC20;
NotionalProxy public immutable NOTIONAL;
address internal immutable FLASH_LENDER;
mapping(address => address) internal underlyingToAsset;
struct LiquidationParams {
uint16 currencyId;
address account;
address vault;
bool useVaultDeleverage;
bytes redeemData;
}
constructor(NotionalProxy notional_, address flashLender_) {
NOTIONAL = notional_;
FLASH_LENDER = flashLender_;
owner = msg.sender;
emit OwnershipTransferred(address(0), owner);
}
function enableCurrencies(uint16[] calldata currencies) external onlyOwner {
for (uint256 i; i < currencies.length; i++) {
(Token memory assetToken, Token memory underlyingToken) = NOTIONAL.getCurrency(currencies[i]);
IERC20(assetToken.tokenAddress).checkApprove(address(NOTIONAL), type(uint256).max);
if (underlyingToken.tokenAddress == Constants.ETH_ADDRESS) {
IERC20(address(Deployments.WETH)).checkApprove(address(FLASH_LENDER), type(uint256).max);
underlyingToAsset[address(Deployments.WETH)] = assetToken.tokenAddress;
} else {
IERC20(underlyingToken.tokenAddress).checkApprove(address(FLASH_LENDER), type(uint256).max);
IERC20(underlyingToken.tokenAddress).checkApprove(assetToken.tokenAddress, type(uint256).max);
underlyingToAsset[underlyingToken.tokenAddress] = assetToken.tokenAddress;
}
}
}
function estimateProfit(
address asset,
uint256 amount,
LiquidationParams calldata params
) external onlyOwner returns (uint256) {
uint256 balance = IERC20(asset).balanceOf(address(this));
_flashLiquidate(asset, amount, false, params);
return IERC20(asset).balanceOf(address(this)) - balance;
}
function flashLiquidate(
address asset,
uint256 amount,
LiquidationParams calldata params
) external {
_flashLiquidate(asset, amount, true, params);
}
function _flashLiquidate(
address asset,
uint256 amount,
bool withdraw,
LiquidationParams calldata params
) internal virtual;
function handleLiquidation(uint256 fee, bool repay, bytes memory data) internal {
require(msg.sender == address(FLASH_LENDER));
(
address asset,
uint256 amount,
bool withdraw,
LiquidationParams memory params
) = abi.decode(data, (address, uint256, bool, LiquidationParams));
address assetToken = underlyingToAsset[asset];
if (params.currencyId == Constants.ETH_CURRENCY_ID) {
Deployments.WETH.withdraw(amount);
CEtherInterface(assetToken).mint{value: amount}();
} else {
CErc20Interface(assetToken).mint(amount);
}
{
(
,
,
int256 maxLiquidatorDepositAssetCash,
) = NOTIONAL.getVaultAccountCollateralRatio(params.account, params.vault);
require(maxLiquidatorDepositAssetCash > 0);
if (params.useVaultDeleverage) {
IStrategyVault(params.vault).deleverageAccount(
params.account,
params.vault,
address(this),
uint256(maxLiquidatorDepositAssetCash),
false,
params.redeemData
);
} else {
NOTIONAL.deleverageAccount(
params.account,
params.vault,
address(this),
uint256(maxLiquidatorDepositAssetCash),
false,
params.redeemData
);
}
}
{
uint256 balance = IERC20(assetToken).balanceOf(address(this));
if (balance > 0) {
CErc20Interface(assetToken).redeem(balance);
if (params.currencyId == Constants.ETH_CURRENCY_ID) {
_wrapETH();
}
}
}
if (withdraw) {
_withdrawToOwner(asset, IERC20(asset).balanceOf(address(this)) - amount - fee);
}
if (repay) {
IERC20(asset).transfer(msg.sender, amount + fee);
}
}
function _withdrawToOwner(address token, uint256 amount) private {
if (amount == type(uint256).max) {
amount = IERC20(token).balanceOf(address(this));
}
if (amount > 0) {
IERC20(token).checkTransfer(owner, amount);
}
}
function _wrapETH() private {
Deployments.WETH.deposit{value: address(this).balance}();
}
function withdrawToOwner(address token, uint256 amount) external onlyOwner {
_withdrawToOwner(token, amount);
}
function wrapETH() external onlyOwner {
_wrapETH();
}
receive() external payable {}
}
文件 13 的 37:IBalancerVault.sol
pragma solidity >=0.7.6;
interface IAsset {
}
interface IBalancerVault {
enum PoolSpecialization {
GENERAL,
MINIMAL_SWAP_INFO,
TWO_TOKEN
}
enum JoinKind {
INIT,
EXACT_TOKENS_IN_FOR_BPT_OUT,
TOKEN_IN_FOR_EXACT_BPT_OUT,
ALL_TOKENS_IN_FOR_EXACT_BPT_OUT
}
enum ExitKind {
EXACT_BPT_IN_FOR_ONE_TOKEN_OUT,
EXACT_BPT_IN_FOR_TOKENS_OUT,
BPT_IN_FOR_EXACT_TOKENS_OUT,
MANAGEMENT_FEE_TOKENS_OUT
}
enum UserBalanceOpKind { DEPOSIT_INTERNAL, WITHDRAW_INTERNAL, TRANSFER_INTERNAL, TRANSFER_EXTERNAL }
function getPool(bytes32 poolId)
external
view
returns (address, PoolSpecialization);
function joinPool(
bytes32 poolId,
address sender,
address recipient,
JoinPoolRequest memory request
) external payable;
struct JoinPoolRequest {
IAsset[] assets;
uint256[] maxAmountsIn;
bytes userData;
bool fromInternalBalance;
}
function exitPool(
bytes32 poolId,
address sender,
address payable recipient,
ExitPoolRequest memory request
) external;
struct ExitPoolRequest {
IAsset[] assets;
uint256[] minAmountsOut;
bytes userData;
bool toInternalBalance;
}
enum SwapKind {
GIVEN_IN,
GIVEN_OUT
}
struct SingleSwap {
bytes32 poolId;
SwapKind kind;
IAsset assetIn;
IAsset assetOut;
uint256 amount;
bytes userData;
}
struct FundManagement {
address sender;
bool fromInternalBalance;
address payable recipient;
bool toInternalBalance;
}
function swap(
SingleSwap memory singleSwap,
FundManagement memory funds,
uint256 limit,
uint256 deadline
) external payable returns (uint256);
struct BatchSwapStep {
bytes32 poolId;
uint256 assetInIndex;
uint256 assetOutIndex;
uint256 amount;
bytes userData;
}
function batchSwap(
SwapKind kind,
BatchSwapStep[] memory swaps,
IAsset[] memory assets,
FundManagement memory funds,
int256[] memory limits,
uint256 deadline
) external payable returns (int256[] memory);
function getPoolTokens(bytes32 poolId)
external
view
returns (
address[] memory tokens,
uint256[] memory balances,
uint256 lastChangeBlock
);
function flashLoan(
address recipient,
address[] calldata tokens,
uint256[] calldata amounts,
bytes calldata userData
) external;
struct UserBalanceOp {
UserBalanceOpKind kind;
IAsset asset;
uint256 amount;
address sender;
address payable recipient;
}
function manageUserBalance(UserBalanceOp[] memory ops) external payable;
}
文件 14 的 37:ICurveRegistry.sol
pragma solidity >=0.7.6;
interface ICurveRegistry {
function find_pool_for_coins(address _from, address _to)
external
view
returns (address);
}
文件 15 的 37:ICurveRouter.sol
pragma solidity >=0.7.6;
interface ICurveRouter {
function exchange(
uint256 _amount,
address[6] calldata _route,
uint256[8] calldata _indices,
uint256 _min_received
) external payable;
function get_exchange_routing(
address _initial,
address _target,
uint256 _amount
) external view returns (
address[6] memory route,
uint256[8] memory indexes,
uint256 expectedOutputAmount
);
function can_route(address _initial, address _target) external view returns (bool);
}
文件 16 的 37:IEIP20NonStandard.sol
pragma solidity >=0.7.6;
interface IEIP20NonStandard {
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256 balance);
function transfer(address dst, uint256 amount) external;
function transferFrom(address src, address dst, uint256 amount) external;
function approve(address spender, uint256 amount) external;
function allowance(address owner, address spender) external view returns (uint256 remaining);
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
}
文件 17 的 37:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
文件 18 的 37:IFlashLender.sol
pragma solidity >=0.7.6;
interface IFlashLender {
function flashLoan(
address receiverAddress,
address[] calldata assets,
uint256[] calldata amounts,
uint256[] calldata modes,
address onBehalfOf,
bytes calldata params,
uint16 referralCode
) external;
}
文件 19 的 37:IFlashLoanReceiver.sol
pragma solidity >=0.7.6;
interface IFlashLoanReceiver {
function executeOperation(
address[] calldata assets,
uint256[] calldata amounts,
uint256[] calldata premiums,
address initiator,
bytes calldata params
) external returns (bool);
}
文件 20 的 37:ILendingPool.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
struct LendingPoolStorage {
ILendingPool lendingPool;
}
interface ILendingPool {
function deposit(
address asset,
uint256 amount,
address onBehalfOf,
uint16 referralCode
) external;
function withdraw(
address asset,
uint256 amount,
address to
) external returns (uint256);
function getReserveNormalizedIncome(address asset) external view returns (uint256);
function getReserveData(address asset) external view returns (ReserveData memory);
struct ReserveData {
ReserveConfigurationMap configuration;
uint128 liquidityIndex;
uint128 variableBorrowIndex;
uint128 currentLiquidityRate;
uint128 currentVariableBorrowRate;
uint128 currentStableBorrowRate;
uint40 lastUpdateTimestamp;
address aTokenAddress;
address stableDebtTokenAddress;
address variableDebtTokenAddress;
address interestRateStrategyAddress;
uint8 id;
}
struct ReserveConfigurationMap {
uint256 data;
}
struct UserConfigurationMap {
uint256 data;
}
enum InterestRateMode {NONE, STABLE, VARIABLE}
}
文件 21 的 37:INTokenAction.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
interface INTokenAction {
event nTokenApproveAll(address indexed owner, address indexed spender, uint256 amount);
function nTokenTotalSupply(address nTokenAddress) external view returns (uint256);
function nTokenTransferAllowance(
uint16 currencyId,
address owner,
address spender
) external view returns (uint256);
function nTokenBalanceOf(uint16 currencyId, address account) external view returns (uint256);
function nTokenTransferApprove(
uint16 currencyId,
address owner,
address spender,
uint256 amount
) external returns (bool);
function nTokenTransfer(
uint16 currencyId,
address from,
address to,
uint256 amount
) external returns (bool);
function nTokenTransferFrom(
uint16 currencyId,
address spender,
address from,
address to,
uint256 amount
) external returns (bool);
function nTokenTransferApproveAll(address spender, uint256 amount) external returns (bool);
function nTokenClaimIncentives() external returns (uint256);
function nTokenPresentValueAssetDenominated(uint16 currencyId) external view returns (int256);
function nTokenPresentValueUnderlyingDenominated(uint16 currencyId)
external
view
returns (int256);
function nTokenPresentValueUnderlyingExternal(uint16 currencyId)
external
view
returns (uint256);
function nTokenRedeemViaProxy(uint16 currencyId, uint256 shares, address receiver, address owner)
external
returns (uint256);
function nTokenMintViaProxy(uint16 currencyId, uint256 assets, address receiver)
external payable returns (uint256);
}
文件 22 的 37:IRewarder.sol
pragma solidity >=0.7.6;
interface IRewarder {
function claimRewards(
address account,
uint16 currencyId,
uint256 nTokenBalanceBefore,
uint256 nTokenBalanceAfter,
int256 netNTokenSupplyChange,
uint256 NOTETokensClaimed
) external;
}
文件 23 的 37:IStrategyVault.sol
pragma solidity >=0.7.6;
interface IStrategyVault {
struct StrategyVaultRoles {
bytes32 normalSettlement;
bytes32 emergencySettlement;
bytes32 postMaturitySettlement;
bytes32 rewardReinvestment;
}
function decimals() external view returns (uint8);
function name() external view returns (string memory);
function strategy() external view returns (bytes4 strategyId);
function depositFromNotional(
address account,
uint256 depositAmount,
uint256 maturity,
bytes calldata data
) external payable returns (uint256 strategyTokensMinted);
function redeemFromNotional(
address account,
address receiver,
uint256 strategyTokens,
uint256 maturity,
uint256 underlyingToRepayDebt,
bytes calldata data
) external returns (uint256 transferToReceiver);
function convertStrategyToUnderlying(
address account,
uint256 strategyTokens,
uint256 maturity
) external view returns (int256 underlyingValue);
function repaySecondaryBorrowCallback(
address token,
uint256 underlyingRequired,
bytes calldata data
) external returns (bytes memory returnData);
function deleverageAccount(
address account,
address vault,
address liquidator,
uint256 depositAmountExternal,
bool transferSharesToLiquidator,
bytes calldata redeemData
) external returns (uint256 profitFromLiquidation);
}
文件 24 的 37:ISwapRouter.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import './IUniswapV3SwapCallback.sol';
interface ISwapRouter is IUniswapV3SwapCallback {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
文件 25 的 37:IUniV2Router2.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
interface IUniV2Router2 {
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
}
文件 26 的 37:IUniswapV3SwapCallback.sol
pragma solidity >=0.7.6;
interface IUniswapV3SwapCallback {
function uniswapV3SwapCallback(
int256 amount0Delta,
int256 amount1Delta,
bytes calldata data
) external;
}
文件 27 的 37:IVaultController.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import {
VaultConfigStorage,
VaultConfig,
VaultState,
VaultAccount
} from "../../contracts/global/Types.sol";
interface IVaultAction {
event VaultUpdated(address indexed vault, bool enabled, uint80 maxPrimaryBorrowCapacity);
event VaultPauseStatus(address indexed vault, bool enabled);
event VaultDeleverageStatus(address indexed vaultAddress, bool disableDeleverage);
event VaultUpdateSecondaryBorrowCapacity(address indexed vault, uint16 indexed currencyId, uint80 maxSecondaryBorrowCapacity);
event VaultShortfall(address indexed vault, uint16 indexed currencyId, uint256 indexed maturity, int256 shortfall);
event ProtocolInsolvency(address indexed vault, uint16 indexed currencyId, uint256 indexed maturity, int256 shortfall);
event VaultFeeAccrued(address indexed vault, uint16 indexed currencyId, uint256 indexed maturity, int256 reserveFee, int256 nTokenFee);
event VaultBorrowCapacityChange(address indexed vault, uint16 indexed currencyId, uint256 totalUsedBorrowCapacity);
event VaultSecondaryBorrow(
address indexed vault,
address indexed account,
uint16 indexed currencyId,
uint256 maturity,
uint256 debtSharesMinted,
uint256 fCashBorrowed
);
event VaultRepaySecondaryBorrow(
address indexed vault,
address indexed account,
uint16 indexed currencyId,
uint256 maturity,
uint256 debtSharesRepaid,
uint256 fCashLent
);
event VaultSecondaryBorrowSnapshot(
address indexed vault,
uint16 indexed currencyId,
uint256 indexed maturity,
int256 totalfCashBorrowedInPrimarySnapshot,
int256 exchangeRate
);
event VaultSettledAssetsRemaining(
address indexed vault,
uint256 indexed maturity,
int256 remainingAssetCash,
uint256 remainingStrategyTokens
);
event VaultStateUpdate(
address indexed vault,
uint256 indexed maturity,
int256 totalfCash,
uint256 totalAssetCash,
uint256 totalStrategyTokens,
uint256 totalVaultShares
);
event VaultSettled(
address indexed vault,
uint256 indexed maturity,
int256 totalfCash,
uint256 totalAssetCash,
uint256 totalStrategyTokens,
uint256 totalVaultShares,
int256 strategyTokenValue
);
event VaultRedeemStrategyToken(
address indexed vault,
uint256 indexed maturity,
int256 assetCashReceived,
uint256 strategyTokensRedeemed
);
event VaultMintStrategyToken(
address indexed vault,
uint256 indexed maturity,
uint256 assetCashDeposited,
uint256 strategyTokensMinted
);
function updateVault(
address vaultAddress,
VaultConfigStorage calldata vaultConfig,
uint80 maxPrimaryBorrowCapacity
) external;
function setVaultPauseStatus(
address vaultAddress,
bool enable
) external;
function setVaultDeleverageStatus(
address vaultAddress,
bool disableDeleverage
) external;
function setMaxBorrowCapacity(
address vaultAddress,
uint80 maxVaultBorrowCapacity
) external;
function reduceMaxBorrowCapacity(
address vaultAddress,
uint80 maxVaultBorrowCapacity,
uint256 maturity,
uint256 strategyTokensToRedeem,
bytes calldata vaultData
) external;
function updateSecondaryBorrowCapacity(
address vaultAddress,
uint16 secondaryCurrencyId,
uint80 maxBorrowCapacity
) external;
function depositVaultCashToStrategyTokens(
uint256 maturity,
uint256 assetCashToDepositExternal,
bytes calldata vaultData
) external;
function redeemStrategyTokensToCash(
uint256 maturity,
uint256 strategyTokensToRedeem,
bytes calldata vaultData
) external returns (
int256 assetCashRequiredToSettle,
int256 underlyingCashRequiredToSettle
);
function borrowSecondaryCurrencyToVault(
address account,
uint256 maturity,
uint256[2] calldata fCashToBorrow,
uint32[2] calldata maxBorrowRate,
uint32[2] calldata minRollLendRate
) external returns (uint256[2] memory underlyingTokensTransferred);
function repaySecondaryCurrencyFromVault(
address account,
uint16 currencyId,
uint256 maturity,
uint256 fCashToRepay,
uint32 slippageLimit,
bytes calldata callbackData
) external returns (bytes memory returnData);
function initiateSecondaryBorrowSettlement(uint256 maturity)
external returns (uint256[2] memory secondaryBorrowSnapshot);
function settleVault(address vault, uint256 maturity) external;
function getVaultConfig(address vault) external view returns (VaultConfig memory vaultConfig);
function getBorrowCapacity(address vault, uint16 currencyId)
external view returns (uint256 totalUsedBorrowCapacity, uint256 maxBorrowCapacity);
function getSecondaryBorrow(address vault, uint16 currencyId, uint256 maturity)
external view returns (
uint256 totalfCashBorrowed,
uint256 totalAccountDebtShares,
uint256 totalfCashBorrowedInPrimarySnapshot
);
function getVaultState(address vault, uint256 maturity) external view returns (VaultState memory vaultState);
function getCashRequiredToSettle(
address vault,
uint256 maturity
) external view returns (
int256 assetCashRequiredToSettle,
int256 underlyingCashRequiredToSettle
);
}
interface IVaultAccountAction {
event VaultEnterPosition(
address indexed vault,
address indexed account,
uint256 indexed maturity,
uint256 fCashBorrowed
);
event VaultRollPosition(
address indexed vault,
address indexed account,
uint256 indexed newMaturity,
uint256 fCashBorrowed
);
event VaultExitPostMaturity(
address indexed vault,
address indexed account,
uint256 indexed maturity,
uint256 underlyingToReceiver
);
event VaultExitPreMaturity(
address indexed vault,
address indexed account,
uint256 indexed maturity,
uint256 fCashToLend,
uint256 vaultSharesToRedeem,
uint256 underlyingToReceiver
);
event VaultDeleverageAccount(
address indexed vault,
address indexed account,
uint256 vaultSharesToLiquidator,
int256 fCashRepaid
);
event VaultLiquidatorProfit(
address indexed vault,
address indexed account,
address indexed liquidator,
uint256 vaultSharesToLiquidator,
bool transferSharesToLiquidator
);
event VaultEnterMaturity(
address indexed vault,
uint256 indexed maturity,
address indexed account,
uint256 underlyingTokensDeposited,
uint256 cashTransferToVault,
uint256 strategyTokenDeposited,
uint256 vaultSharesMinted
);
function enterVault(
address account,
address vault,
uint256 depositAmountExternal,
uint256 maturity,
uint256 fCash,
uint32 maxBorrowRate,
bytes calldata vaultData
) external payable returns (uint256 strategyTokensAdded);
function rollVaultPosition(
address account,
address vault,
uint256 fCashToBorrow,
uint256 maturity,
uint256 depositAmountExternal,
uint32 minLendRate,
uint32 maxBorrowRate,
bytes calldata enterVaultData
) external payable returns (uint256 strategyTokensAdded);
function exitVault(
address account,
address vault,
address receiver,
uint256 vaultSharesToRedeem,
uint256 fCashToLend,
uint32 minLendRate,
bytes calldata exitVaultData
) external payable returns (uint256 underlyingToReceiver);
function deleverageAccount(
address account,
address vault,
address liquidator,
uint256 depositAmountExternal,
bool transferSharesToLiquidator,
bytes calldata redeemData
) external returns (uint256 profitFromLiquidation);
function getVaultAccount(address account, address vault) external view returns (VaultAccount memory);
function getVaultAccountDebtShares(address account, address vault) external view returns (
uint256 debtSharesMaturity,
uint256[2] memory accountDebtShares,
uint256 accountStrategyTokens
);
function getVaultAccountCollateralRatio(address account, address vault) external view returns (
int256 collateralRatio,
int256 minCollateralRatio,
int256 maxLiquidatorDepositAssetCash,
uint256 vaultSharesToLiquidator
);
}
interface IVaultController is IVaultAccountAction, IVaultAction {}
文件 28 的 37:IWstETH.sol
pragma solidity >=0.7.6;
import {IERC20} from "./IERC20.sol";
interface IWstETH is IERC20 {
function unwrap(uint256 _wstETHAmount) external returns (uint256);
function wrap(uint256 _stETHAmount) external returns (uint256);
function getStETHByWstETH(uint256 _wstETHAmount) external view returns (uint256);
function stEthPerToken() external view returns (uint256);
function stETH() external view returns (address);
}
文件 29 的 37:NotionalCalculations.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import "../../contracts/global/Types.sol";
interface NotionalCalculations {
function calculateNTokensToMint(uint16 currencyId, uint88 amountToDepositExternalPrecision)
external
view
returns (uint256);
function getfCashAmountGivenCashAmount(
uint16 currencyId,
int88 netCashToAccount,
uint256 marketIndex,
uint256 blockTime
) external view returns (int256);
function getCashAmountGivenfCashAmount(
uint16 currencyId,
int88 fCashAmount,
uint256 marketIndex,
uint256 blockTime
) external view returns (int256, int256);
function nTokenGetClaimableIncentives(address account, uint256 blockTime)
external
view
returns (uint256);
function getPresentfCashValue(
uint16 currencyId,
uint256 maturity,
int256 notional,
uint256 blockTime,
bool riskAdjusted
) external view returns (int256 presentValue);
function getMarketIndex(
uint256 maturity,
uint256 blockTime
) external pure returns (uint8 marketIndex);
function getfCashLendFromDeposit(
uint16 currencyId,
uint256 depositAmountExternal,
uint256 maturity,
uint32 minLendRate,
uint256 blockTime,
bool useUnderlying
) external view returns (
uint88 fCashAmount,
uint8 marketIndex,
bytes32 encodedTrade
);
function getfCashBorrowFromPrincipal(
uint16 currencyId,
uint256 borrowedAmountExternal,
uint256 maturity,
uint32 maxBorrowRate,
uint256 blockTime,
bool useUnderlying
) external view returns (
uint88 fCashDebt,
uint8 marketIndex,
bytes32 encodedTrade
);
function getDepositFromfCashLend(
uint16 currencyId,
uint256 fCashAmount,
uint256 maturity,
uint32 minLendRate,
uint256 blockTime
) external view returns (
uint256 depositAmountUnderlying,
uint256 depositAmountAsset,
uint8 marketIndex,
bytes32 encodedTrade
);
function getPrincipalFromfCashBorrow(
uint16 currencyId,
uint256 fCashBorrow,
uint256 maturity,
uint32 maxBorrowRate,
uint256 blockTime
) external view returns (
uint256 borrowAmountUnderlying,
uint256 borrowAmountAsset,
uint8 marketIndex,
bytes32 encodedTrade
);
function convertCashBalanceToExternal(
uint16 currencyId,
int256 cashBalanceInternal,
bool useUnderlying
) external view returns (int256);
}
文件 30 的 37:NotionalGovernance.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import "../../contracts/global/Types.sol";
import "../../interfaces/chainlink/AggregatorV2V3Interface.sol";
import "../../interfaces/notional/NotionalGovernance.sol";
import "../../interfaces/notional/IRewarder.sol";
import "../../interfaces/aave/ILendingPool.sol";
interface NotionalGovernance {
event ListCurrency(uint16 newCurrencyId);
event UpdateETHRate(uint16 currencyId);
event UpdateAssetRate(uint16 currencyId);
event UpdateCashGroup(uint16 currencyId);
event DeployNToken(uint16 currencyId, address nTokenAddress);
event UpdateDepositParameters(uint16 currencyId);
event UpdateInitializationParameters(uint16 currencyId);
event UpdateIncentiveEmissionRate(uint16 currencyId, uint32 newEmissionRate);
event UpdateTokenCollateralParameters(uint16 currencyId);
event UpdateGlobalTransferOperator(address operator, bool approved);
event UpdateAuthorizedCallbackContract(address operator, bool approved);
event UpdateMaxCollateralBalance(uint16 currencyId, uint72 maxCollateralBalance);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event PauseRouterAndGuardianUpdated(address indexed pauseRouter, address indexed pauseGuardian);
event UpdateSecondaryIncentiveRewarder(uint16 indexed currencyId, address rewarder);
event UpdateLendingPool(address pool);
function transferOwnership(address newOwner, bool direct) external;
function claimOwnership() external;
function upgradeNTokenBeacon(address newImplementation) external;
function setPauseRouterAndGuardian(address pauseRouter_, address pauseGuardian_) external;
function listCurrency(
TokenStorage calldata assetToken,
TokenStorage calldata underlyingToken,
AggregatorV2V3Interface rateOracle,
bool mustInvert,
uint8 buffer,
uint8 haircut,
uint8 liquidationDiscount
) external returns (uint16 currencyId);
function updateMaxCollateralBalance(
uint16 currencyId,
uint72 maxCollateralBalanceInternalPrecision
) external;
function enableCashGroup(
uint16 currencyId,
AssetRateAdapter assetRateOracle,
CashGroupSettings calldata cashGroup,
string calldata underlyingName,
string calldata underlyingSymbol
) external;
function updateDepositParameters(
uint16 currencyId,
uint32[] calldata depositShares,
uint32[] calldata leverageThresholds
) external;
function updateInitializationParameters(
uint16 currencyId,
uint32[] calldata annualizedAnchorRates,
uint32[] calldata proportions
) external;
function updateIncentiveEmissionRate(uint16 currencyId, uint32 newEmissionRate) external;
function updateTokenCollateralParameters(
uint16 currencyId,
uint8 residualPurchaseIncentive10BPS,
uint8 pvHaircutPercentage,
uint8 residualPurchaseTimeBufferHours,
uint8 cashWithholdingBuffer10BPS,
uint8 liquidationHaircutPercentage
) external;
function updateCashGroup(uint16 currencyId, CashGroupSettings calldata cashGroup) external;
function updateAssetRate(uint16 currencyId, AssetRateAdapter rateOracle) external;
function updateETHRate(
uint16 currencyId,
AggregatorV2V3Interface rateOracle,
bool mustInvert,
uint8 buffer,
uint8 haircut,
uint8 liquidationDiscount
) external;
function updateGlobalTransferOperator(address operator, bool approved) external;
function updateAuthorizedCallbackContract(address operator, bool approved) external;
function setLendingPool(ILendingPool pool) external;
function setSecondaryIncentiveRewarder(uint16 currencyId, IRewarder rewarder) external;
}
文件 31 的 37:NotionalProxy.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import "../../contracts/global/Types.sol";
import "./INTokenAction.sol";
import "./nERC1155Interface.sol";
import "./NotionalGovernance.sol";
import "./NotionalCalculations.sol";
import "./NotionalViews.sol";
import "./NotionalTreasury.sol";
import {IVaultController} from "./IVaultController.sol";
interface NotionalProxy is
INTokenAction,
nERC1155Interface,
NotionalGovernance,
NotionalTreasury,
NotionalCalculations,
NotionalViews,
IVaultController
{
event CashBalanceChange(
address indexed account,
uint16 indexed currencyId,
int256 netCashChange
);
event nTokenSupplyChange(
address indexed account,
uint16 indexed currencyId,
int256 tokenSupplyChange
);
event MarketsInitialized(uint16 currencyId);
event SweepCashIntoMarkets(uint16 currencyId, int256 cashIntoMarkets);
event SettledCashDebt(
address indexed settledAccount,
uint16 indexed currencyId,
address indexed settler,
int256 amountToSettleAsset,
int256 fCashAmount
);
event nTokenResidualPurchase(
uint16 indexed currencyId,
uint40 indexed maturity,
address indexed purchaser,
int256 fCashAmountToPurchase,
int256 netAssetCashNToken
);
event LendBorrowTrade(
address indexed account,
uint16 indexed currencyId,
uint40 maturity,
int256 netAssetCash,
int256 netfCash
);
event AddRemoveLiquidity(
address indexed account,
uint16 indexed currencyId,
uint40 maturity,
int256 netAssetCash,
int256 netfCash,
int256 netLiquidityTokens
);
event IncentivesMigrated(
uint16 currencyId,
uint256 migrationEmissionRate,
uint256 finalIntegralTotalSupply,
uint256 migrationTime
);
event ReserveFeeAccrued(uint16 indexed currencyId, int256 fee);
event AccountContextUpdate(address indexed account);
event AccountSettled(address indexed account);
event SetSettlementRate(uint256 indexed currencyId, uint256 indexed maturity, uint128 rate);
event LiquidateLocalCurrency(
address indexed liquidated,
address indexed liquidator,
uint16 localCurrencyId,
int256 netLocalFromLiquidator
);
event LiquidateCollateralCurrency(
address indexed liquidated,
address indexed liquidator,
uint16 localCurrencyId,
uint16 collateralCurrencyId,
int256 netLocalFromLiquidator,
int256 netCollateralTransfer,
int256 netNTokenTransfer
);
event LiquidatefCashEvent(
address indexed liquidated,
address indexed liquidator,
uint16 localCurrencyId,
uint16 fCashCurrency,
int256 netLocalFromLiquidator,
uint256[] fCashMaturities,
int256[] fCashNotionalTransfer
);
function upgradeTo(address newImplementation) external;
function upgradeToAndCall(address newImplementation, bytes memory data) external payable;
function getImplementation() external view returns (address);
function owner() external view returns (address);
function pauseRouter() external view returns (address);
function pauseGuardian() external view returns (address);
function initializeMarkets(uint16 currencyId, bool isFirstInit) external;
function sweepCashIntoMarkets(uint16 currencyId) external;
function nTokenRedeem(
address redeemer,
uint16 currencyId,
uint96 tokensToRedeem_,
bool sellTokenAssets,
bool acceptResidualAssets
) external returns (int256);
function enableBitmapCurrency(uint16 currencyId) external;
function settleAccount(address account) external;
function depositUnderlyingToken(
address account,
uint16 currencyId,
uint256 amountExternalPrecision
) external payable returns (uint256);
function depositAssetToken(
address account,
uint16 currencyId,
uint256 amountExternalPrecision
) external returns (uint256);
function withdraw(
uint16 currencyId,
uint88 amountInternalPrecision,
bool redeemToUnderlying
) external returns (uint256);
function batchBalanceAction(address account, BalanceAction[] calldata actions) external payable;
function batchBalanceAndTradeAction(address account, BalanceActionWithTrades[] calldata actions)
external
payable;
function batchBalanceAndTradeActionWithCallback(
address account,
BalanceActionWithTrades[] calldata actions,
bytes calldata callbackData
) external payable;
function batchLend(address account, BatchLend[] calldata actions) external;
function calculateLocalCurrencyLiquidation(
address liquidateAccount,
uint16 localCurrency,
uint96 maxNTokenLiquidation
) external returns (int256, int256);
function liquidateLocalCurrency(
address liquidateAccount,
uint16 localCurrency,
uint96 maxNTokenLiquidation
) external returns (int256, int256);
function calculateCollateralCurrencyLiquidation(
address liquidateAccount,
uint16 localCurrency,
uint16 collateralCurrency,
uint128 maxCollateralLiquidation,
uint96 maxNTokenLiquidation
)
external
returns (
int256,
int256,
int256
);
function liquidateCollateralCurrency(
address liquidateAccount,
uint16 localCurrency,
uint16 collateralCurrency,
uint128 maxCollateralLiquidation,
uint96 maxNTokenLiquidation,
bool withdrawCollateral,
bool redeemToUnderlying
)
external
returns (
int256,
int256,
int256
);
function calculatefCashLocalLiquidation(
address liquidateAccount,
uint16 localCurrency,
uint256[] calldata fCashMaturities,
uint256[] calldata maxfCashLiquidateAmounts
) external returns (int256[] memory, int256);
function liquidatefCashLocal(
address liquidateAccount,
uint16 localCurrency,
uint256[] calldata fCashMaturities,
uint256[] calldata maxfCashLiquidateAmounts
) external returns (int256[] memory, int256);
function calculatefCashCrossCurrencyLiquidation(
address liquidateAccount,
uint16 localCurrency,
uint16 fCashCurrency,
uint256[] calldata fCashMaturities,
uint256[] calldata maxfCashLiquidateAmounts
) external returns (int256[] memory, int256);
function liquidatefCashCrossCurrency(
address liquidateAccount,
uint16 localCurrency,
uint16 fCashCurrency,
uint256[] calldata fCashMaturities,
uint256[] calldata maxfCashLiquidateAmounts
) external returns (int256[] memory, int256);
}
文件 32 的 37:NotionalTreasury.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
interface NotionalTreasury {
event ReserveBalanceUpdated(uint16 indexed currencyId, int256 newBalance);
event ExcessReserveBalanceHarvested(uint16 indexed currencyId, int256 harvestAmount);
event TreasuryManagerChanged(address indexed previousManager, address indexed newManager);
event ReserveBufferUpdated(uint16 currencyId, uint256 bufferAmount);
function claimCOMPAndTransfer(address[] calldata ctokens) external returns (uint256);
function transferReserveToTreasury(uint16[] calldata currencies)
external
returns (uint256[] memory);
function setTreasuryManager(address manager) external;
function setReserveBuffer(uint16 currencyId, uint256 amount) external;
function setReserveCashBalance(uint16 currencyId, int256 reserveBalance) external;
}
文件 33 的 37:NotionalViews.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import "../../contracts/global/Types.sol";
interface NotionalViews {
function getMaxCurrencyId() external view returns (uint16);
function getCurrencyId(address tokenAddress) external view returns (uint16 currencyId);
function getCurrency(uint16 currencyId)
external
view
returns (Token memory assetToken, Token memory underlyingToken);
function getRateStorage(uint16 currencyId)
external
view
returns (ETHRateStorage memory ethRate, AssetRateStorage memory assetRate);
function getCurrencyAndRates(uint16 currencyId)
external
view
returns (
Token memory assetToken,
Token memory underlyingToken,
ETHRate memory ethRate,
AssetRateParameters memory assetRate
);
function getCashGroup(uint16 currencyId) external view returns (CashGroupSettings memory);
function getCashGroupAndAssetRate(uint16 currencyId)
external
view
returns (CashGroupSettings memory cashGroup, AssetRateParameters memory assetRate);
function getInitializationParameters(uint16 currencyId)
external
view
returns (int256[] memory annualizedAnchorRates, int256[] memory proportions);
function getDepositParameters(uint16 currencyId)
external
view
returns (int256[] memory depositShares, int256[] memory leverageThresholds);
function nTokenAddress(uint16 currencyId) external view returns (address);
function getNoteToken() external view returns (address);
function getOwnershipStatus() external view returns (address owner, address pendingOwner);
function getGlobalTransferOperatorStatus(address operator)
external
view
returns (bool isAuthorized);
function getAuthorizedCallbackContractStatus(address callback)
external
view
returns (bool isAuthorized);
function getSecondaryIncentiveRewarder(uint16 currencyId)
external
view
returns (address incentiveRewarder);
function getSettlementRate(uint16 currencyId, uint40 maturity)
external
view
returns (AssetRateParameters memory);
function getMarket(
uint16 currencyId,
uint256 maturity,
uint256 settlementDate
) external view returns (MarketParameters memory);
function getActiveMarkets(uint16 currencyId) external view returns (MarketParameters[] memory);
function getActiveMarketsAtBlockTime(uint16 currencyId, uint32 blockTime)
external
view
returns (MarketParameters[] memory);
function getReserveBalance(uint16 currencyId) external view returns (int256 reserveBalance);
function getNTokenPortfolio(address tokenAddress)
external
view
returns (PortfolioAsset[] memory liquidityTokens, PortfolioAsset[] memory netfCashAssets);
function getNTokenAccount(address tokenAddress)
external
view
returns (
uint16 currencyId,
uint256 totalSupply,
uint256 incentiveAnnualEmissionRate,
uint256 lastInitializedTime,
bytes5 nTokenParameters,
int256 cashBalance,
uint256 accumulatedNOTEPerNToken,
uint256 lastAccumulatedTime
);
function getAccount(address account)
external
view
returns (
AccountContext memory accountContext,
AccountBalance[] memory accountBalances,
PortfolioAsset[] memory portfolio
);
function getAccountContext(address account) external view returns (AccountContext memory);
function getAccountBalance(uint16 currencyId, address account)
external
view
returns (
int256 cashBalance,
int256 nTokenBalance,
uint256 lastClaimTime
);
function getAccountPortfolio(address account) external view returns (PortfolioAsset[] memory);
function getfCashNotional(
address account,
uint16 currencyId,
uint256 maturity
) external view returns (int256);
function getAssetsBitmap(address account, uint16 currencyId) external view returns (bytes32);
function getFreeCollateral(address account) external view returns (int256, int256[] memory);
function getTreasuryManager() external view returns (address);
function getReserveBuffer(uint16 currencyId) external view returns (uint256);
function getLendingPool() external view returns (address);
}
文件 34 的 37:TokenUtils.sol
pragma solidity 0.8.17;
import {IERC20} from "../../interfaces/IERC20.sol";
import {IEIP20NonStandard} from "../../interfaces/IEIP20NonStandard.sol";
import {Deployments} from "../global/Deployments.sol";
library TokenUtils {
error ERC20Error();
function tokenBalance(address token) internal view returns (uint256) {
return
token == Deployments.ETH_ADDRESS
? address(this).balance
: IERC20(token).balanceOf(address(this));
}
function checkApprove(IERC20 token, address spender, uint256 amount) internal {
if (address(token) == address(0)) return;
IEIP20NonStandard(address(token)).approve(spender, 0);
_checkReturnCode();
if (amount > 0) {
IEIP20NonStandard(address(token)).approve(spender, amount);
_checkReturnCode();
}
}
function checkRevoke(IERC20 token, address spender) internal {
if (address(token) == address(0)) return;
IEIP20NonStandard(address(token)).approve(spender, 0);
_checkReturnCode();
}
function checkTransfer(IERC20 token, address receiver, uint256 amount) internal {
IEIP20NonStandard(address(token)).transfer(receiver, amount);
_checkReturnCode();
}
function _checkReturnCode() private pure {
bool success;
uint256[1] memory result;
assembly {
switch returndatasize()
case 0 {
success := 1
}
case 32 {
returndatacopy(result, 0, 32)
success := mload(result)
}
default {
revert(0, 0)
}
}
if (!success) revert ERC20Error();
}
}
文件 35 的 37:Types.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import "../../interfaces/chainlink/AggregatorV2V3Interface.sol";
import "../../interfaces/notional/AssetRateAdapter.sol";
enum TokenType {
UnderlyingToken,
cToken,
cETH,
Ether,
NonMintable,
aToken
}
enum TradeActionType {
Lend,
Borrow,
AddLiquidity,
RemoveLiquidity,
PurchaseNTokenResidual,
SettleCashDebt
}
enum DepositActionType {
None,
DepositAsset,
DepositUnderlying,
DepositAssetAndMintNToken,
DepositUnderlyingAndMintNToken,
RedeemNToken,
ConvertCashToNToken
}
enum AssetStorageState {
NoChange,
Update,
Delete,
RevertIfStored
}
struct BatchLend {
uint16 currencyId;
bool depositUnderlying;
bytes32[] trades;
}
struct BalanceAction {
DepositActionType actionType;
uint16 currencyId;
uint256 depositActionAmount;
uint256 withdrawAmountInternalPrecision;
bool withdrawEntireCashBalance;
bool redeemToUnderlying;
}
struct BalanceActionWithTrades {
DepositActionType actionType;
uint16 currencyId;
uint256 depositActionAmount;
uint256 withdrawAmountInternalPrecision;
bool withdrawEntireCashBalance;
bool redeemToUnderlying;
bytes32[] trades;
}
struct SettleAmount {
uint256 currencyId;
int256 netCashChange;
}
struct Token {
address tokenAddress;
bool hasTransferFee;
int256 decimals;
TokenType tokenType;
uint256 maxCollateralBalance;
}
struct nTokenPortfolio {
CashGroupParameters cashGroup;
PortfolioState portfolioState;
int256 totalSupply;
int256 cashBalance;
uint256 lastInitializedTime;
bytes6 parameters;
address tokenAddress;
}
struct LiquidationFactors {
address account;
int256 netETHValue;
int256 localAssetAvailable;
int256 collateralAssetAvailable;
int256 nTokenHaircutAssetValue;
bytes6 nTokenParameters;
ETHRate localETHRate;
ETHRate collateralETHRate;
AssetRateParameters localAssetRate;
CashGroupParameters collateralCashGroup;
bool isCalculation;
}
struct PortfolioState {
PortfolioAsset[] storedAssets;
PortfolioAsset[] newAssets;
uint256 lastNewAssetIndex;
uint256 storedAssetLength;
}
struct ETHRate {
int256 rateDecimals;
int256 rate;
int256 buffer;
int256 haircut;
int256 liquidationDiscount;
}
struct BalanceState {
uint16 currencyId;
int256 storedCashBalance;
int256 storedNTokenBalance;
int256 netCashChange;
int256 netAssetTransferInternalPrecision;
int256 netNTokenTransfer;
int256 netNTokenSupplyChange;
uint256 lastClaimTime;
uint256 accountIncentiveDebt;
}
struct AssetRateParameters {
AssetRateAdapter rateOracle;
int256 rate;
int256 underlyingDecimals;
}
struct CashGroupParameters {
uint16 currencyId;
uint256 maxMarketIndex;
AssetRateParameters assetRate;
bytes32 data;
}
struct PortfolioAsset {
uint256 currencyId;
uint256 maturity;
uint256 assetType;
int256 notional;
uint256 storageSlot;
AssetStorageState storageState;
}
struct MarketParameters {
bytes32 storageSlot;
uint256 maturity;
int256 totalfCash;
int256 totalAssetCash;
int256 totalLiquidity;
uint256 lastImpliedRate;
uint256 oracleRate;
uint256 previousTradeTime;
}
struct TokenStorage {
address tokenAddress;
bool hasTransferFee;
TokenType tokenType;
uint8 decimalPlaces;
uint72 maxCollateralBalance;
}
struct ETHRateStorage {
AggregatorV2V3Interface rateOracle;
uint8 rateDecimalPlaces;
bool mustInvert;
uint8 buffer;
uint8 haircut;
uint8 liquidationDiscount;
}
struct AssetRateStorage {
AssetRateAdapter rateOracle;
uint8 underlyingDecimalPlaces;
}
struct CashGroupSettings {
uint8 maxMarketIndex;
uint8 rateOracleTimeWindow5Min;
uint8 totalFeeBPS;
uint8 reserveFeeShare;
uint8 debtBuffer5BPS;
uint8 fCashHaircut5BPS;
uint8 settlementPenaltyRate5BPS;
uint8 liquidationfCashHaircut5BPS;
uint8 liquidationDebtBuffer5BPS;
uint8[] liquidityTokenHaircuts;
uint8[] rateScalars;
}
struct AccountContext {
uint40 nextSettleTime;
bytes1 hasDebt;
uint8 assetArrayLength;
uint16 bitmapCurrencyId;
bytes18 activeCurrencies;
}
struct nTokenContext {
uint16 currencyId;
uint32 incentiveAnnualEmissionRate;
uint32 lastInitializedTime;
uint8 assetArrayLength;
bytes5 nTokenParameters;
bytes15 _unused;
bool hasSecondaryRewarder;
}
struct BalanceStorage {
uint80 nTokenBalance;
uint32 lastClaimTime;
uint56 accountIncentiveDebt;
int88 cashBalance;
}
struct SettlementRateStorage {
uint40 blockTime;
uint128 settlementRate;
uint8 underlyingDecimalPlaces;
}
struct MarketStorage {
uint80 totalfCash;
uint80 totalAssetCash;
uint32 lastImpliedRate;
uint32 oracleRate;
uint32 previousTradeTime;
uint80 totalLiquidity;
}
struct ifCashStorage {
int128 notional;
}
struct PortfolioAssetStorage {
uint16 currencyId;
uint40 maturity;
uint8 assetType;
int88 notional;
}
struct nTokenTotalSupplyStorage_deprecated {
uint96 totalSupply;
uint128 integralTotalSupply;
uint32 lastSupplyChangeTime;
}
struct nTokenTotalSupplyStorage {
uint96 totalSupply;
uint128 accumulatedNOTEPerNToken;
uint32 lastAccumulatedTime;
}
struct AccountBalance {
uint16 currencyId;
int256 cashBalance;
int256 nTokenBalance;
uint256 lastClaimTime;
uint256 accountIncentiveDebt;
}
struct VaultConfigStorage {
uint16 flags;
uint16 borrowCurrencyId;
uint32 minAccountBorrowSize;
uint16 minCollateralRatioBPS;
uint8 feeRate5BPS;
uint8 liquidationRate;
uint8 reserveFeeShare;
uint8 maxBorrowMarketIndex;
uint16 maxDeleverageCollateralRatioBPS;
uint16[2] secondaryBorrowCurrencies;
uint16 maxRequiredAccountCollateralRatioBPS;
}
struct VaultBorrowCapacityStorage {
uint80 maxBorrowCapacity;
uint80 totalUsedBorrowCapacity;
}
struct VaultSecondaryBorrowStorage {
uint80 totalfCashBorrowed;
uint80 totalAccountDebtShares;
uint80 totalfCashBorrowedInPrimarySnapshot;
bool hasSnapshotBeenSet;
}
struct VaultConfig {
address vault;
uint16 flags;
uint16 borrowCurrencyId;
int256 minAccountBorrowSize;
int256 feeRate;
int256 minCollateralRatio;
int256 liquidationRate;
int256 reserveFeeShare;
uint256 maxBorrowMarketIndex;
int256 maxDeleverageCollateralRatio;
uint16[2] secondaryBorrowCurrencies;
AssetRateParameters assetRate;
int256 maxRequiredAccountCollateralRatio;
}
struct VaultStateStorage {
uint80 totalfCash;
uint80 totalAssetCash;
uint80 totalVaultShares;
bool isSettled;
uint80 totalStrategyTokens;
int80 settlementStrategyTokenValue;
}
struct VaultSettledAssetsStorage {
uint80 remainingStrategyTokens;
int80 remainingAssetCash;
}
struct VaultState {
uint256 maturity;
int256 totalfCash;
bool isSettled;
uint256 totalVaultShares;
uint256 totalAssetCash;
uint256 totalStrategyTokens;
int256 settlementStrategyTokenValue;
}
struct VaultAccountStorage {
uint80 fCash;
uint80 vaultShares;
uint40 maturity;
uint32 lastEntryBlockHeight;
}
struct VaultAccountSecondaryDebtShareStorage {
uint32 maturity;
uint80 accountDebtSharesOne;
uint80 accountDebtSharesTwo;
}
struct VaultAccount {
int256 fCash;
uint256 maturity;
uint256 vaultShares;
address account;
int256 tempCashBalance;
uint256 lastEntryBlockHeight;
}
文件 36 的 37:WETH9.sol
pragma solidity >=0.7.6;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface WETH9 is IERC20 {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
文件 37 的 37:nERC1155Interface.sol
pragma solidity >=0.7.6;
pragma abicoder v2;
import "../../contracts/global/Types.sol";
interface nERC1155Interface {
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 value
);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function supportsInterface(bytes4 interfaceId) external pure returns (bool);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
function signedBalanceOf(address account, uint256 id) external view returns (int256);
function signedBalanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (int256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external payable;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external payable;
function decodeToAssets(uint256[] calldata ids, uint256[] calldata amounts)
external
view
returns (PortfolioAsset[] memory);
function encodeToId(
uint16 currencyId,
uint40 maturity,
uint8 assetType
) external pure returns (uint256 id);
}
{
"compilationTarget": {
"contracts/utils/AaveFlashLiquidator.sol": "AaveFlashLiquidator"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract NotionalProxy","name":"notional_","type":"address"},{"internalType":"address","name":"aave_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20Error","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"NOTIONAL","outputs":[{"internalType":"contract NotionalProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"currencies","type":"uint16[]"}],"name":"enableCurrencies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint16","name":"currencyId","type":"uint16"},{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"bool","name":"useVaultDeleverage","type":"bool"},{"internalType":"bytes","name":"redeemData","type":"bytes"}],"internalType":"struct FlashLiquidatorBase.LiquidationParams","name":"params","type":"tuple"}],"name":"estimateProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint16","name":"currencyId","type":"uint16"},{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"bool","name":"useVaultDeleverage","type":"bool"},{"internalType":"bytes","name":"redeemData","type":"bytes"}],"internalType":"struct FlashLiquidatorBase.LiquidationParams","name":"params","type":"tuple"}],"name":"flashLiquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]