Crowdsale

開啟/關閉眾籌並設置新的上限

  • September 20, 2017

嗨,我對 java 和solidity 很陌生,我想知道如何在我的眾籌中創建一個只有我作為契約所有者才能隨時呼叫的函式來打開和關閉眾籌,設置新的上限和新的眾籌時間。

我使用混音進行編碼,目標是創建一個眾籌來獲得資金,以便隨著時間的推移為不同的活動購買特定資產,但在同一個代幣契約上,每個眾籌都有自己增加的上限和時間來完成它。

非常感謝。

這是我的程式碼。

pragma solidity ^0.4.11;

import './IERC20.sol';
import './SafeMath.sol';

contract JoseToken is IERC20 {

   using SafeMath for uint256;

   uint public  _totalSupply = 0;

   string public constant symbol = "VIC";
   string public constant name = "JoseToken";
   uint8 public constant decimals = 18;

   // 1 ether = 500 VIC
   uint256 public constant RATE = 500;

   address public owner;

   mapping(address => uint256) balances;
   mapping(address => mapping(address => uint256)) allowed;

   function () payable {
       createTokens();
   }

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

   function createTokens() payable {
       require(msg.value > 0);

       uint256 tokens = msg.value.mul(RATE);
       balances[msg.sender] = balances[msg.sender].add(tokens);
       _totalSupply = _totalSupply.add(tokens);

       owner.transfer(msg.value);
   }

   function totalSupply () constant returns (uint256 totalSupply) {
       return _totalSupply;
   }

   function balanceOf(address _owner) constant returns (uint256 balance) {
       return balances [_owner];
   }

   function transfer(address _to, uint256 _value) returns (bool success) {
       require(
           balances[msg.sender] >= _value
           && _value > 0
       );
       balances[msg.sender] = balances[msg.sender].sub(_value);
       balances[_to] = balances[_to].add(_value);
       Transfer(msg.sender, _to, _value);
       return true;
   }

   function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
       require(
           allowed[_from][msg.sender] >= _value
           && balances[_from] >= _value
           && _value > 0
       );
       balances[_from] = balances[_from].sub(_value);
       balances[_to] = balances[_to].add(_value);
       allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
       Transfer(_from, _to, _value);
       return true;
   }

   function approve(address _spender, uint256 _value) returns (bool success) {
       allowed[msg.sender][_spender] = _value;
       Approval(msg.sender, _spender, _value);
       return true;
   }

   function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
       return allowed[_owner][_spender];
   }

   event Transfer(address indexed _from, address indexed _to, uint256 _value);
   event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

在克里斯蒂安建議的修改之後這是程式碼:

contract JoseToken is IERC20 {

using SafeMath for uint256;

uint public  _totalSupply = 0;

string public constant symbol = "VIC";
string public constant name = "JoseToken";
uint8 public constant decimals = 18;

bool isEnabled;

// 1 ether = 500 VIC
uint256 public constant RATE = 500;

address public owner;

mapping(address => uint256) balances;
mapping(address => mapping(address => uint256)) allowed;

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

function toggle() isOwner {
   isEnabled = !isEnabled;
}

function () payable {
   createTokens();
}

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

function createTokens() payable {
   require(msg.value > 0);
   require(isEnabled);

   uint256 tokens = msg.value.mul(RATE);
   balances[msg.sender] = balances[msg.sender].add(tokens);
   _totalSupply = _totalSupply.add(tokens);

   owner.transfer(msg.value);
}

function totalSupply () constant returns (uint256 totalSupply) {
   return _totalSupply;
}

function balanceOf(address _owner) constant returns (uint256 balance) {
   return balances [_owner];
}

function transfer(address _to, uint256 _value) returns (bool success) {
   require(
       balances[msg.sender] >= _value
       && _value > 0
   );
   balances[msg.sender] = balances[msg.sender].sub(_value);
   balances[_to] = balances[_to].add(_value);
   Transfer(msg.sender, _to, _value);
   return true;
}

function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
   require(
       allowed[_from][msg.sender] >= _value
       && balances[_from] >= _value
       && _value > 0
   );
   balances[_from] = balances[_from].sub(_value);
   balances[_to] = balances[_to].add(_value);
   allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
   Transfer(_from, _to, _value);
   return true;
}

function approve(address _spender, uint256 _value) returns (bool success) {
   allowed[msg.sender][_spender] = _value;
   Approval(msg.sender, _spender, _value);
   return true;
}

function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
   return allowed[_owner][_spender];
}

event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);

}

應該很簡單。首先,創建一個bool變數來控制眾籌是開啟還是關閉。

bool isEnabled;

然後,如果您想遵循 Solidity 的約定,請創建一個僅允許從您的帳戶進行交易的修飾符:

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

然後創建一個切換功能:

function toggle() isOwner {
   isEnabled = !isEnabled;
}

現在您可以使用該標誌來啟用/禁用您的 crowsale 部分。例如:

function transfer(address _to, uint256 _value) returns (bool success) {
   require(isEnabled);
   ... etc.

您也可以將該檢查放入修飾符中。

引用自:https://ethereum.stackexchange.com/questions/26738