首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法检查空投令牌

无法检查空投令牌
EN

Ethereum用户
提问于 2017-11-20 11:31:45
回答 2查看 3K关注 0票数 0

我用Mist ()来尝试这个。

创建了一个与给定的这里相同的合同。为了快速理解,我把它贴在下面。我从创建令牌的同一个所有者创建了这个契约。

代码语言:javascript
复制
pragma solidity ^0.4.16;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control 
 * functions, this simplifies the implementation of "user permissions". 
 */
contract Ownable {
  address public owner;

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

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

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

}

contract ERC20Basic {
  uint public totalSupply;
  function balanceOf(address who) constant returns (uint);
  function transfer(address to, uint value);
  event Transfer(address indexed from, address indexed to, uint value);
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) constant returns (uint);
  function transferFrom(address from, address to, uint value);
  function approve(address spender, uint value);
  event Approval(address indexed owner, address indexed spender, uint value);
}

contract Airdropper is Ownable {

    function multisend(address _tokenAddr, address[] dests, uint256[] values)
    onlyOwner
    returns (uint256) {
        uint256 i = 0;
        while (i < dests.length) {
           ERC20(_tokenAddr).transfer(dests[i], values[i]);
           i += 1;
        }
        return(i);
    }
}

已经按照下面的图像执行了Multisend函数。

函数将被执行,但似乎没有一个地址已经接收到令牌。事务哈希为0xeb759ea8f6c923874adfc6961555733b36982f5d770dd24bf85456b534d2e2f9

我遗漏了什么?任何帮助都是非常感谢的。

EN

回答 2

Ethereum用户

回答已采纳

发布于 2017-11-22 07:46:22

这个答案适用于那些以前创建令牌的人,他们希望在令牌中添加空投功能,并愿意通过Mist执行drop。它可能也能用其他方法,但没有经过测试。

不知道为什么上述方法(如问题中所述)不起作用。然而,下面的一个为我工作。我把它作为答案,这样对有类似问题的人是有帮助的。这个在rinkeby工作到最多174个阵列项目,消耗了3991732气体。

备注

  1. 持有令牌的令牌契约的所有者必须将令牌发送到此契约地址以使其正常工作。
  2. 替换构造函数中令牌的地址。
代码语言:javascript
复制
pragma solidity ^0.4.16;

contract Ownable {

  address public owner;

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

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

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

interface Token {
  function transfer(address _to, uint256 _value) returns (bool);
  function balanceOf(address _owner) constant returns (uint256 balance);
}

contract AirDrop is Ownable {

  Token token;
     
  event TransferredToken(address indexed to, uint256 value);
  event FailedTransfer(address indexed to, uint256 value);

  modifier whenDropIsActive() {
    assert(isActive());

    _;
  }

  function AirDrop () {
      address _tokenAddr = 0x; //here pass address of your token
      token = Token(_tokenAddr);
  }
  
  function isActive() constant returns (bool) {
    return (
        tokensAvailable() > 0 // Tokens must be available to send
    );
  }
  //below function can be used when you want to send every recipeint with different number of tokens
  function sendTokens(address[] dests, uint256[] values) whenDropIsActive onlyOwner external {
    uint256 i = 0;
    while (i < dests.length) {
        uint256 toSend = values[i] * 10**18;
        sendInternally(dests[i] , toSend, values[i]);
        i++;
    }
  }

  // this function can be used when you want to send same number of tokens to all the recipients
  function sendTokensSingleValue(address[] dests, uint256 value) whenDropIsActive onlyOwner external {
    uint256 i = 0;
    uint256 toSend = value * 10**18;
    while (i < dests.length) {
        sendInternally(dests[i] , toSend, value);
        i++;
    }
  }  

  function sendInternally(address recipient, uint256 tokensToSend, uint256 valueToPresent) internal {
    if(recipient == address(0)) return;

    if(tokensAvailable() >= tokensToSend) {
      token.transfer(recipient, tokensToSend);
      TransferredToken(recipient, valueToPresent);
    } else {
      FailedTransfer(recipient, valueToPresent); 
    }
  }   


  function tokensAvailable() constant returns (uint256) {
    return token.balanceOf(this);
  }

  function destroy() onlyOwner {
    uint256 balance = tokensAvailable();
    require (balance > 0);
    token.transfer(owner, balance);
    selfdestruct(owner);
  }
}
票数 3
EN

Ethereum用户

发布于 2017-11-20 12:26:19

我想你应该把地址写成双引号。

代码语言:javascript
复制
"0xaa..","0xbb.."

如果您查看以太扫描上链接事务底部的输入数据,您将看到输入数据包含"64“、"c8”等,这是您的十六进制值,但是地址丢失了。

更新:抱歉,这可能是Mist中的ui错误,请看这个问题(仍然是打开的):https://github.com/ethereum/mist/issues/3054 -根据答复,它应该与引号一起工作,但显然不是。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/31185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档