如何将 ERC20 代币发送到智能合约余额?

Posted

技术标签:

【中文标题】如何将 ERC20 代币发送到智能合约余额?【英文标题】:How to send ERC20 token to smart contract balance? 【发布时间】:2021-04-26 23:45:16 【问题描述】:

我正在尝试构建一个智能合约并继承一些函数来交换 ERC20 代币,

这是我的问题?

问题 A: 可以将ERC20代币转入智能合约余额吗?, 请举个例子, 即我们可以创建一个函数将 ETH 发送到智能合约

function contribute() external payable 

//It will allow us to send ETH to smart contract balance,but how to send,for example, "BAND" token
//to smart contract balance?

问题 B: 如果 A 是可能的,如何获取合约的代币余额? 即我们可以通过这个函数获取合约 ETH 余额:

// Get ETH balance
function getBalance() external view returns(uint) 
    return address(this).balance;    


// How to return contract's BAND balance, if A is possible ...

问题 C:

如果“A”是可能的,如何使用 Uniswap 或 Sushiswap API 交换到 BAND/ETH 流动性池, 是使用 NodeJS 在服务器端进程上处理该进程更好,还是在solidity 中实现它?


完整的智能合约代码:

pragma solidity ^0.5.11; 

合约 SwapTest 向公共经理致辞;

constructor() public 
    manager = msg.sender;


modifier OnlyManager() 
    require(msg.sender == manager);
    _;


// Add funds to contract
function contribute() external payable 


// Get ETH balance
function getBalance() external view returns(uint) 
    return address(this).balance;    
 

// Send provided amount of WEI to recipient
function sendEther (address payable recipient, uint weiAmount) external OnlyManager
    recipient.transfer(weiAmount);    


// Send contract balance to recipient
function withdrawBalance (address payable recipient) external OnlyManager
    recipient.transfer(address(this).balance);

期待你们的回音, 提前致谢。

【问题讨论】:

对于 *** Q&A 格式,我建议您每个问题只添加一个问题。 要创建 Uniswav v2 池,您需要调用 Uniswap Factory 合约并使用相应的参数。下载 Uniswap 源并进行检查。 检查了我的 uniswap 对数据库。您要创建的对已经存在,地址是 0xf421c3f2e695C2D4C0765379cCace8adE4a480D9 。 BAND代币还有另外16对与其他代币:DIA、NMR、YFI、GEM、AXIA、DAI、BAT、USDC、YUNO、UNI、LINK、DREAM、AGI 【参考方案1】:

在处理外部合约时首先包含一个接口定义,这样就可以调用合约的函数了。

interface ERC20 
  function balanceOf(address owner) external view returns (unit);
  function allowance(address owner, address spender) external view returns (unit);
  function approve(address spender, uint value) external returns (bool);
  function transfer(address to, uint value) external returns (bool);
  function transferFrom(address from, address to, uint value) external returns (bool); 

答: 代币可以直接转入合约地址,无需指定额外功能。不过,根据您的用例,您也可以编写一个将令牌传输给自身的函数。

function transferToMe(address _owner, address _token, unit _amount) public 
  ERC20(_token).transferFrom(_owner, address(this), _amount);

B:你可以用这个:

function getBalanceOfToken(address _address) public view returns (unit) 
  return ERC20(_address).balanceOf(address(this));

C:如果您需要您的合约能够交换代币,您需要包含相应的功能。请参阅 Uniswap 或 Sushiswap 文档,因为它们对此进行了深入描述。

【讨论】:

你能告诉我如何测试它吗?所以我在 Rinkeby 网络上部署合约,问题是如何获得任何 ERC20 代币来测试它,因为 metamask 不允许在测试网络上进行交换 理想情况下,我想在 Rinkeby 网络上部署合约,然后从 Metamask 发送 ERC20 代币,并在稍后实现时调用交换函数,提前致谢 您可以在 Metamask 中切换网络app.uniswap.org/#/swap。然后你可以将一些 Rinkeby 以太币换成一些 ERC20 代币并测试你的功能。 您需要一个函数将代币从智能合约中转出,否则这些代币将永远被锁定在那里。为此,只需使用 ERC20 接口中定义的传输即可。您还可以连接 uniswap 并直接提供流动性。

以上是关于如何将 ERC20 代币发送到智能合约余额?的主要内容,如果未能解决你的问题,请参考以下文章

使用智能合约存取erc20代币

为部署在 RinkeBy 测试网上的智能合约执行 ERC20 代币“传输函数”的原始交易

如何从智能合约中转移 ERC20 代币而不转移到基本账户

ERC20 代币转移到智能合约

我可以将我的自定义 ERC-20 与我的智能合约一起使用吗?

如何与已部署的 ERC20 代币与另一个智能合约进行交互?