1

我刚刚为 ICO 制作了智能合约,现在我需要实现以下功能:

1.用户向钱包发送了一定数量的ETH

2.用户获得一定数量的代币到他的钱包以换取自动发送的ETH

我对这一切都很陌生,所以我想知道 - 是否可以自动执行此操作(或仅在手动模式下?),如果不是使用智能合约本身,也许还有另一种方法可以做到这一点,比如获取事件和使用某种 API(例如 PHP 或 JS)从智能合约调用函数?如果可能的话,我什么时候可以找到有关此的一些信息?只找到了几个这样的问题,但没有答案。

这是合约代码(主要取自这里):

pragma solidity ^0.4.2;
contract owned {
  address public owner;

  function owned() {
    owner = msg.sender;
  }

  modifier onlyOwner {
    if (msg.sender != owner) return;
    _;
  }

  function transferOwnership(address newOwner) onlyOwner {
    owner = newOwner;
  }
}

contract tokenRecipient { function receiveApproval(address _from, uint256 
_value, address _token, bytes _extraData); }

contract token {
/* Public variables of the token */
string public standard = 'Token 0.1';
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;

/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;

/* This generates a public event on the blockchain that will notify clients 
*/
event Transfer(address indexed from, address indexed to, uint256 value);

/* Initializes contract with initial supply tokens to the creator of the 
contract */
function token(
    uint256 initialSupply,
    string tokenName,
    uint8 decimalUnits,
    string tokenSymbol
    ) {
    balanceOf[msg.sender] = initialSupply;              // Give the creator 
    all initial tokens
    totalSupply = initialSupply;                        // Update total 
    supply
    name = tokenName;                                   // Set the name for 
    display purposes
    symbol = tokenSymbol;                               // Set the symbol 
    for display purposes
    decimals = decimalUnits;                            // Amount of 
    decimals for display purposes
}

/* Send coins */
function transfer(address _to, uint256 _value) {
    if (balanceOf[msg.sender] < _value) return;           // Check if the 
sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return; // Check for 
overflows
    balanceOf[msg.sender] -= _value;                     // Subtract from 
the sender
    balanceOf[_to] += _value;                            // Add the same to 
the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone 
listening that this transfer took place
}

/* Allow another contract to spend some tokens in your behalf */
function approve(address _spender, uint256 _value)
    returns (bool success) {
    allowance[msg.sender][_spender] = _value;
    return true;
}

/* Approve and then communicate the approved contract in a single tx */
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
    returns (bool success) {    
    tokenRecipient spender = tokenRecipient(_spender);
    if (approve(_spender, _value)) {
        spender.receiveApproval(msg.sender, _value, this, _extraData);
        return true;
    }
}

/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns 
(bool success) {
    if (balanceOf[_from] < _value) return;                 // Check if the 
 sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return;  // Check for 
 overflows
    if (_value > allowance[_from][msg.sender]) return;   // Check allowance
    balanceOf[_from] -= _value;                          // Subtract from 
 the sender
    balanceOf[_to] += _value;                            // Add the same to 
 the recipient
    allowance[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    return true;
}

/* This unnamed function is called whenever someone tries to send ether to 
it */
function () {
    return;     // Prevents accidental sending of ether
}
}

contract MyAdvancedToken is owned, token {

uint256 public sellPrice;
uint256 public buyPrice;

mapping (address => bool) public frozenAccount;

/* This generates a public event on the blockchain that will notify clients 
*/
 event FrozenFunds(address target, bool frozen);

 /* Initializes contract with initial supply tokens to the creator of the 
 contract */
function MyAdvancedToken(
    uint256 initialSupply,
    string tokenName,
    uint8 decimalUnits,
    string tokenSymbol
) token (initialSupply, tokenName, decimalUnits, tokenSymbol) {}

/* Send coins */
function transfer(address _to, uint256 _value) {
    if (balanceOf[msg.sender] < _value) return;           // Check if the 
sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return; // Check for 
overflows
    if (frozenAccount[msg.sender]) return;                // Check if frozen
    balanceOf[msg.sender] -= _value;                     // Subtract from 
the sender
    balanceOf[_to] += _value;                            // Add the same to 
the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone 
listening that this transfer took place
}


/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns 
(bool success) {
    if (frozenAccount[_from]) return;                        // Check if 
frozen            
    if (balanceOf[_from] < _value) return;                 // Check if the 
sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return;  // Check for 
overflows
    if (_value > allowance[_from][msg.sender]) return;   // Check allowance
    balanceOf[_from] -= _value;                          // Subtract from 
the sender
    balanceOf[_to] += _value;                            // Add the same to 
the recipient
    allowance[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    return true;
}

function mintToken(address target, uint256 mintedAmount) onlyOwner {
    balanceOf[target] += mintedAmount;
    totalSupply += mintedAmount;
    Transfer(0, this, mintedAmount);
    Transfer(this, target, mintedAmount);
}

function freezeAccount(address target, bool freeze) onlyOwner {
    frozenAccount[target] = freeze;
    FrozenFunds(target, freeze);
}

function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {
    sellPrice = newSellPrice;
    buyPrice = newBuyPrice;
}

function buy() payable {
    uint amount = msg.value / buyPrice;                // calculates the 
amount
    if (balanceOf[this] < amount) return;               // checks if it has 
enough to sell
    balanceOf[msg.sender] += amount;                   // adds the amount to 
buyer's balance
    balanceOf[this] -= amount;                         // subtracts amount 
from seller's balance
    Transfer(this, msg.sender, amount);                // execute an event 
reflecting the change
}

function sell(uint256 amount) {
    if (balanceOf[msg.sender] < amount ) return;        // checks if the 
sender has enough to sell
    balanceOf[this] += amount;                         // adds the amount to 
owner's balance
    balanceOf[msg.sender] -= amount;                   // subtracts the 
amount from seller's balance
    if (!msg.sender.send(amount * sellPrice)) {        // sends ether to the 
seller. It's important
        return;                                         // to do this last 
to avoid recursion attacks
    } else {
        Transfer(msg.sender, this, amount);            // executes an event 
reflecting on the change
    }               
}
}

请原谅我可能的愚蠢和糟糕的英语:)

非常感谢。

4

2 回答 2

0

其实我没明白你的意思automatically。但我认为你想为每个向你的合约发送 ETH 的人发送代币,而无需调用buy方法。至少这是我为Jincor Pre ICO所做的,你可以在Github上查看代码 你可以通过添加到你的合约来实现MyAdvancedToken:```

 function () payable {
        buy();
    }

``` 对不起,如果我没有很好地收到你的信息。

于 2017-08-10T12:04:26.270 回答
-1

当以太来到合约地址功能时

function() payable {..}

叫。

您可以在合约中定义此函数并使用全局可用变量: msg.value - 以太数量(wei 的数量) msg.sender - 发送以太的地址

于 2017-12-12T10:55:32.457 回答