이전에 pool, pool factroy, swap contract 를 분리 시켰다.
그리고 유동성 제공 이후 스왑 함수를 테스트 하였다.
swap factory contract 중
function createPool(
address _tokenA,
address _tokenB,
address feedAddressA,
address feedAddressB,
address swapAddress
) external onlyRole(CREATEPOOL_ROLE) returns (address pool) {
require(pools[_tokenA][_tokenB] == address(0), "Pool already exists");
require(
feedAddressA != address(0) && feedAddressB != address(0),
"Feed addresses are not valid"
);
require(_tokenA != _tokenB, "Tokens A and B should not be the same.");
priceOracle.setPriceFeed(_tokenA, feedAddressA);
priceOracle.setPriceFeed(_tokenB, feedAddressB);
// Generate initialization data for the proxy contract.
bytes memory initData = abi.encodeWithSignature(
"initialize(address,address,address,address,address,address)",
_tokenA,
_tokenB,
address(liquidityNFT),
address(rewardToken),
address(priceOracle),
swapAddress
);
BittoSwapPoolProxy poolProxy = new BittoSwapPoolProxy(
bittoSwapPoolLogic,
msg.sender,
initData
);
pool = address(poolProxy);
pools[address(_tokenA)][address(_tokenB)] = pool;
pools[address(_tokenB)][address(_tokenA)] = pool;
emit PoolCreated(address(_tokenA), address(_tokenB), pool);
return pool;
}
스왑 컨트렉트를 인자값으로 넘겨주어 pool을 생성한다.
pool contract 중
function initialize(
address _token0,
address _token1,
address _liqudityNFTAddress,
address _rewardToken,
address _priceOracle,
address _swapContract
) external initializer {
token0 = IERC20(_token0);
token1 = IERC20(_token1);
liquidityNFT = LiquidityNFT(_liqudityNFTAddress);
rewardToken = IERC20(_rewardToken);
priceOracle = IMultiDataConsumerV3(_priceOracle);
require(
token0.approve(_swapContract, type(uint256).max),
"Token0 approval failed"
);
require(
token1.approve(_swapContract, type(uint256).max),
"Token0 approval failed"
);
}
배포와 동시에 초기화 함수로 토큰에 대한 권한을 승인해준다
이후 이전에 했던 유동성 제공 로직을 실행하여 풀에 유동성을 제공한다.
그리고 스왑 함수를 테스트한다.
In, Out address from, to check
User의 A token 수량 감소 b token 수량 증가 확인
댓글