ERC20代币兑换ERC20代币的函数入口和ERC20代币兑换ETH的函数入口类似,不同的是ERC20代币兑换ERC20代币的函数入口在调用进行兑换的业务函数前会先用创建自身的工厂合约实现的getExchange函数来获取目标代币所在的兑换合约地址,然后再向目标兑换合约地址发送兑换请求,将在本合约兑换得到的ETH兑换成目标代币。
函数入口调用到的函数就两种,分别是根据输入代币计算输出代币的tokenToTokenInput,以及根据输出代币计算输入代币的tokenToTokenOutput。
下面先看tokenToTokenInput。
private
def tokenToTokenInput(tokens_sold:uint256,min_tokens_bought:uint256,min_eth_bought:uint256(wei),deadline:timestamp,buyer:address,recipient:address,exchange_addr:address)->uint256:开发功能I35系统7O98详细O7I8
assert(deadline>=block.timestamp and tokens_sold>0)and(min_tokens_bought>0 and min_eth_bought>0)
assert exchange_addr!=self and exchange_addr!=ZERO_ADDRESS
关于区块链项目技术开发唯:yy625019,代币发行、dapp智能合约开发、链游开发、多链钱包开发
交易所开发、量化合约开发、互助游戏开发、Nft数字藏品开发、众筹互助开发、元宇宙开发、swap开发、
链上合约开发、ido开发、商城开发等,开发过各种各样的系统模式,更有多种模式、制度、案例、后台等,成熟技术团队,欢迎实体参考。
token_reserve:uint256=self.token.balanceOf(self)#获得支付代币的储备量
#用getInputPrice计算所能兑换到的ETH
eth_bought:uint256=self.getInputPrice(tokens_sold,token_reserve,as_unitless_number(self.balance))
wei_bought:uint256(wei)=as_wei_value(eth_bought,'wei')#将单位转换成wei
assert wei_bought>=min_eth_bought
assert self.token.transferFrom(buyer,self,tokens_sold)#收取支付代币
#调用目标兑换合约地址的ethToTokenTransferInput函数,将ETH兑换成目标代币
tokens_bought:uint256=Exchange(exchange_addr).ethToTokenTransferInput(min_tokens_bought,deadline,recipient,value=wei_bought)
log.EthPurchase(buyer,tokens_sold,wei_bought)
return tokens_bought
tokenToTokenInput在将支付代币兑换成ETH后,就将ETH发送到目标代币的兑换合约地址并调用其ethToTokenTransferInput函数来将ETH兑换成目标代币。
接着看tokenToTokenOutput。
private
def tokenToTokenOutput(tokens_bought:uint256,max_tokens_sold:uint256,max_eth_sold:uint256(wei),deadline:timestamp,buyer:address,recipient:address,exchange_addr:address)->uint256:
assert deadline>=block.timestamp and(tokens_bought>0 and max_eth_sold>0)
assert exchange_addr!=self and exchange_addr!=ZERO_ADDRESS
#调用目标兑换合约的getEthToTokenOutputPrice来根据目标代币数量计算所需的中介ETH的数量
eth_bought:uint256(wei)=Exchange(exchange_addr).getEthToTokenOutputPrice(tokens_bought)
token_reserve:uint256=self.token.balanceOf(self)#获得支付代币的储备量
#根据得到的eth_bought代入getOutputPrice计算所需支付的代币数量
tokens_sold:uint256=self.getOutputPrice(as_unitless_number(eth_bought),token_reserve,as_unitless_number(self.balance))
#tokens sold is always>0
assert max_tokens_sold>=tokens_sold and max_eth_sold>=eth_bought
assert self.token.transferFrom(buyer,self,tokens_sold)#收取支付代币
#调用目标兑换合约地址的ethToTokenTransferOutput函数,将ETH兑换成目标代币
eth_sold:uint256(wei)=Exchange(exchange_addr).ethToTokenTransferOutput(tokens_bought,deadline,recipient,value=eth_bought)
log.EthPurchase(buyer,tokens_sold,eth_bought)
return tokens_sold
tokenToTokenOutput函数实现