1

我有 2 个 ERC20 代币。该合约设计为标准 ERC20。以下是以 2 个令牌为例 -

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

我想从钱包中转移一些 DAI0xWalletDAI0xWalletAUDC接收转换后的 AUDC 作为回报(我有两个钱包的私钥)。

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

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

4

2 回答 2

1

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

这是一个可以重新用于处理您的用例的示例。

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

如果从 DAI 到 AUD 的汇率没有波动,那么您可以将此汇率作为合约中的常数。不过,这很可能会波动,在这种情况下,交换会更复杂一些。

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

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

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

于 2021-08-13T18:22:14.363 回答
1

我找到了使用 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);
于 2019-10-02T04:09:57.273 回答