Low-level delegate call failed. EIP1967

I am trying to deploy an ERC1967 contract using a deployer rather than a plugin ( since eventually, I need to deploy it using solidity contracts ). But contract is not getting created in my test suite.

:1234: Code to reproduce

pragma solidity ^0.8.2;

import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";

contract UnERC20Proxy is ERC1967Proxy {
    constructor(address _logic, bytes memory _data)
        ERC1967Proxy(_logic, _data)

    function getImplementation() public view returns (address) {
        return _implementation();

    function upgradeTo(address newImplementation) external {

Truffle test line:

 unERC20ProxyContract = await unERC20Proxy.new(
          from: accounts[0],


:computer: Environment

  • Truffle
  • Ubuntu 20.4
  • Web3
  • Ganache

Can you check what this evaluates to? web3.utils.asciiToHex("")

Yes. I executed:


The output was:


Both the cases are throughing the same error in the contract deployment.

The problem is that web3.utils.asciiToHex("") is giving you 0x00, and you should be sending in an empty byte array. 0x00 is an array of 1 byte, and the proxy is using it to execute it as if it was an initialization function call.

This looks like a bug in the web3.utils. Try:

 unERC20ProxyContract = await unERC20Proxy.new(
          from: accounts[0],

I already tried that.
The above approach gives the following:
Error: invalid arrayify value (argument="value", value="", code=INVALID_ARGUMENT, version=bytes/5.0.5)

I also tried:

Same delegate call failed error.

Try with "0x" representing an empty byte array.

1 Like

That worked !!!
Will also create an issue on web3 for a fix.
Thank you so much.

1 Like