Blockchain 实收实售
因此,我希望能够购买/出售代币,但也希望用户能够将eth发送到我的合同钱包,并接收我的代币作为交换。我相信我已经准备好了代码,可以让买家和卖家一起进行交易,但我不认为我已经准备好了代码,可以让某人接收发送给我以太坊的代币。我想这样做,在一开始人们给我发送eth的一些硬币设置在一个基准值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
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()
函数发送了不正确的金额?)。请回答一个单独的问题,提供一个最小的可复制示例,以便其他人能够按照您的描述得出与您相同的错误。您能看一下吗?