Verwenden meiner Vertragsmethode für die ERC20-Tokenübertragung und das Festlegen des ursprünglichen Eigentümers

Ich weiß, dass dies schon an einigen Stellen gefragt wurde, aber ich bin seit einem Tag nicht weitergekommen. Ich habe den folgenden Code, um den ursprünglichen Besitzer meines ERC20-Tokens festzulegen. Ich verwende den folgenden Code in einer POST-Methode, bei der der Benutzer seine Adresse eingeben und ich ihn als Eigentümer festlegen würde.

Ich habe den Vertrag mit Metamask bereitgestellt und das "Von"-Konto ist das gleiche, von dem aus ich ihn bereitgestellt habe. Der testSendAccount ist im Grunde ein Platzhalter, den ich verwende. Gibt es noch etwas, das ich im Code hätte hinzufügen sollen?

Der Code ist folgender:

'use strict';
/*
const config = require('../config');
var Web3 = require('web3');
var web3 = new Web3();
const infuraApi = require('infura')(config.infuraApiKey);
//Set a provider (HttpProvider)
if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  // set the provider you want from Web3.providers
  web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/' + infuraApi));
}

const EthereumTx = require('ethereumjs-tx');
var accountAddressHex = require('metamaskAccount')(config.metamaskAccount.metamaskAddressHex);
var accountAddressPrivateKey  = require('metamaskAccount')(config.metamaskAccount.metamaskAddressPrivateKey);
var privateKey = new Buffer(accountAddressPrivateKey, 'hex')
var count = web3.eth.getTransactionCount(accountAddressHex);
var contractAddress = require('solidityContract')(config.solidityContract.contractAddress);
var contractAbiArray = require('solidityContract')(config.solidityContract.contractABI);
var contract = web3.eth.contract(contractAbiArray).at(contractAddress );

const testSendAccount= [Redacted];
const gasPrice = web3.eth.gasPrice;
const gasPriceHex = web3.toHex(gasPrice);
const gasLimitHex = web3.toHex(3000000);
//const tokenTransferAmount = 1;//EDIT 1

var tokenIdToAssignHex = contract.nextTokenIdToAssign.sendTransaction( {from: accountAddressHex}, function(err, hash){
        if(!err) { tokenIdToAssignHex = hash;
        console.log(tokenIdToAssignHex); }
        else { console.log("Error"); }
      });


 var tokenIdToAssign = contract.nextTokenIdToAssign.call(function(err, res){
          if(!err) { tokenIdToAssign = res;
            console.log(tokenIdToAssign.toNumber()); }
        else { console.log("Error"); }
      });

var rawTransaction = {
    "from": accountAddressHex,
    "nonce": web3.toHex(count),
    "gasPrice": gasPriceHex,
    "gasLimit": gasLimitHex,
    "to": contractAddress,
    "value": "0x0",
    "data": contract.setInitialOwner.getData(testSendAccount, tokenTransferAmount, {from: accountAddressHex}), //contract.transfer.getData("0xCb...", 10, {from: "0x26..."}),
    "chainId": 0x03 //Ropsten id is 3, replace with 1 for main
};
var tx = new EthereumTx(rawTransaction);
tx.sign(privateKey);
var serializedTx = tx.serialize();
web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
    if (!err) { console.log( 'contract creation tx: ' + hash); }
    else {
        console.log(err);
        return;
      }
});

BEARBEITEN 1 Ich habe geändert, const tokenTransferAmount = 1;da const tokenIdToAssign = contract.nextTokenIdToAssign.call();dies die Variable ist, die sich darum kümmert, welches der nächste Token sein sollte, der im Vertrag festgelegt werden soll.

BEARBEITEN 2 Ich habe das tokenToAssign geändert und das hinzugefügt

var tokenIdToAssignHex = contract.nextTokenIdToAssign.sendTransaction( {from: accountAddressHex}, function(err, hash){ if(!err) { tokenIdToAssignHex = hash; console.log(tokenIdToAssignHex); } else { console.log("Error"); } });

BEARBEITEN 3 BEARBEITEN 1

Hier ist der Vertragscode für setInitialOwner:

function setInitialOwner(address _to, uint256 _tokenId) public
    onlyOwner
    tokensRemainingToAssign
    tenKLimit (_tokenId)
    yesZeroAddressOwner (_tokenId) 
    notSelfSend (_to, _tokenId) {

        tokenIdToOwner[_tokenId] = _to;
        balanceOfAddress[_to] = balanceOfAddress[_to].add(1);
        emit Assign(_to, _tokenId);

        tokenIndexArray.push(_tokenId);

        uint256 length = balanceOf(msg.sender);
        ownedTokensIndexMapping[_tokenId] = length;
        addressToTokenIdByIndex[msg.sender][length] = _tokenId;

        nextTokenIdToAssign = nextTokenFunc(nextTokenIdToAssign);
       hypeKillsTokensRemainingToAssign = tokensRemainingToAssign.sub(1);
        }
Funktioniert dein Code? Wenn nicht, was läuft schief?
Der Code funktioniert nicht. Meine Idee war, dass das toAccount nach der Codeausführung das Token in der Metamask-Brieftasche sehen kann, sobald ich das Token in der Benutzeroberfläche hinzufüge. Aber dies scheint nicht der Fall zu sein. Außerdem habe ich eine Zeile im Code bearbeitet, um die nextTokenId zu erhalten. Diese ID sollten wir während der Übertragung verwenden, um genau zu wissen, welche Nummer wir senden, aber wenn ich den Wert von console.log() erhalte, bekomme ich "undefined".
Also habe ich versucht, web3.eth.getCode(contractAddress);eine Null zu ergeben. Das ist seltsam, da ich den Vertrag mit Metamask im Ropsten-Netzwerk bereitgestellt habe.
Haben Sie eine Transaktions-ID? Wird die Transaktion mit Erfolgsstatus abgeschlossen? Erzeugt Ihr ERC20 ein Transfer-Ereignis?
Ich konnte eine Transaktion durchführen. Aber ich kann das nextTokenToAssign nicht mit aktualisieren, tokenIdToAssignHexum die nächste Token-ID zu aktualisieren. So lande ich bei Token 1, das jede weitere Transaktion rückgängig macht. Ich habe das tokenIdToAssignHex hinzugefügt, aber es ergibt einen Fehler.
Ich habe eine Bearbeitung vorgenommen und den Vertragscode hinzugefügt. Um meine zu aktualisieren, nextTokenIdToAssignmusste ich also erneut eine rawTransaction an senden nextTokenIdToAssign, da infura sendTransaction nicht unterstützt. Das Problem an diesem Punkt ist es immer noch nicht zu aktualisieren. Könnte dies an der Setter-Funktion liegen nextTokenFunc(uint256 _tokenId), wobei zu berücksichtigen ist, dass sie nextTokenIdToAssignwährend setInitialOwner mit einer internen Funktion wie geändert wird nextTokenIdToAssign.

Antworten (2)

web3 1.0 API-Änderung.

let myContract = new web3.eth.Contract(abi, contractAddress);
let data = myContract.methods.transfer(toAddress, value).encodeABI();
let rawTx = {
    "nonce": web3.utils.toHex(nonce),
    "gasPrice": "0x3b9aca00",
    "gasLimit": web3.utils.toHex(gasLimit),
    "to": contractAddress,
    "value": "0x00",
    "data": data,
}
const tx = new Tx(rawTx)
tx.sign(privateKey)
let serializedTx = "0x" + tx.serialize().toString('hex');
web3.eth.sendSignedTransaction(serializedTx).on('transactionHash', function (txHash) {

}).on('receipt', function (receipt) {
    console.log("receipt:" + receipt);
}).on('confirmation', function (confirmationNumber, receipt) {
    //console.log("confirmationNumber:" + confirmationNumber + " receipt:" + receipt);
}).on('error', function (error) {

});

Sie können dies sehen: Übertragung von ERC20-Token vom Konto mit web3 über Ropsten

Vielen Dank für den Tipp zur Änderung der web3 1.0-API. Irgendwann muss ich auch auf 1.0 upgraden.

Da andere möglicherweise auf dieses Problem stoßen, werde ich die Lösung posten, zu der ich gekommen bin. Das Problem hier war, dass meine nextTokenToAssignVariable nicht richtig aktualisiert wurde.

Ich habe [myetherwallet.com][1] verwendet, um den Vertrag bereitzustellen und seinen Wert zu überprüfen. Wenn ich den Vertrag bereitgestellt habe und danach die Konstruktorfunktion nicht aufgerufen und den Anfangswert von nextTokenToAssignauf 1 gesetzt habe, wurde er während des nachfolgenden Aufrufs der setInitialOwnerFunktion nicht aktualisiert. Die Lösung bestand also einfach darin, die Funktion einfach aufzurufen.