本篇文章讲解工厂合约。在DEX中,会有非常多的交易对(资金池),自然需要一个地方管理它们,这就是工厂合约,工厂合约提供这些功能:
- 每个新部署的交易对合约都在工厂注册
- 任何交易对合约都可以通过查询注册表找到
- 当用户需要一个代币换另一个代币,而没有交易对的时候,可以通过注册表中别的代币进行转换得到
工厂拥有创建部署新的交易对合约的功能:
function createExchange(address _tokenAddress) public returns (address) {require(_tokenAddress != address(0), "invalid token address");require(tokenToExchange[_tokenAddress] == address(0),"exchange already exists");
Exchange exchange = new Exchange(_tokenAddress);tokenToExchange[_tokenAddress] = address(exchange);
return address(exchange);}
在这个方法中,我们需要创建一个代币的交易对,就会创建一个全新的交易对合约,并将其地址存放在注册表中。
此外,当用户需要从一个代币交换另一个代币时,如果没有直接的代币对,可以用ETH作为桥梁,来进行交换。
- 用代币交换ETH
- 寻找另一个代币对应的交易对
- 如果交易对存在,那么使用兑换的ETH从该合约兑换另一个代币
- 将最终兑换出的另一个代币发送给用户
function tokenToTokenSwap(uint256 _tokensSold,uint256 _minTokensBought,address _tokenAddress) public {address exchangeAddress = IFactory(factoryAddress).getExchange(_tokenAddress);require(exchangeAddress != address(this) && exchangeAddress != address(0),"invalid exchange address");
uint256 tokenReserve = getReserve();uint256 ethBought = getAmount(_tokensSold,tokenReserve,address(this).balance);
IERC20(tokenAddress).transferFrom(msg.sender,address(this),_tokensSold);
IExchange(exchangeAddress).ethToTokenTransfer{value: ethBought}(_minTokensBought,msg.sender);}
