Uniswap V1(四):工厂合约

本篇文章讲解工厂合约。在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作为桥梁,来进行交换。

  1. 用代币交换ETH
  2. 寻找另一个代币对应的交易对
  3. 如果交易对存在,那么使用兑换的ETH从该合约兑换另一个代币
  4. 将最终兑换出的另一个代币发送给用户

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
);
}

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部