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

问题描述

我正在尝试构建一个智能合约并继承一些功能来交换 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 在服务器端过程中处理该过程更好,还是在实体中实现它?


完整的智能合约代码

pragma solidity ^0.5.11; 

合约交换测试{ 地址公共经理;

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

}

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

解决方法

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

import os

import discord
import csv
from collections import defaultdict
from discord.ext import commands
    
intents = discord.Intents.all()
outP = open("giveawayList.txt","w")
bot = commands.Bot(command_prefix='!',intents=intents)
    
@bot.event
async def on_message(message):
    if message == "!test":
        await message.channel.send("you failed the test")

    await bot.process_commands(message)
            
@bot.event
async def on_ready():
    for guild in bot.guilds:
        if guild.name == GUILD:
            break
    
    print(
        f'{bot.user} is connected to the following guild: \n' 
        f'{guild.name} (id: {guild.id})'
    )
    
    count = 0
    for guild in bot.guilds:
        for member in guild.members:
            print(member)
            if 'Bots' not in str(member.roles):
                 
                print(member.name,' ')
                outP.write(member.name)
                outP.write("\n")
                count += 1
    print('Number of members: ' + str(count))

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

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

B:你可以用这个:

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

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