Ich habe hier 2 Lösungen gesehen und sie haben für andere funktioniert, aber sie funktionieren nicht für mich. Ich habe kein Problem damit, das Eigentum an den Crowdsale zu übertragen, aber wie codiere ich es, um das Eigentum an dem Token zurück auf mein Hauptkonto übertragen zu können?
Ich habe eine Funktion dafür erstellt, und sie gibt mir keine Fehler, sie wird sogar ohne Probleme ausgeführt, aber sie ändert nie den Eigentümer. Hier ist der Teilcode meines Crowdsale:
pragma solidity ^0.4.16;
/**
* @title Owned
* @dev The Owned contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Owned {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event TokenOwnershipTransferred(address indexed _newOwner, address indexed _previousOwner);
/**
* @dev The Owned constructor sets the original `owner` of the contract to the sender
* account.
*/
function Owned() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
function transferTokenOwnership(address _newOwner) public onlyOwner {
require(_newOwner != address(0));
emit TokenOwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
interface token {
function mint(address receiver, uint amount) external;
}
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract FCCCrowdsale is Owned{
using SafeMath for uint256;
address public beneficiary;
uint256 public fundingGoal;
uint256 public amountRaised;
uint256 public openingTime;
uint256 public closingTime;
uint256 public initialRate;
uint256 public finalRate;
token public tokenReward;
mapping(address => uint256) public balanceOf;
bool fundingGoalReached = false;
bool crowdsaleClosed = false;
event GoalReached(address recipient, uint totalAmountRaised);
event FundTransfer(address backer, uint amount, bool isContribution);
event Closed();
Wie @btc4cash sagte, können Sie das nicht, es sei denn, Sie schreiben den Crowd-Sale-Vertrag so, dass er das Eigentum zurück übertragen kann.
Sehen Sie sich diesen Beispielcode an:
pragma solidity ^0.4.17;
contract Token{
address public owner;
function transferOwnerShip(address _newOwner) public {
require (msg.sender == owner);
owner = _newOwner;
}
function Token() public{
owner = msg.sender;
}
}
contract Crowdsale{
Token tokenContract;
address crowdsaleOwner;
function Crowdsale(address _tokenAddress) public {
tokenContract = Token(_tokenAddress);
crowdsaleOwner = msg.sender;
}
function transferOwnerShipBack(address _newOwner) public {
require(msg.sender == crowdsaleOwner);
tokenContract.transferOwnerShip(_newOwner);
}
}
Sie können die transferOwnerShipBack
Methode des Crowdsale-Vertrags ausführen, um das Eigentum an einen neuen Benutzer zu übertragen.
PS: Dies war nur zu Demozwecken. Testen Sie vor dem Einsatz in der Produktion.
Bearbeiten 1: Erläuterung zu den Code-Arbeiten Da es sehr klar ist, dass Smart Contracts nur das ausführen können, was ihr Code zulässt. Wenn Sie also das Eigentum an Ihrem Crowdsale-Vertrag übertragen müssen , muss der Crowdsale-Vertrag über eine Methode zur Rückübertragung des Eigentums verfügen. Das obige Codebeispiel macht genau dasselbe.
Lassen Sie mich das ganz klar sagen, es gibt 2 Verträge Token und Crowdsale und beide müssen separat bereitgestellt werden.
Crowdsale contract
. Stellen Sie den Crowdsale-Vertrag von Acc2 bereit.Crowdsale Contract
.Token contract
der Crowdsale-Vertrag Eigentümer ist.transferOwnershipBack
Sie einfach Crowdsale Contract von Acc2 auf und übergeben Sie Acc1 als Argument.Ich habe ein Beispiel für mehrere Konten genommen, nur um zu zeigen, dass beide Verträge unabhängig sind und sich auch dann verhalten können, wenn sie unterschiedliche Eigentümer haben. Sie können dasselbe auch mit einem einzigen Konto tun, wenn Sie die Dinge nicht komplizieren möchten.
transferOwnerShip
Funktion wird in den Token-Vertrag aufgenommen und transferOwnerShipBack
ist im Crowdsale-Vertrag. Beide können denselben Benutzer haben oder nicht. Wenn also das Eigentum an Crowdsale übertragen wird, kann der Crowdsale-Eigentümer es zurück übertragen.token
Schnittstelle, um Ihren Token-Vertrag darzustellen. Daher muss die Schnittstelle die Signatur aller Methoden haben, die Sie verwenden möchten. Fügen Sie einfach eine function transferOwnership(address) external;
Zeile hinzu interface token
und das sollte gut funktionieren.Sie können nicht.
Bearbeiten:
Wie gesagt, was ich mache, ist, dass das ICO das Token im Konstruktor erstellt und der Konstruktor des Tokens selbst die ICO-Adresse als Parameter akzeptiert. Auf diese Weise haben Sie einen Eigentümer UND die ICO-Adresse im Token.
Tatsächlicher Code, den ich sehe, ist, dass nur der Besitzer das Eigentum übertragen kann und nicht auf sich selbst. Nach der Übertragung kann also nur der neue Eigentümer das Eigentum aufgrund des Modifizierers onlyOwner zurückübertragen.
Wenn es diesen Modifikator nicht gäbe, könnte jeder das Eigentum übertragen, was offensichtlich keine gute Idee ist :)
hextet
schüchtern103