将 ERC20 代币与其他 ERC20 代币兑换

Exchange ERC20 token with other ERC20 token

我有 2 个 ERC20 代币。合约设计为标准 ERC20。这里有 2 个令牌作为示例 -

AUDC --> Contract address: (0xContractAUDC)
         Wallet Address:   (0xWalletAUDC)
DAI  --> Contract address: (0xContractDAI)
         Wallet Address:   (0xWalletDAI)

我想将一些 DAI 从钱包 0xWalletDAI 转移到 0xWalletAUDC 以在 return 中接收转换后的 AUDC(我有两个钱包的私钥)。

正在寻求帮助以了解如何实施。如果需要,我会尽力提供更多信息。

我正在使用 ethers.js v4.0 与区块链交互。

我找到了使用 ethers.js -

实现这个的解决方案
const ethers = require('ethers');

let provider = ethers.getDefaultProvider();

// WALLETS
const DAIUserWalletObj = new ethers.Wallet(DAIUserPrivateKey, provider);
const AUDCWalletObj = new ethers.Wallet(AUDCPrivateKey, provider);

//CONTRACTS
const contractDAI = new ethers.Contract(DAIContractAddress, DAIContractABI, provider);
constractDAI = contractDAI.connect(DAIUserWalletObj);
const contractAUDC = new ethers.Contract(AUDCContractAddress, AUDCContractABI, provider);
contractAUDC = contractAUDC.connect(AUDCWalletObj);

let overRide = { gasLimit: 7500000 }
let numDAITokens = 20;  // Just for example
let numOfAUDCTokens = 40; // Just for example
const receipt1 = await contractDAI.transfer(AUDCContractAddress, numDAITokens, overRide);
const receipt2 = await contractAUDC.transfer(DAIUserWalletAddress, numOfAUDCTokens, overRide);
console.log(receipt1);
console.log(receipt2);

如果这些是 ERC20 代币,那么您需要自己进行核算。 我建议你有单独的合同来处理这个。

这是 an example 可以重新用于您的用例。

想法是将一个 ERC20 代币发送到执行交换计算的合约,然后将资金从一个代币转移到另一个代币。

如果 DAI 到 AUD 的汇率没有波动,那么你可以将这个汇率作为合约中的常量。不过这很可能会波动,在这种情况下兑换会稍微复杂一些。

像 UniSwap 这样的去中心化交易所使用一种算法自动处理交易,该算法使用可用流动性作为输入。做这样的事情是一个非常复杂的过程。

另一种选择是您拥有一个可以由特定签名者调用的 approve 函数。该签名者可以是作为交换工作流程一部分的集中式服务。

或者,您可以使用预言机定期更新两个代币之间的汇率,但这会消耗 gas,除非您有大量交易量,否则这可能不是最具成本效益的选择。