Contract Name:
IchiConnector
Contract Source Code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IICHIVault } from "contracts/interfaces/external/swapx/IIchiVault.sol";
import {
ILiquidityConnector,
AddLiquidityParams,
RemoveLiquidityParams,
SwapParams,
GetAmountOutParams
} from "contracts/interfaces/ILiquidityConnector.sol";
contract IchiConnector is ILiquidityConnector {
error NotSupported();
error PoolTokensNotAllowed();
function addLiquidity(
AddLiquidityParams memory addLiquidityParams
) external payable override {
if (
IICHIVault(addLiquidityParams.lpToken).allowToken0()
&& !IICHIVault(addLiquidityParams.lpToken).allowToken1()
) {
IICHIVault(addLiquidityParams.lpToken).deposit(
addLiquidityParams.desiredAmounts[0], 0, address(this)
);
} else if (
!IICHIVault(addLiquidityParams.lpToken).allowToken0()
&& IICHIVault(addLiquidityParams.lpToken).allowToken1()
) {
IICHIVault(addLiquidityParams.lpToken).deposit(
0, addLiquidityParams.desiredAmounts[1], address(this)
);
} else if (
IICHIVault(addLiquidityParams.lpToken).allowToken0()
&& IICHIVault(addLiquidityParams.lpToken).allowToken1()
) {
IICHIVault(addLiquidityParams.lpToken).deposit(
addLiquidityParams.desiredAmounts[0],
addLiquidityParams.desiredAmounts[1],
address(this)
);
} else {
revert PoolTokensNotAllowed();
}
}
function removeLiquidity(
RemoveLiquidityParams memory removeLiquidityParams
) external override {
IICHIVault(removeLiquidityParams.lpToken).withdraw(
removeLiquidityParams.lpAmountIn, address(this)
);
}
function swapExactTokensForTokens(
SwapParams memory
) external payable override {
revert NotSupported();
}
function getAmountOut(
GetAmountOutParams memory
) external pure returns (uint256) {
revert NotSupported();
}
}
// SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;
interface IICHIVault {
function ichiVaultFactory() external view returns (address);
function balanceOf(
address
) external view returns (uint256);
function pool() external view returns (address);
function owner() external view returns (address);
function token0() external view returns (address);
function allowToken0() external view returns (bool);
function token1() external view returns (address);
function allowToken1() external view returns (bool);
function fee() external view returns (uint24);
function tickSpacing() external view returns (int24);
function ammFeeRecipient() external view returns (address);
function affiliate() external view returns (address);
function baseLower() external view returns (int24);
function baseUpper() external view returns (int24);
function limitLower() external view returns (int24);
function limitUpper() external view returns (int24);
/// @notice NFT ID of the base position. If 0, the base position is not
/// initialized.
function basePositionId() external view returns (uint256);
/// @notice NFT ID of the limit position. If 0, the limit position is not
/// initialized.
function limitPositionId() external view returns (uint256);
function deposit0Max() external view returns (uint256);
function deposit1Max() external view returns (uint256);
function hysteresis() external view returns (uint256);
function twapPeriod() external view returns (uint32);
function auxTwapPeriod() external view returns (uint32);
function getTotalAmounts() external view returns (uint256, uint256);
function getBasePosition()
external
view
returns (uint128, uint256, uint256);
function getLimitPosition()
external
view
returns (uint128, uint256, uint256);
function deposit(uint256, uint256, address) external returns (uint256);
function withdraw(uint256, address) external returns (uint256, uint256);
function currentTick() external view returns (int24);
function resetAllowances() external;
function rebalance(
int24 _baseLower,
int24 _baseUpper,
int24 _limitLower,
int24 _limitUpper,
int256 swapQuantity
) external;
function collectFees() external returns (uint256 fees0, uint256 fees1);
function setDepositMax(
uint256 _deposit0Max,
uint256 _deposit1Max
) external;
function setHysteresis(
uint256 _hysteresis
) external;
function setAmmFeeRecipient(
address _ammFeeRecipient
) external;
function setAffiliate(
address _affiliate
) external;
function setTwapPeriod(
uint32 newTwapPeriod
) external;
function setAuxTwapPeriod(
uint32 newAuxTwapPeriod
) external;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {
AddLiquidityParams,
RemoveLiquidityParams,
SwapParams,
GetAmountOutParams
} from "contracts/structs/LiquidityStructs.sol";
interface ILiquidityConnector {
function addLiquidity(
AddLiquidityParams memory addLiquidityParams
) external payable;
function removeLiquidity(
RemoveLiquidityParams memory removeLiquidityParams
) external;
function swapExactTokensForTokens(
SwapParams memory swap
) external payable;
function getAmountOut(
GetAmountOutParams memory getAmountOutParams
) external view returns (uint256);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
struct AddLiquidityParams {
address router;
address lpToken;
address[] tokens;
uint256[] desiredAmounts;
uint256[] minAmounts;
bytes extraData;
}
struct RemoveLiquidityParams {
address router;
address lpToken;
address[] tokens;
uint256 lpAmountIn;
uint256[] minAmountsOut;
bytes extraData;
}
struct SwapParams {
address router;
uint256 amountIn;
uint256 minAmountOut;
address tokenIn;
bytes extraData;
}
struct GetAmountOutParams {
address router;
address lpToken;
address tokenIn;
address tokenOut;
uint256 amountIn;
}