«Ошибка: учетная запись отправителя не распознана» при вызове TransferFrom() по контракту ERC721

У меня возникла проблема с передачей права собственности на токен ERC721 развернутому контракту на хранение.

Ошибка, которую я получаю при запуске, truffle testследующая: Error: sender account not recognizedпри вызове transferFrom()функции в контракте ERC721 с использованием развернутого контракта Holding.

Я успешно одобрил Холдинговый контракт перед звонком, transferFrom()так что это не проблема, но я не знаю, где ошибка при попытке перевести NFT в Холдинговый контракт.

Контракты и тестовый файл находятся здесь: https://github.com/sharad-s/DAOjo

Конкретная строка кода, которая вызывает эту ошибку в моих тестах, - это строка 120 изDAOjo/test/test.js

Чтобы воссоздать эту ошибку:

  • Клонировать репозиторий
  • Установить трюфель глобально
  • Запустите экземпляр локальной цепочки блоков ganache (порт 8545)
  • Запустите truffle testв корне этого репо

Ниже приведена трассировка стека ошибок:

Contract: Crowdsale
DAOToken
1e+23
      ✓ should have a total supply of: 1e+23
      ✓ should have transferred 1e+23 to Crowdsale
    Crowdsale
Wei Raised:  1000000000000000000
Buyer Balance:  1000000000000000000
      ✓ should accept ETH payments (144ms)

Contract: NFTTokenMetaDataEnumerableMock
  NFT RegistryShould have a total of 0 tokens when created
NFT APPROVED FOR:  0x3a0a837952964bdf3e751ba838e04b9a1752d94a
HOUSE OWNER:  0x6e4679ddb735556a47dd548489dfab641752afd5
SPV:  0x3a0a837952964bdf3e751ba838e04b9a1752d94a
DAO TOKEN BALANCE OF BUYER 1:  BigNumber { s: 1, e: 3, c: [ 1000 ] }
      1) Should approve and transfer token to SPV contract

    Events emitted during test:
    ---------------------------

    Transfer(from: <indexed>, to: <indexed>, value: 1000)
    Transfer(from: <indexed>, to: <indexed>, value: 1000)
    Transfer(from: <indexed>, to: <indexed>, value: 1000)
    Transfer(from: <indexed>, to: <indexed>, value: 0)
    Approval(owner: <indexed>, spender: <indexed>, value: 0)

    ---------------------------


  4 passing (3s)
  1 failing

  1) Contract: NFTTokenMetaDataEnumerableMock
       NFT Registry
         Should approve and transfer token to SPV contract:
 Error: sender account not recognized
  at Object.InvalidResponse (/Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
  at /Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
  at /Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/packages/truffle-provider/wrapper.js:134:1
  at XMLHttpRequest.request.onreadystatechange (/Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
  at XMLHttpRequestEventTarget.dispatchEvent (/Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
  at XMLHttpRequest._setReadyState (/Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
  at XMLHttpRequest._onHttpResponseEnd (/Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
  at IncomingMessage.<anonymous> (/Users/sharad/.nvm/versions/node/v8.9.4/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:469:1)
  at endReadableNT (_stream_readable.js:1055:12)
  at _combinedTickCallback (internal/process/next_tick.js:138:11)
  at process._tickCallback (internal/process/next_tick.js:180:9)

Спасибо!

Ответы (1)

Вы можете отправлять транзакции только fromтой учетной записи, для которой ваш узел (в данном случае ganache) знает закрытый ключ. В этом коде:

const transferFrom = await _HouseNFTRegistry.transferFrom(
    houseOwner,
    _spvHoldingCrowdsale.address,
    1,
    { from: _spvHoldingCrowdsale.address, to: _HouseNFTRegistry.address }
);

вы пытаетесь отправить транзакцию с адреса контракта, чего не можете сделать. (Никто не знает закрытый ключ для этого адреса.)

Понял. Спасибо! Я решил эту проблему, вызвав функцию transferFrom() {from: houseOwner}, которую я определил как адрес [0], полученный от ganache, которому также принадлежал NFT, предназначенный для передачи.