ERC20 代币。无法获取变量,也无法使用已部署合同的方法
ERC20 token. Cannot get variable nor use methods with deployed contract
我已经通过 Metamask 在 Ropsten 网络上部署了 ERC20 代币合约。问题是我试图通过 web3 与它交互。我遵循了 SO 和 SE 中提供的与令牌传输和方法调用相关的答案。
如你所见,我不是在这里转移代币,而是使用我的 solidity 合约方法来设置代币的初始所有者。合约中的方法接收 2 个参数,一个地址和一个 tokenId。
当我使用代码将令牌转移到测试 Metamask 帐户时,它失败了,从某种意义上说,如果我进入这个测试帐户并导入令牌,它有 none.
作为参考,这个 tokenId 基本上是由我的变量 nextTokenIdToAssign 提供的,我这样称呼它:
const tokenIdToAssign = contract.nextTokenIdToAssign.call(function(err, res){
if(!err) { tokenIdToAssign = res; }
else { console.log("Error"); }
});
奇怪的是,当我尝试 console.log 时,它 returns 未定义。此外,在 this question 的问题评论之后,我使用了
const test = web3.eth.getCode(contractAddress);
它只是 returns 一个空值。评论表明我的构造函数或父构造函数发生崩溃。
我在这里遗漏了一些重要的细节吗?
完整代码如下:
const config = require('../config');
var Web3 = require('web3');
var web3 = new Web3();
const infuraApi = (config.infura.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 = (config.metamaskAccount.metamaskAddressHex);
var accountAddressPrivateKey = (config.metamaskAccount.metamaskAddressPrivateKey);
var privateKey = new Buffer(accountAddressPrivateKey, 'hex');
var count = web3.eth.getTransactionCount(accountAddressHex);
var contractAddress = (config.solidityContract.contractAddress);
var contractAbiArray = (config.solidityContract.contractABI);
var contract = web3.eth.contract(contractAbiArray).at(contractAddress);
const testSendAccount= "0x...";
const gasPrice = web3.eth.gasPrice;
const gasPriceHex = web3.toHex(gasPrice);
const gasLimitHex = web3.toHex(30000000);
//const tokenTransferAmount = 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; }
else { console.log("Error"); }
});
const test = web3.eth.getCode(contractAddress);
var rawTransaction = {
"from": accountAddressHex,
"nonce": web3.toHex(count),
"gasPrice": gasPriceHex,
"gasLimit": gasLimitHex,
"to": contractAddress,
"value": "0x0",
"data": contract.setInitialOwner.getData(testSendAccount, tokenIdToAssign, {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;
}
});
编辑 1
这里是 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);
}
编辑 2
我已经更改了 tokenToAssign 并添加了
var tokenIdToAssignHex = contract.nextTokenIdToAssign.sendTransaction( {from: accountAddressHex}, function(err, hash){
if(!err) { tokenIdToAssignHex = hash;
console.log(tokenIdToAssignHex); }
else { console.log("Error"); }
});
由于其他人可能会遇到此问题,我将 post 我得出的解决方案。这里的问题是我的 nextTokenToAssign
变量没有正确更新。
我使用 myetherwallet.com 部署合约并检查其价值。我在部署合约的时候,如果之后没有调用构造函数,将nextTokenToAssign
的初始值设置为1,那么在后续调用setInitialOwner
函数的过程中,它不会更新。所以解决方案就是简单地调用函数。
我已经通过 Metamask 在 Ropsten 网络上部署了 ERC20 代币合约。问题是我试图通过 web3 与它交互。我遵循了 SO 和 SE 中提供的与令牌传输和方法调用相关的答案。
如你所见,我不是在这里转移代币,而是使用我的 solidity 合约方法来设置代币的初始所有者。合约中的方法接收 2 个参数,一个地址和一个 tokenId。
当我使用代码将令牌转移到测试 Metamask 帐户时,它失败了,从某种意义上说,如果我进入这个测试帐户并导入令牌,它有 none.
作为参考,这个 tokenId 基本上是由我的变量 nextTokenIdToAssign 提供的,我这样称呼它:
const tokenIdToAssign = contract.nextTokenIdToAssign.call(function(err, res){
if(!err) { tokenIdToAssign = res; }
else { console.log("Error"); }
});
奇怪的是,当我尝试 console.log 时,它 returns 未定义。此外,在 this question 的问题评论之后,我使用了
const test = web3.eth.getCode(contractAddress);
它只是 returns 一个空值。评论表明我的构造函数或父构造函数发生崩溃。
我在这里遗漏了一些重要的细节吗?
完整代码如下:
const config = require('../config');
var Web3 = require('web3');
var web3 = new Web3();
const infuraApi = (config.infura.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 = (config.metamaskAccount.metamaskAddressHex);
var accountAddressPrivateKey = (config.metamaskAccount.metamaskAddressPrivateKey);
var privateKey = new Buffer(accountAddressPrivateKey, 'hex');
var count = web3.eth.getTransactionCount(accountAddressHex);
var contractAddress = (config.solidityContract.contractAddress);
var contractAbiArray = (config.solidityContract.contractABI);
var contract = web3.eth.contract(contractAbiArray).at(contractAddress);
const testSendAccount= "0x...";
const gasPrice = web3.eth.gasPrice;
const gasPriceHex = web3.toHex(gasPrice);
const gasLimitHex = web3.toHex(30000000);
//const tokenTransferAmount = 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; }
else { console.log("Error"); }
});
const test = web3.eth.getCode(contractAddress);
var rawTransaction = {
"from": accountAddressHex,
"nonce": web3.toHex(count),
"gasPrice": gasPriceHex,
"gasLimit": gasLimitHex,
"to": contractAddress,
"value": "0x0",
"data": contract.setInitialOwner.getData(testSendAccount, tokenIdToAssign, {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;
}
});
编辑 1
这里是 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);
}
编辑 2 我已经更改了 tokenToAssign 并添加了
var tokenIdToAssignHex = contract.nextTokenIdToAssign.sendTransaction( {from: accountAddressHex}, function(err, hash){
if(!err) { tokenIdToAssignHex = hash;
console.log(tokenIdToAssignHex); }
else { console.log("Error"); }
});
由于其他人可能会遇到此问题,我将 post 我得出的解决方案。这里的问题是我的 nextTokenToAssign
变量没有正确更新。
我使用 myetherwallet.com 部署合约并检查其价值。我在部署合约的时候,如果之后没有调用构造函数,将nextTokenToAssign
的初始值设置为1,那么在后续调用setInitialOwner
函数的过程中,它不会更新。所以解决方案就是简单地调用函数。