"Error: cuenta del remitente no reconocida" al llamar a transferFrom() en un contrato ERC721

Tengo un problema al transferir la propiedad de un token ERC721 a un contrato Holding implementado.

El error que obtengo al ejecutar truffle testes el siguiente: Error: sender account not recognizedal llamar a la transferFrom()función en el contrato ERC721 utilizando el contrato Holding implementado.

Aprobé con éxito el contrato Holding antes de llamar, transferFrom()por lo que ese no es el problema, pero no sé dónde está el error al intentar transferir el NFT al contrato Holding.

Los contratos y el archivo de prueba se encuentran aquí: https://github.com/sharad-s/DAOjo

La línea específica de código que está causando este error en mis pruebas es la línea 120 deDAOjo/test/test.js

Para recrear este error:

  • Clonar repositorio
  • Instalar trufa globalmente
  • Ejecute una instancia de blockchain local de ganache (puerto 8545)
  • Ejecutar truffle testen la raíz de este repositorio

El siguiente es el seguimiento de la pila de errores:

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)

¡Gracias!

Respuestas (1)

Solo puede enviar transacciones froma una cuenta para la que su nodo (ganache, en este caso) conozca la clave privada. En este código:

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

está intentando enviar una transacción desde la dirección de un contrato, lo cual no puede hacer. (Nadie conoce la clave privada de esa dirección).

¡Lo tengo. Gracias! Resolví esto llamando a la función transferFrom() {from: houseOwner} que definí como la dirección [0] proporcionada por ganache, que también poseía el NFT destinado a la transferencia.