Deployment failed on Rinkeby: “ERC721PresetMinterPauserAutoId” hit an invalid opcode

I can deploy on Ganache ([DRAFT] Create an NFT and deploy to a public testnet, using Truffle) but on Rinkeby I get this error;

2_deploy.js

Deploying ‘ERC721PresetMinterPauserAutoId’

Error: *** Deployment Failed ***

“ERC721PresetMinterPauserAutoId” hit an invalid opcode while deploying. Try:

  • Verifying that your constructor params satisfy all assert conditions.
  • Verifying your constructor code doesn’t access an array out of bounds.
  • Adding reason strings to your assert statements.
at C:\Users\iando\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\truffle-deployer\src\deployment.js:364:1
at <anonymous>

Truffle v5.0.5 (core: 5.0.5)
Node v9.10.0

What should I do?

1 Like

Hi @madeindreams,

I am sorry that you had this issue.

I wasn’t able to reproduce the error. I suspected that node v9 may be an issue but I was able to deploy with node v9.

Can you share your truffle-config.js (please don’t include any API keys or mnemonics)

Whilst I didn’t have issues with the versions you were using, I suggest updating node to version 10 or 12 and update to the latest version of truffle (5.1.47).

My truffle-config.js is as follows:

truffle-config.js

/**
 * Use this file to configure your truffle project. It's seeded with some
 * common settings for different networks and features like migrations,
 * compilation and testing. Uncomment the ones you need or modify
 * them to suit your project as necessary.
 *
 * More information about configuration can be found at:
 *
 * trufflesuite.com/docs/advanced/configuration
 *
 * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider)
 * to sign your transactions before they're sent to a remote public node. Infura accounts
 * are available for free at: infura.io/register.
 *
 * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate
 * public/private key pairs. If you're publishing your code to GitHub make sure you load this
 * phrase from a file you've .gitignored so it doesn't accidentally become public.
 *
 */

// const HDWalletProvider = require('@truffle/hdwallet-provider');
// const infuraKey = "fj4jll3k.....";
//
// const fs = require('fs');
// const mnemonic = fs.readFileSync(".secret").toString().trim();
const { projectId, mnemonic } = require('./secrets.json');
const HDWalletProvider = require('@truffle/hdwallet-provider');

module.exports = {
  /**
   * Networks define how you connect to your ethereum client and let you set the
   * defaults web3 uses to send transactions. If you don't specify one truffle
   * will spin up a development blockchain for you on port 9545 when you
   * run `develop` or `test`. You can ask a truffle command to use a specific
   * network from the command line, e.g
   *
   * $ truffle test --network <network-name>
   */

  networks: {
    // Useful for testing. The `development` name is special - truffle uses it by default
    // if it's defined here and no other network is specified at the command line.
    // You should run a client (like ganache-cli, geth or parity) in a separate terminal
    // tab if you use this network and you must also set the `host`, `port` and `network_id`
    // options below to some value.
    //
    // development: {
    //  host: "127.0.0.1",     // Localhost (default: none)
    //  port: 8545,            // Standard Ethereum port (default: none)
    //  network_id: "*",       // Any network (default: none)
    // },
    // Another network with more advanced options...
    // advanced: {
    // port: 8777,             // Custom port
    // network_id: 1342,       // Custom network
    // gas: 8500000,           // Gas sent with each transaction (default: ~6700000)
    // gasPrice: 20000000000,  // 20 gwei (in wei) (default: 100 gwei)
    // from: <address>,        // Account to send txs from (default: accounts[0])
    // websockets: true        // Enable EventEmitter interface for web3 (default: false)
    // },
    // Useful for deploying to a public network.
    // NB: It's important to wrap the provider as a function.
    // ropsten: {
    // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
    // network_id: 3,       // Ropsten's id
    // gas: 5500000,        // Ropsten has a lower block limit than mainnet
    // confirmations: 2,    // # of confs to wait between deployments. (default: 0)
    // timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
    // skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    // },
    // Useful for private networks
    // private: {
    // provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
    // network_id: 2111,   // This network is yours, in the cloud.
    // production: true    // Treats this network as if it was a public net. (default: false)
    // }
    rinkeby: {
      provider: () => new HDWalletProvider(mnemonic, `https://rinkeby.infura.io/v3/${projectId}`),
      network_id: 4,       // Rinkeby's id
      gas: 8500000,        
      gasPrice: 1000000000,  // 1 gwei (in wei) (default: 100 gwei)
      confirmations: 2,    // # of confs to wait between deployments. (default: 0)
      timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
      skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    },
  },

  // Set default mocha options here, use special reporters etc.
  mocha: {
    // timeout: 100000
  },

  // Configure your compilers
  compilers: {
    solc: {
      // version: "0.5.1",    // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
      // settings: {          // See the solidity docs for advice about optimization and evmVersion
      //  optimizer: {
      //    enabled: false,
      //    runs: 200
      //  },
      //  evmVersion: "byzantium"
      // }
    },
  },
};

As an aside, I recommend using Windows Subsystem for Linux (WSL) for smart contract development: Solidity Smart Contract development on Windows

require('dotenv').config();

const HDWalletProvider = require('truffle-hdwallet-provider-privkey');

const privateKeys = process.env.PRIVATE_KEYS

module.exports = {

  networks: {

    development: {

      host: "127.0.0.1",

      port: 7545,

      network_id: "*" // Match any network id

    },

    kovan: {

      provider: function(){

        return new HDWalletProvider(

          privateKeys.split(','),

          `https://kovan.infura.io/v3/${process.env.INFURA_API_KEY}`

        )

      },

      gas: 5000000,

      gasPrice: 25000000000,

      network_id: 42

    },

    rinkeby: {

      provider: function(){

        return new HDWalletProvider(

          privateKeys.split(','),

          `https://rinkeby.infura.io/v3/${process.env.INFURA_API_KEY}`

        )

      },

      gas: 5000000,

      gasPrice: 25000000000,

      network_id: 4

    }

  },

  // Set default mocha options here, use special reporters etc.

  mocha: {

    // timeout: 100000

  },

  // Configure your compilers

  compilers: {

    solc: {

      // version: "0.5.1",    // Fetch exact version from solc-bin (default: truffle's version)

      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)

      // settings: {          // See the solidity docs for advice about optimization and evmVersion

      //  optimizer: {

      //    enabled: false,

      //    runs: 200

      //  },

      //  evmVersion: "byzantium"

      // }

    }

  }

}
1 Like

I got it! i needed to add
skipDryRun: true

1 Like

Hi @madeindreams,

Glad you were able to resolve.

I didn’t have any issues with doing a dry run (using @truffle/hdwallet-provider).
I would still recommend upgrading node to 10 or 12 and Truffle to the latest version.

Feel free to ask all the questions that you need.

1 Like

2 posts were split to a new topic: How to provide metadata for ERC721