From 94644ac735b22ba7805ff426656c99f2c747ec92 Mon Sep 17 00:00:00 2001 From: domenicodev Date: Mon, 22 Jan 2024 12:08:59 +0100 Subject: [PATCH] feat: Initial setup and price() function implementation --- evm/src/angle/AngleAdapter.sol | 282 +++++++++++++++++++++++++++++++++ evm/src/angle/manifest.yaml | 36 +++++ 2 files changed, 318 insertions(+) create mode 100644 evm/src/angle/AngleAdapter.sol create mode 100644 evm/src/angle/manifest.yaml diff --git a/evm/src/angle/AngleAdapter.sol b/evm/src/angle/AngleAdapter.sol new file mode 100644 index 0000000..b2363a7 --- /dev/null +++ b/evm/src/angle/AngleAdapter.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma experimental ABIEncoderV2; +pragma solidity ^0.8.13; + +import {IERC20, ISwapAdapter} from "src/interfaces/ISwapAdapter.sol"; + +/// @title AngleAdapter +contract AngleAdapter is ISwapAdapter { + + ITransmuter transmuter; + + constructor(ITransmuter _transmuter) { + transmuter = _transmuter; + } + + function price( + bytes32, + IERC20 _sellToken, + IERC20 _buyToken, + uint256[] memory _specifiedAmounts + ) external view override returns (Fraction[] memory _prices) { + _prices = new Fraction[](_specifiedAmounts.length); + address sellTokenAddress = address(_sellToken); + address buyTokenAddress = address(_buyToken); + + for (uint256 i = 0; i < _specifiedAmounts.length; i++) { + _prices[i] = getPriceAt(_specifiedAmounts[i], sellTokenAddress, buyTokenAddress); + } + } + + function swap( + bytes32 poolId, + IERC20 sellToken, + IERC20 buyToken, + OrderSide side, + uint256 specifiedAmount + ) external returns (Trade memory trade) { + revert NotImplemented("TemplateSwapAdapter.swap"); + } + + function getLimits(bytes32, IERC20 sellToken, IERC20 buyToken) + external + returns (uint256[] memory limits) + { + revert NotImplemented("TemplateSwapAdapter.getLimits"); + } + + function getCapabilities(bytes32 poolId, IERC20 sellToken, IERC20 buyToken) + external + returns (Capability[] memory capabilities) + { + revert NotImplemented("TemplateSwapAdapter.getCapabilities"); + } + + function getTokens(bytes32 poolId) + external + returns (IERC20[] memory tokens) + { + revert NotImplemented("TemplateSwapAdapter.getTokens"); + } + + function getPoolIds(uint256 offset, uint256 limit) + external + returns (bytes32[] memory ids) + { + revert NotImplemented("TemplateSwapAdapter.getPoolIds"); + } + + /// @notice Calculates pool prices for specified amounts + /// @param amountIn The amount of the token being sold + /// @param tokenIn The token being sold + /// @param tokenOut The token being bought + /// @return The price as a fraction corresponding to the provided amount. + function getPriceAt(uint256 amountIn, address tokenIn, address tokenOut) + internal + view + returns (Fraction memory) + { + uint256 amountOut = transmuter.quoteIn(amountIn, tokenIn, tokenOut); + return Fraction( + amountOut, + amountIn + ); + } +} + +abstract contract ITransmuter { + struct Tuple6871229 { + address facetAddress; + uint8 action; + bytes4[] functionSelectors; + } + + struct Tuple1236461 { + address facetAddress; + bytes4[] functionSelectors; + } + + struct Tuple3550792 { + uint8 isManaged; + uint8 isMintLive; + uint8 isBurnLive; + uint8 decimals; + uint8 onlyWhitelisted; + uint216 normalizedStables; + uint64[] xFeeMint; + int64[] yFeeMint; + uint64[] xFeeBurn; + int64[] yFeeBurn; + bytes oracleConfig; + bytes whitelistData; + Tuple5479340 managerData; + } + + struct Tuple5479340 { + address[] subCollaterals; + bytes config; + } + + function diamondCut(Tuple6871229[] memory _diamondCut, address _init, bytes memory _calldata) external {} + + function implementation() external view returns (address) {} + + function setDummyImplementation(address _implementation) external {} + + function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_) {} + + function facetAddresses() external view returns (address[] memory facetAddresses_) {} + + function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors) {} + + function facets() external view returns (Tuple1236461[] memory facets_) {} + + function accessControlManager() external view returns (address) {} + + function agToken() external view returns (address) {} + + function getCollateralBurnFees( + address collateral + ) external view returns (uint64[] memory xFeeBurn, int64[] memory yFeeBurn) {} + + function getCollateralDecimals(address collateral) external view returns (uint8) {} + + function getCollateralInfo(address collateral) external view returns (Tuple3550792 memory) {} + + function getCollateralList() external view returns (address[] memory) {} + + function getCollateralMintFees( + address collateral + ) external view returns (uint64[] memory xFeeMint, int64[] memory yFeeMint) {} + + function getCollateralRatio() external view returns (uint64 collatRatio, uint256 stablecoinsIssued) {} + + function getCollateralWhitelistData(address collateral) external view returns (bytes memory) {} + + function getIssuedByCollateral( + address collateral + ) external view returns (uint256 stablecoinsFromCollateral, uint256 stablecoinsIssued) {} + + function getManagerData(address collateral) external view returns (bool, address[] memory, bytes memory) {} + + function getOracle( + address collateral + ) external view returns (uint8 oracleType, uint8 targetType, bytes memory oracleData, bytes memory targetData) {} + + function getOracleValues( + address collateral + ) external view returns (uint256 mint, uint256 burn, uint256 ratio, uint256 minRatio, uint256 redemption) {} + + function getRedemptionFees() + external + view + returns (uint64[] memory xRedemptionCurve, int64[] memory yRedemptionCurve) + {} + + function getTotalIssued() external view returns (uint256) {} + + function isPaused(address collateral, uint8 action) external view returns (bool) {} + + function isTrusted(address sender) external view returns (bool) {} + + function isTrustedSeller(address sender) external view returns (bool) {} + + function isValidSelector(bytes4 selector) external view returns (bool) {} + + function isWhitelistedCollateral(address collateral) external view returns (bool) {} + + function isWhitelistedForCollateral(address collateral, address sender) external returns (bool) {} + + function isWhitelistedForType(uint8 whitelistType, address sender) external view returns (bool) {} + + function sellRewards(uint256 minAmountOut, bytes memory payload) external returns (uint256 amountOut) {} + + function addCollateral(address collateral) external {} + + function adjustStablecoins(address collateral, uint128 amount, bool increase) external {} + + function changeAllowance(address token, address spender, uint256 amount) external {} + + function recoverERC20(address collateral, address token, address to, uint256 amount) external {} + + function revokeCollateral(address collateral) external {} + + function setAccessControlManager(address _newAccessControlManager) external {} + + function setCollateralManager(address collateral, Tuple5479340 memory managerData) external {} + + function setOracle(address collateral, bytes memory oracleConfig) external {} + + function setWhitelistStatus(address collateral, uint8 whitelistStatus, bytes memory whitelistData) external {} + + function toggleTrusted(address sender, uint8 t) external {} + + function setFees(address collateral, uint64[] memory xFee, int64[] memory yFee, bool mint) external {} + + function setRedemptionCurveParams(uint64[] memory xFee, int64[] memory yFee) external {} + + function togglePause(address collateral, uint8 pausedType) external {} + + function toggleWhitelist(uint8 whitelistType, address who) external {} + + function quoteIn(uint256 amountIn, address tokenIn, address tokenOut) external view returns (uint256 amountOut) {} + + function quoteOut(uint256 amountOut, address tokenIn, address tokenOut) external view returns (uint256 amountIn) {} + + function swapExactInput( + uint256 amountIn, + uint256 amountOutMin, + address tokenIn, + address tokenOut, + address to, + uint256 deadline + ) external returns (uint256 amountOut) {} + + function swapExactInputWithPermit( + uint256 amountIn, + uint256 amountOutMin, + address tokenIn, + address to, + uint256 deadline, + bytes memory permitData + ) external returns (uint256 amountOut) {} + + function swapExactOutput( + uint256 amountOut, + uint256 amountInMax, + address tokenIn, + address tokenOut, + address to, + uint256 deadline + ) external returns (uint256 amountIn) {} + + function swapExactOutputWithPermit( + uint256 amountOut, + uint256 amountInMax, + address tokenIn, + address to, + uint256 deadline, + bytes memory permitData + ) external returns (uint256 amountIn) {} + + function quoteRedemptionCurve( + uint256 amount + ) external view returns (address[] memory tokens, uint256[] memory amounts) {} + + function redeem( + uint256 amount, + address receiver, + uint256 deadline, + uint256[] memory minAmountOuts + ) external returns (address[] memory tokens, uint256[] memory amounts) {} + + function redeemWithForfeit( + uint256 amount, + address receiver, + uint256 deadline, + uint256[] memory minAmountOuts, + address[] memory forfeitTokens + ) external returns (address[] memory tokens, uint256[] memory amounts) {} + + function updateNormalizer(uint256 amount, bool increase) external returns (uint256) {} +} diff --git a/evm/src/angle/manifest.yaml b/evm/src/angle/manifest.yaml new file mode 100644 index 0000000..3298c49 --- /dev/null +++ b/evm/src/angle/manifest.yaml @@ -0,0 +1,36 @@ +# information about the author helps us reach out in case of issues. +author: + name: YourCompany + email: developer@yourcompany.xyz + +# Protocol Constants +constants: + protocol_gas: 30000 + # minimum capabilities we can expect, individual pools may extend these + capabilities: + - SellSide + - BuySide + - PriceFunction + +# The file containing the adapter contract +contract: TemplateSwapAdapter.sol + +# Deployment instances used to generate chain specific bytecode. +instances: + - chain: + name: mainnet + id: 0 + arguments: + - "0x00253582b2a3FE112feEC532221d9708c64cEFAb" + +# Specify some automatic test cases in case getPoolIds and +# getTokens are not implemented. +tests: + instances: + - pool_id: "0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc" + sell_token: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + buy_token: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + block: 17000000 + chain: + id: 0 + name: mainnet