Ich hatte Probleme mit meinem Smart Contract. Ich möchte jeder Person, die am ICO-Empfehlungsprogramm teilgenommen hat, Empfehlungstoken zuweisen können. Dazu muss der Smart Contract geleistete Beiträge unterscheiden und einem bestimmten Teilnehmer zuordnen können. Ich suche nach einer Möglichkeit, den Smart Contract eindeutige Beitragsadressen für jeden Teilnehmer erstellen zu lassen, der sich für das ICO registriert. Diese Adressen erhalten Beiträge und übertragen sie sofort an die "Haupt"-Vertragsadresse, wodurch jeder Beitrag jedes Beitragenden separat bekannt ist, auch wenn er von mehreren Wallets aus beisteuert. Wie kann ich das machen?
Laut den Kommentaren im OP:
Sie können einem Absender in einem Smart Contract keine neue Adresse zuweisen. Darüber hinaus gibt es innerhalb des Vertrags eine neue Möglichkeit für Sie, zu erfahren, welche Adresse Ihnen gehört. Darüber hinaus ist dies nur meine Sichtweise, Benutzer senden Ether von wo sie wollen, normalerweise von nur einem Konto. Es liegt in ihrer Verantwortung, von wo sie wollen, zu senden, nicht in unserer.
Aber selbst wenn es Ihnen gelingt, Benutzer zu identifizieren, würde ich eine Zuordnung mit einem uint als Schlüssel und einer Zuordnung als Wert erstellen. Diese andere Zuordnung wäre die Liste der Adressen, von denen der Benutzer Ether gesendet hat. Auf diese Weise können Sie Adressen identifizieren.
Sie müssen zwei Verträge haben: Main und Reciever. Hauptvertrag, der die Funktion hat, eine Instanz eines Empfängervertrags zu erstellen und diese Instanz in der Zuordnung zu registrieren, um sicherzustellen, dass wir nur Zahlungen von gültigen Empfängern erhalten.
Der Empfängervertrag implementiert eine standardmäßig zahlbare Fallback-Funktion, die jeden Wert an den Hauptvertrag überträgt. Es gibt nur eine kleine Menge Gas, die standardmäßig für die Zahlungsfunktion verwendet werden kann, wenn ETH gesendet wird, sodass Sie Ihre Benutzer bitten können, eine spezielle Funktion aufzurufen, um ihre Zahlungen zu leisten. Ich habe es PayTransfer genannt. Arbeitscode, getestet auf Remix ist unten. Um es zu testen, müssen Sie:
Dann müssen Sie eine Zahlung an den Empfängervertrag leisten. In Remix können Sie den PaymentReceiver-Vertrag an die Adresse anhängen, die Sie im vorherigen Schritt erhalten haben. Verwenden Sie die Schaltfläche An Adresse.
Sobald die Zahlung erfolgt ist, können Sie Ihren Hauptvertragssaldo, den Empfängersaldo und den Beitragswert des Empfängers zum Hauptvertrag mit den folgenden Funktionen überprüfen:
Falls die standardmäßig zahlbare Fallback-Funktion nicht funktioniert (funktioniert auf Remix), können Sie entweder Ihre Kunden bitten, die PayTransfer-Funktion aufzurufen, um ihre Zahlungen zu leisten, oder die Fallback-Funktion ändern, um msg.value nicht an den Hauptvertrag zu übertragen, und die RetrievePayment-Funktion verwenden, um ETH zu Ihrem zu übertragen Hauptvertrag (in diesem Fall müssen Sie für Gas bezahlen).
Hoffe das hilft.
pragma solidity ^0.4.24;
contract PaymentReceiver {
Main public main;
function () payable {
main.ReceivePayment.value(msg.value)();
}
function PayTransfer() public payable {
main.ReceivePayment.value(msg.value)();
}
function RetreivePayment() public {
main.ReceivePayment.value(address(this).balance)();
}
constructor() public {
main = Main( msg.sender);
}
}
contract Main {
event NewReceiver(address receiver);
event ReceivedPayment(address receiver, uint256 value);
mapping(address => uint256) contributions;
mapping (address=>bool) validReceiver;
address public lastReceiver;
function ReceivePayment() public payable {
require (validReceiver[msg.sender]);
contributions[msg.sender] = contributions[msg.sender] + msg.value;
emit ReceivedPayment(msg.sender,msg.value);
}
function AddReceiver() public {
PaymentReceiver receiver = new PaymentReceiver();
validReceiver[address(receiver)] = true;
lastReceiver = address(receiver);
emit NewReceiver(receiver);
}
function MyBalance() public view returns (uint) {
return address(this).balance;
}
function ReceiverBalance(address receiver) public view returns (uint256) {
require(validReceiver[receiver]);
return address(receiver).balance;
}
function ReceiverContribution(address receiver) public view returns (uint256) {
return contributions[address(receiver)];
}
}
Wiederholung 122442
Papi Junior
Wiederholung 122442
Papi Junior
Papi Junior