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);
}
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
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 nextTokenToAssign
Variable 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 nextTokenToAssign
auf 1 gesetzt habe, wurde er während des nachfolgenden Aufrufs der setInitialOwner
Funktion nicht aktualisiert. Die Lösung bestand also einfach darin, die Funktion einfach aufzurufen.
Benutzer19510
Benutzer3708847
Benutzer3708847
web3.eth.getCode(contractAddress);
eine Null zu ergeben. Das ist seltsam, da ich den Vertrag mit Metamask im Ropsten-Netzwerk bereitgestellt habe.Ismael
Benutzer3708847
tokenIdToAssignHex
um 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.Benutzer3708847
nextTokenIdToAssign
musste ich also erneut eine rawTransaction an sendennextTokenIdToAssign
, 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 liegennextTokenFunc(uint256 _tokenId)
, wobei zu berücksichtigen ist, dass sienextTokenIdToAssign
während setInitialOwner mit einer internen Funktion wie geändert wirdnextTokenIdToAssign
.