Blockchain 实收实售

Blockchain 实收实售,blockchain,ethereum,solidity,remix,Blockchain,Ethereum,Solidity,Remix,因此,我希望能够购买/出售代币,但也希望用户能够将eth发送到我的合同钱包,并接收我的代币作为交换。我相信我已经准备好了代码,可以让买家和卖家一起进行交易,但我不认为我已经准备好了代码,可以让某人接收发送给我以太坊的代币。我想这样做,在一开始人们给我发送eth的一些硬币设置在一个基准值 pragma solidity 0.4.22; contract ERC20Basic { string public constant name = "Community Token&qu

因此,我希望能够购买/出售代币,但也希望用户能够将eth发送到我的合同钱包,并接收我的代币作为交换。我相信我已经准备好了代码,可以让买家和卖家一起进行交易,但我不认为我已经准备好了代码,可以让某人接收发送给我以太坊的代币。我想这样做,在一开始人们给我发送eth的一些硬币设置在一个基准值

pragma solidity 0.4.22;

contract ERC20Basic {

    string public constant name = "Community Token";
    string public constant symbol = "COMM";
    uint8 public constant decimals = 1;  


    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
    event Transfer(address indexed from, address indexed to, uint tokens);


    mapping(address => uint256) balances;

    mapping(address => mapping (address => uint256)) allowed;
    
    uint256 totalSupply_;

    using SafeMath for uint256;


   constructor(uint256 total) public {  
    totalSupply_ = total;
    balances[msg.sender] = totalSupply_;
    }  

    function totalSupply() public view returns (uint256) {
    return totalSupply_;
    }
    
    function balanceOf(address tokenOwner) public view returns (uint) {
        return balances[tokenOwner];
    }

    function transfer(address receiver, uint numTokens) public returns (bool) {
        require(numTokens <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender].sub(numTokens);
        balances[receiver] = balances[receiver].add(numTokens);
        emit Transfer(msg.sender, receiver, numTokens);
        return true;
    }

    function approve(address delegate, uint numTokens) public returns (bool) {
        allowed[msg.sender][delegate] = numTokens;
        emit Approval(msg.sender, delegate, numTokens);
        return true;
    }

    function allowance(address owner, address delegate) public view returns (uint) {
        return allowed[owner][delegate];
    }

    function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) {
        require(numTokens <= balances[owner]);    
        require(numTokens <= allowed[owner][msg.sender]);
    
        balances[owner] = balances[owner].sub(numTokens);
        allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
        balances[buyer] = balances[buyer].add(numTokens);
        emit Transfer(owner, buyer, numTokens);
        return true;
    }
}

library SafeMath { 
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
      assert(b <= a);
      return a - b;
    }
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
      uint256 c = a + b;
      assert(c >= a);
      return c;
    }
}

pragma-solidity 0.4.22;
合同ERC20Basic{
字符串public常量name=“社区令牌”;
字符串公共常量symbol=“COMM”;
uint8公共常量小数=1;
事件批准(地址索引令牌所有者、地址索引支出者、uint令牌);
事件传输(地址索引自、地址索引至、uint令牌);
映射(地址=>uint256)余额;
允许映射(地址=>mapping(地址=>uint256));
uint256总供应量;
对uint256使用SafeMath;
构造函数(uint256总计)公共{
总供给=总供给;
余额[消息发送方]=总供应量;
}  
函数totalSupply()公共视图返回(uint256){
返回总供给;
}
函数平衡(地址令牌所有者)公共视图返回(uint){
返回余额[令牌所有者];
}
函数传输(地址接收器、uint numTokens)公共返回(bool){

需要(numTokens一个非常基本的买卖示例:

pragma solidity ^0.8;

contract ERC20Basic{
    uint256 public constant tokenPrice = 5; // 1 token for 5 wei
    
    function buy(uint256 _amount) external payable {
        // e.g. the buyer wants 100 tokens, needs to send 500 wei
        require(msg.value == _amount * tokenPrice, 'Need to send exact amount of wei');
        
        /*
         * sends the requested amount of tokens
         * from this contract address
         * to the buyer
         */
        transfer(msg.sender, _amount);
    }
    
    function sell(uint256 _amount) external {
        // decrement the token balance of the seller
        balances[msg.sender] -= _amount;
        increment the token balance of this contract
        balances[address(this)] += _amount;

        /*
         * don't forget to emit the transfer event
         * so that external apps can reflect the transfer
         */
        emit Transfer(msg.sender, address(this), _amount);
        
        // e.g. the user is selling 100 tokens, send them 500 wei
        payable(msg.sender).transfer(amount * tokenPrice);
    }
}
这将允许任何用户在您的合同中购买或出售代币。您的合同需要拥有这些代币才能将其出售给用户。此外,您的合同需要有足够的ETH才能从用户手中回购代币

您可以在此代码上展开以实现

  • 有权更改价格的合同所有人
  • 买卖价格不同
  • 费用
  • 最小/最大金额(每笔交易、每个用户、每天等)
  • 根据
    msg.value
    计算代币的数量(用户不必知道确切的数量)
  • 等等


请注意,我的代码段使用的是Solidity 0.8,其中可以自动防止整数溢出。问题是使用不推荐的Solidity 0.4,因此您需要使用SafeMath,使用require/assert检查该值或升级到Solidity 0.8以获得相同的结果。

在您给出的示例中,此代码是否也接受BNB?@EvertonFiguei在BSC网络上重做(其中BNB是本机令牌)-是。在以太坊网络上重做(其中BNB是ERC-20令牌)-否。警告!在合同执行过程中遇到错误[汽油用完],当我试图将此错误发送到我的合同时,会出现此错误,您知道如何告诉我原因吗?@EvertonFigueiredo这是一条非常普遍的错误消息,可能是由于您的合同执行不同或使用不正确造成的(可能您正试图从没有代币的合同中购买代币?或者您向
buy()
函数发送了不正确的金额?)。请回答一个单独的问题,提供一个最小的可复制示例,以便其他人能够按照您的描述得出与您相同的错误。您能看一下吗?