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

1.用户向钱包中发送了以太币

2,用户从钱包中获取一定数量的代币以自动交换发送的ETH

我对所有这些都还很陌生,所以我想知道-如果不是使用smartcontract本身,是否甚至可以自动执行此操作(或仅在手动模式下执行此操作),也许还有另一种方法可以执行此操作,例如获取事件并从智能合约中调用函数,并使用来自PHP或JS的某种API?
如果可以的话,何时可以找到有关此信息?
仅找到类似此问题的几个问题,但未找到答案。

以下是合同代码(主要来自here):

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


对不起,我可能很愚蠢,英语不好:)

非常感谢。

最佳答案

实际上,我不理解automatically是什么意思。但是我认为您想为发送ETH到您的合约的每个人发送令牌,而无需调用buy方法。至少那是我为Jincor Pre ICO做的,您可以在Github上检查代码
您可以通过添加到合同MyAdvancedToken中来实现:
```

 function () payable {
        buy();
    }


```
对不起,如果我没有很好地传达您的信息。

关于javascript - 以太坊智能合约自动交易-有可能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45611611/

10-14 03:17