Маркер ERC20. Невозможно получить переменную или использовать методы с развернутым контрактом

Я развернул контракт с токеном ERC20 через Metamask в сети Ropsten. Проблема в том, что я пытаюсь взаимодействовать с ним через web3. Я следил за ответами в SO и SE, касающимися передачи токенов и вызова методов.

Как вы увидите, я не передаю токены здесь, но я использую свой метод договора о солидности, чтобы установить первоначальных владельцев токена. Метод в контракте получает 2 аргумента, адрес и также tokenId.

Когда я использую код для переноса токена в тестовую учетную запись Metamask, происходит сбой, в том смысле, что, если я вхожу в эту тестовую учетную запись и импортирую токен, у него его нет.

Для справки, этот tokenId, в основном, предоставляется моей переменной nextTokenIdToAssign, которую я называю так:

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

Как ни странно, когда я пытаюсь открыть console.log, он возвращается как неопределенный. Кроме того, после комментариев к вопросу, этот вопрос я использовал

const test = web3.eth.getCode(contractAddress);

Это просто возвращает ноль. Комментарии предполагают, что есть сбой в моем конструкторе или родительском конструкторе.

Есть ли какая-то важная деталь, которую я здесь упускаю?

Полный код следующий:

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"); }
  });

1 ответ

Решение

Поскольку другие могут столкнуться с этой проблемой, я опубликую решение, к которому я пришел. Проблема заключалась в том, что мой nextTokenToAssign переменная не обновлялась должным образом.

Я использовал http://myetherwallet.com/ для развертывания контракта и проверки его стоимости. Когда я развернул контракт, если впоследствии я не вызывал функцию конструктора, устанавливая начальное значение nextTokenToAssign 1, он не будет обновляться во время последовательного вызова setInitialOwner функция. Таким образом, решение было просто вызвать функцию.

Другие вопросы по тегам