From b8794fd3a41ea79fe4331136c4759e56c06e917e Mon Sep 17 00:00:00 2001 From: domenicodev Date: Wed, 13 Dec 2023 18:11:58 +0100 Subject: [PATCH] feat: added documentation, manifests and initial libraries for Integral support --- evm/src/integral/IntegralSwapAdapter.sol | 237 +++++++++++++++++++++++ evm/src/integral/manifest.yaml | 36 ++++ 2 files changed, 273 insertions(+) create mode 100644 evm/src/integral/IntegralSwapAdapter.sol create mode 100644 evm/src/integral/manifest.yaml diff --git a/evm/src/integral/IntegralSwapAdapter.sol b/evm/src/integral/IntegralSwapAdapter.sol new file mode 100644 index 0000000..66ecba0 --- /dev/null +++ b/evm/src/integral/IntegralSwapAdapter.sol @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.13; + +import {IERC20, ISwapAdapter} from "src/interfaces/ISwapAdapter.sol"; + +// Integral handles arbirary amounts, but we limit the amount to 10x just in case +uint256 constant RESERVE_LIMIT_FACTOR = 10; + +/// @title Integral Swap Adapter +contract IntegralSwapAdapter is ISwapAdapter { + ITwapFactory immutable factory; + + constructor(address factory_) { + factory = ITwapFactory(factory_); + } + + function price( + bytes32 _poolId, + IERC20 _sellToken, + IERC20 _buyToken, + uint256[] memory _specifiedAmounts + ) external view override returns (Fraction[] memory _prices) { + revert NotImplemented("IntegralSwapAdapter.price"); + } + + function swap( + bytes32 poolId, + IERC20 sellToken, + IERC20 buyToken, + OrderSide side, + uint256 specifiedAmount + ) external returns (Trade memory trade) { + revert NotImplemented("IntegralSwapAdapter.swap"); + } + + function getLimits(bytes32 poolId, IERC20 sellToken, IERC20 buyToken) + external + returns (uint256[] memory limits) + { + revert NotImplemented("IntegralSwapAdapter.getLimits"); + } + + function getCapabilities(bytes32 poolId, IERC20 sellToken, IERC20 buyToken) + external + returns (Capability[] memory capabilities) + { + revert NotImplemented("IntegralSwapAdapter.getCapabilities"); + } + + function getTokens(bytes32 poolId) + external + returns (IERC20[] memory tokens) + { + revert NotImplemented("IntegralSwapAdapter.getTokens"); + } + + /// @inheritdoc ISwapAdapter + function getPoolIds(uint256 offset, uint256 limit) + external + view + override + returns (bytes32[] memory ids) + { + revert NotImplemented("IntegralSwapAdapter.getPoolIds"); + } +} + +interface ITwapFactory { + event PairCreated(address indexed token0, address indexed token1, address pair, uint256); + event OwnerSet(address owner); + + function owner() external view returns (address); + + function getPair(address tokenA, address tokenB) external view returns (address pair); + + function allPairs(uint256) external view returns (address pair); + + function allPairsLength() external view returns (uint256); + + function createPair( + address tokenA, + address tokenB, + address oracle, + address trader + ) external returns (address pair); + + function setOwner(address) external; + + function setMintFee( + address tokenA, + address tokenB, + uint256 fee + ) external; + + function setBurnFee( + address tokenA, + address tokenB, + uint256 fee + ) external; + + function setSwapFee( + address tokenA, + address tokenB, + uint256 fee + ) external; + + function setOracle( + address tokenA, + address tokenB, + address oracle + ) external; + + function setTrader( + address tokenA, + address tokenB, + address trader + ) external; + + function collect( + address tokenA, + address tokenB, + address to + ) external; + + function withdraw( + address tokenA, + address tokenB, + uint256 amount, + address to + ) external; +} + +interface ITwapPair is ITwapERC20, IReserves { + event Mint(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 liquidityOut, address indexed to); + event Burn(address indexed sender, uint256 amount0Out, uint256 amount1Out, uint256 liquidityIn, address indexed to); + event Swap( + address indexed sender, + uint256 amount0In, + uint256 amount1In, + uint256 amount0Out, + uint256 amount1Out, + address indexed to + ); + event SetMintFee(uint256 fee); + event SetBurnFee(uint256 fee); + event SetSwapFee(uint256 fee); + event SetOracle(address account); + event SetTrader(address trader); + + function MINIMUM_LIQUIDITY() external pure returns (uint256); + + function factory() external view returns (address); + + function token0() external view returns (address); + + function token1() external view returns (address); + + function oracle() external view returns (address); + + function trader() external view returns (address); + + function mintFee() external view returns (uint256); + + function setMintFee(uint256 fee) external; + + function mint(address to) external returns (uint256 liquidity); + + function burnFee() external view returns (uint256); + + function setBurnFee(uint256 fee) external; + + function burn(address to) external returns (uint256 amount0, uint256 amount1); + + function swapFee() external view returns (uint256); + + function setSwapFee(uint256 fee) external; + + function setOracle(address account) external; + + function setTrader(address account) external; + + function collect(address to) external; + + function swap( + uint256 amount0Out, + uint256 amount1Out, + address to, + bytes calldata data + ) external; + + function sync() external; + + function initialize( + address _token0, + address _token1, + address _oracle, + address _trader + ) external; + + function getSwapAmount0In(uint256 amount1Out, bytes calldata data) external view returns (uint256 swapAmount0In); + + function getSwapAmount1In(uint256 amount0Out, bytes calldata data) external view returns (uint256 swapAmount1In); + + function getSwapAmount0Out(uint256 amount1In, bytes calldata data) external view returns (uint256 swapAmount0Out); + + function getSwapAmount1Out(uint256 amount0In, bytes calldata data) external view returns (uint256 swapAmount1Out); + + function getDepositAmount0In(uint256 amount0, bytes calldata data) external view returns (uint256 depositAmount0In); + + function getDepositAmount1In(uint256 amount1, bytes calldata data) external view returns (uint256 depositAmount1In); +} + +interface ITwapERC20 is IERC20 { + function PERMIT_TYPEHASH() external pure returns (bytes32); + + function nonces(address owner) external view returns (uint256); + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + function increaseAllowance(address spender, uint256 addedValue) external returns (bool); + + function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); +} + +interface IReserves { + function getReserves() external view returns (uint112 reserve0, uint112 reserve1); + + function getFees() external view returns (uint256 fee0, uint256 fee1); +} diff --git a/evm/src/integral/manifest.yaml b/evm/src/integral/manifest.yaml new file mode 100644 index 0000000..5d3c68e --- /dev/null +++ b/evm/src/integral/manifest.yaml @@ -0,0 +1,36 @@ +# information about the author helps us reach out in case of issues. +author: + name: Propellerheads.xyz + email: alan@propellerheads.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: IntegralSwapAdapter.sol + +# Deployment instances used to generate chain specific bytecode. +instances: + - chain: + name: mainnet + id: 0 + arguments: + - "0xC480b33eE5229DE3FbDFAD1D2DCD3F3BAD0C56c6" + +# 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