[Ethereum] How to determine whether the transaction is used for the contract creation

contract-deploymentetherscantransactionsweb3js

I want to monitor Ethereum and memorise every contract published on the blockchain (basically the same thing that Etherscan does). How it is possible to do this using NodeJS & web3? How can I determine whether specific transaction was used to publish a new contract?

It is possible to get the input data, but how do I analyze it?

I'm interested NOT in determining whether the address is a contract address, I'm interested in finding specifically CONTRACT CREATION transactions without having to keep all contracts in my database.

Best Answer

This can be done by checking

  • The transaction's 'to' address, which is zero for contract creation.
  • The 'contractAddress' field from the transaction's receipt.

For example, take a look at the transaction below, notice the 'to' field and 'contractAddress' field.

    > web3.eth.getTransaction("0xf04c0c82bd8e4733e4bcc0ac8e8becf60fad0d99e83883c34887937956a40c3b")

    {
      blockHash:     "0x99efca1a0553673c039a4bdb09f529c0e4feadddf1bdd08753e42a8229774875",
      blockNumber: 90913,
      from: "0x5e0320bb4d82ab8bb5d7291f2c67d1c99abb3c05",
      gas: 1000000,
      gasPrice: 54606694457,
      hash: "0xf04c0c82bd8e4733e4bcc0ac8e8becf60fad0d99e83883c34887937956a40c3b",
      input: "0x60606040526040516020806102518339016040526060805190602001505b806000600050    60003373ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600050819055505b506101ef806100626000396000f30060606040526000357c01000000000000000000000000000000000000000000000000000000009004806390b98a1114610044578063bbd39ac01461007157610042565b005b61005b6004803590602001803590602001506100b3565b6040518082815260200191505060405180910390f35b610082600480359060200150610098565b6040518082815260200191505060405180910390f35b60006000506020528060005260406000206000915090505481565b600081600060005060003373ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000505410156100f557600090506101e9565b81600060005060003373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282825054039250508190555081600060005060008573ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828282505401925050819055507f16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146338484604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1600190506101e9565b92915050560000000000000000000000000000000000000000000000000000000000002710",
      nonce: 6,
      r: "0x524cd0612444308f830c542bdbbc523c5855449103951819028427b9167fd534",
      s: "0x25aa71510d0ca63a1e01d6dad21cfda9755e3792adc3c7554a98c3d5d42fb1c1",
      to: null,
      transactionIndex: 1,
      v: "0x1c",
      value: 0
    }
    > web3.eth.getTransactionReceipt("0xf04c0c82bd8e4733e4bcc0ac8e8becf60fad0d99e83883c34887937956a40c3b")
    {
      blockHash: "0x99efca1a0553673c039a4bdb09f529c0e4feadddf1bdd08753e42a8229774875",
      blockNumber: 90913,
      contractAddress: "0xc4a23a06e6642fa00989b89575f0b9f783259159",
      cumulativeGasUsed: 197451,
      from: "0x5e0320bb4d82ab8bb5d7291f2c67d1c99abb3c05",
      gasUsed: 176451,
      logs: [],
      logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
      root: "0x76ca24aac6c47b5e49b38a227f4892b29aca17cfa273ff57c67ca4f5bd7a37d5",
      to: null,
      transactionHash: "0xf04c0c82bd8e4733e4bcc0ac8e8becf60fad0d99e83883c34887937956a40c3b",
      transactionIndex: 1
    }
Related Topic