code: def estimate_gas(
              self,
              block_identifier,
              function: str,
              *args,
              **kwargs,
      ) -> typing.Optional[int]:
          
          fn = getattr(self.contract.functions, function)
          address = to_checksum_address(self.jsonrpc_client.address)
          if self.jsonrpc_client.eth_node is constants.EthClient.GETH:
              # Unfortunately geth does not follow the ethereum JSON-RPC spec and
              # does not accept a block identifier argument for eth_estimateGas
              # parity and py-evm (trinity) do.
              #
              # Geth only runs estimateGas on the pending block and that's why we
              # should also enforce parity, py-evm and others to do the same since
              # we can't customize geth.
              #
              # Spec: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_estimategas
              # Geth Issue: https://github.com/ethereum/go-ethereum/issues/2586
              # Relevant web3 PR: https://github.com/ethereum/web3.py/pull/1046
              block_identifier = None
          try:
              return fn(*args, **kwargs).estimateGas(
                  transaction={'from': address},
                  block_identifier=block_identifier,
              )
          except ValueError as err:
              action = inspect_client_error(err, self.jsonrpc_client.eth_node)
              will_fail = action in (
                  ClientErrorInspectResult.INSUFFICIENT_FUNDS,
                  ClientErrorInspectResult.ALWAYS_FAIL,
              )
              if will_fail:
                  return None
  
              raise err
docs: Returns a gas estimate for the function with the given arguments or
          None if the function call will fail due to Insufficient funds or
          the logic in the called function.