以太坊,众筹向钱包返还 0.00 代币

Posted

技术标签:

【中文标题】以太坊,众筹向钱包返还 0.00 代币【英文标题】:Ethereum, crowdsale returns 0.00 tokens to the wallet 【发布时间】:2017-12-06 21:59:03 【问题描述】:

我正在尝试在以太坊测试网设置一个基本的众筹,而我使用的solidity 代码是在

找到的基本示例

https://ethereum.org/crowdsale#the-code

按照该指南中的说明执行步骤。

首先的问题是,由于第一行,以太坊钱包不接受要编译的代码: contract token function transfer(address receiver, uint amount)

特别是它的函数返回未使用局部变量的警告并且不会编译。除了在函数中定义空变量之外,还有其他方法吗?

第二个问题是在按照上述修改部署后,它可以工作。但是当它向发送以太币的钱包发送代币时,金额始终锁定在 0.00 个代币。

完整代码:

pragma solidity ^0.4.2;
contract token  function transfer(address receiver, uint amount) receiver; amount;  

contract Crowdsale 
    address public beneficiary;
    uint public fundingGoal; uint public amountRaised; uint public deadline; uint public price;
    token public tokenReward;
    mapping(address => uint256) public balanceOf;
    bool fundingGoalReached = false;
    event GoalReached(address beneficiary, uint amountRaised);
    event FundTransfer(address backer, uint amount, bool isContribution);
    bool crowdsaleClosed = false;

    /* data structure to hold information about campaign contributors */

    /*  at initialization, setup the owner */
    function Crowdsale(
        address ifSuccessfulSendTo,
        uint fundingGoalInEthers,
        uint durationInMinutes,
        uint etherCostOfEachToken,
        token addressOfTokenUsedAsReward
    ) 
        beneficiary = ifSuccessfulSendTo;
        fundingGoal = fundingGoalInEthers * 1 ether;
        deadline = now + durationInMinutes * 1 minutes;
        price = etherCostOfEachToken * 1 ether;
        tokenReward = token(addressOfTokenUsedAsReward);
    

    /* The function without a name is the default function that is called whenever anyone sends funds to a contract */
    function () payable 
        if (crowdsaleClosed) throw;
        uint amount = msg.value;
        balanceOf[msg.sender] = amount;
        amountRaised += amount;
        tokenReward.transfer(msg.sender, amount / price);
        FundTransfer(msg.sender, amount, true);
    

    modifier afterDeadline()  if (now >= deadline) _; 

    /* checks if the goal or time limit has been reached and ends the campaign */
    function checkGoalReached() afterDeadline 
        if (amountRaised >= fundingGoal)
            fundingGoalReached = true;
            GoalReached(beneficiary, amountRaised);
        
        crowdsaleClosed = true;
    


    function safeWithdrawal() afterDeadline 
        if (!fundingGoalReached) 
            uint amount = balanceOf[msg.sender];
            balanceOf[msg.sender] = 0;
            if (amount > 0) 
                if (msg.sender.send(amount)) 
                    FundTransfer(msg.sender, amount, false);
                 else 
                    balanceOf[msg.sender] = amount;
                
            
        

        if (fundingGoalReached && beneficiary == msg.sender) 
            if (beneficiary.send(amountRaised)) 
                FundTransfer(beneficiary, amountRaised, false);
             else 
                //If we fail to send the funds to beneficiary, unlock funders balance
                fundingGoalReached = false;
            
        
    

编辑:我忘了提及导致这一点的步骤,也就是令牌创建/股东协会使用指南中提供的代码。

【问题讨论】:

所有代码 sn-p 都应该缩进,以便堆栈溢出 UI 正确显示 【参考方案1】:

我遇到了同样的问题。我通过实际定义 transfer 函数来解决它,因为 ethereum.org 的示例提供了一个空函数。

我替换了这个:

contract token  function transfer(address receiver, uint amount)   

通过这个:

contract token     
    event Transfer(address indexed from, address indexed to, uint256 value);
    function transfer(address _to, uint256 _value) 
        if (_to == 0x0) throw;
        Transfer(msg.sender, _to, _value);
    


对于您的第二个问题,您是否确实确认创建的令牌已实际发送?你向众售合约发送了多少以太币?您的代币似乎使用了两位小数,如果您像示例中那样将“每个代币的以太币成本”定义为 5,那么您不应向众售合约发送少于 0.05 的以太币。

希望对您有所帮助!

【讨论】:

以上是关于以太坊,众筹向钱包返还 0.00 代币的主要内容,如果未能解决你的问题,请参考以下文章

以太坊钱包开发系列4 - 发送Token(代币)

虚拟币钱包以太坊代币技术开发

科普贴 | 以太坊代币钱包MyEtherWallet使用教程,一步步教你玩转MEW

以太坊代币开发虚拟币钱包交易平台开发

以太坊ERC20代币开发

以太坊智能合约--简单众筹项目