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

10

我正在尝试构建一个智能合约,并继承一些函数来交换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; 

contract SwapTest {
    address public manager;
    
    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);
    }
}

期待收到你们的回复,先行谢过。


对于StackOverflow的问答格式,我建议您每次只添加一个问题。 - Mikko Ohtamaa
要创建Uniswap v2池,您需要使用相应的参数调用Uniswap工厂合约。下载Uniswap源代码并进行检查。 - Nulik
检查了我的Uniswap交易对数据库。您想创建的交易对已经存在,其地址为0xf421c3f2e695C2D4C0765379cCace8adE4a480D9。此外,BAND代币还与其他16种代币有交易对:DIA、NMR、YFI、GEM、AXIA、DAI、BAT、USDC、YUNO、UNI、LINK、DREAM、AGI。 - Nulik
1个回答

11

处理外部合同时,首先要包括接口定义,以便您可以调用合同的函数。

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

A:代币可以直接转移到合约地址,无需指定任何额外的函数。尽管如此,根据您的用例,您还可以编写一个将代币转移给其自身的函数。

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 不允许在测试网络上进行交换。 - Giorgiu
理想情况下,我希望在 Rinkeby 网络上部署合约,然后从 Metamask 发送 ERC20 代币,并在以后实现交换功能时调用交换函数。提前感谢您的帮助。 - Giorgiu
当您在 https://app.uniswap.org/#/swap 上时,可以在 Metamask 中切换网络。然后,您可以交换一些 Rinkeby Ether 以获取一些 ERC20 代币并测试您的功能。 - BrvarG
你需要一个函数来将代币从智能合约中转出,否则这些代币将永远被锁定在那里。为此,只需使用 ERC20 接口中定义的 transfer 函数即可。此外,你还可以与 Uniswap 进行接口交互并直接提供流动性。 - Jaime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接