본문 바로가기
카테고리 없음

pool을 통한 swap 실행

by gun_poo 2023. 10. 19.

 

이전에 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 수량 증가 확인

댓글