Nonce of a smart contract when transaction reverts

When I red the below, I have a question about “CREATE”,

https://docs.openzeppelin.com/cli/2.8/deploying-with-create2

[for regular accounts it is increased on every transaction, while for contract accounts it is increased on every contract creation]

When a transaction from EOA to call a smart contract’s “new contract”, if the transaction was roll backed, The transaction’s Nonce will count up, what about the Nonce of the smart contract?
Will the smart contract’s Nonce count up?

1 Like

Hi @weili,

Welcome to the community forum :wave:.

Thanks for posting here.

I couldn’t find any documentation on what happens, so I tried it locally and when a contract factory creates a contract that reverts on creation, then the transaction count of the contract factory does not increment. The contract factory transaction count increments when a contract is successfully created.

The same happens when a proxy contract is created using Create2 and initialized, the transaction count is incremented. When a proxy contract is created using Create2 and initialization reverts, the transaction count does not increment.

I used the following contracts and obtained the following results:

MyFactory.sol

pragma solidity ^0.5.0;

import "@openzeppelin/upgrades/contracts/upgradeability/ProxyFactory.sol";
import "./MyContract.sol";
import "./MyContractRevert.sol";

contract MyFactory is ProxyFactory {

    function deployMyContract() public {
        new MyContract();
    }

    function deployMyContractRevert() public {
        new MyContractRevert();
    }

    function deploy(uint256 salt, address logic, address admin, bool init) public returns (address) {
        bytes memory payload = abi.encodeWithSignature("initialize(bool)", init);
        deploy(salt, logic, admin, payload);
    }
}

MyContract.sol

pragma solidity ^0.5.0;

contract MyContract {
    function initialize(bool init) public {
        require(init, "MyContract: false");
    }
}

MyContractRevert.sol

pragma solidity ^0.5.0;

contract MyContractRevert {
    constructor() public {
        require(false, "MyContractRevert: false");
    }
}

Setup

truffle(develop)> factory = await MyFactory.new()
truffle(develop)> myContract = await MyContract.new()
truffle(develop)> web3.eth.getTransactionCount(factory.address)
1

Factory creates a contract

truffle(develop)> await factory.deployMyContract()
{ tx: ...
truffle(develop)> web3.eth.getTransactionCount(factory.address)
2

Factory reverts creating a contract

> await factory.deployMyContractRevert()
Thrown:
{ Error: Returned error: VM Exception while processing transaction: revert MyContractRevert: false -- Reason given: MyContractRevert: false.
truffle(develop)> web3.eth.getTransactionCount(factory.address)
2

Factory creates a proxy contract using Create2 and initializes it

truffle(develop)> await factory.deploy(0, myContract.address, accounts[0], true)
{ tx:...
truffle(develop)> web3.eth.getTransactionCount(factory.address)
3

Factory creates a proxy contract using Create2 and initialize reverts

truffle(develop)> await factory.deploy(1, myContract.address, accounts[0], false)
Thrown:
{ Error: Returned error: VM Exception while processing transaction: revert
truffle(develop)> web3.eth.getTransactionCount(factory.address)
3

Hi @weili,

Just wanted to followup to see if you had tried this yourself or had further questions?