return new Bluebird((resolve, reject) => {

                const ethereumTransaction = new EthereumTransaction({
                  to: transaction.tx.to,
                  from: transaction.tx.from,
                  data: transaction.tx.data,
                  value: transaction.tx.value,
                  gasLimit: transaction.tx.gasLimit,
                  gasPrice: transaction.tx.gasPrice,

                  nonce: job.data.currentNonce,
                })

                ethereumTransaction.sign(config.blockchain.signerPrivateKeyBuffer)

                const transactionData = `0x${ethereumTransaction.serialize().toString('hex')}`

                eth.sendSignedTransaction(transactionData)
                  .once('transactionHash', (transactionHash) => {

                    transaction.tx.hash = transactionHash
                    transaction.status = 'pending'

                    transaction.markModified('tx')
                    transaction.save()

                    // increase the nonce after we know this transaction was
                    //  submitted to the blockchain successfully
                    job.data.currentNonce += 1

                    resolve()

                  })
                  .on('error', (error) => {

                    logger.error(`[${this.name}]`, `sendTransaction failed for ${transaction.id}:`, error)

                    transaction.tx.error = error.toString()
                    transaction.status = 'error'

                    transaction.markModified('tx')
                    transaction.save()

                    // sometimes an error event is emitted when the nonce should
                    //  NOT increase (for example, bad TX params?), so we can't
                    //  reliably increment the nonce here - instead let's just
                    //  get the current TX count and set the nonce to that
                    return eth.getTransactionCount(config.blockchain.signerPublicAddress)
                      .then((currentNonce) => {
                        job.data.currentNonce = currentNonce
                        // @NOTE: don't reject when there's an error, since we
                        //  don't want to prevent any subsequent transactions in
                        //  this batch from running - just marking the
                        //  transaction as failed is good enough for now
                        resolve()
                      })
                  })

              })
      .then((job) => {

        if (job) {
          return job
        }

        logger.verbose(`[${this.name}] no job found, creating a new one`)

        return eth.getTransactionCount(config.blockchain.signerPublicAddress)
          .then((currentNonce) => {
            return models.Job.create({
              name: this.name,
              data: {
                currentNonce,
              },
            })
          })

      })
                  .on('error', (error) => {

                    logger.error(`[${this.name}]`, `sendTransaction failed for ${transaction.id}:`, error)

                    transaction.tx.error = error.toString()
                    transaction.status = 'error'

                    transaction.markModified('tx')
                    transaction.save()

                    // sometimes an error event is emitted when the nonce should
                    //  NOT increase (for example, bad TX params?), so we can't
                    //  reliably increment the nonce here - instead let's just
                    //  get the current TX count and set the nonce to that
                    return eth.getTransactionCount(config.blockchain.signerPublicAddress)
                      .then((currentNonce) => {
                        job.data.currentNonce = currentNonce
                        // @NOTE: don't reject when there's an error, since we
                        //  don't want to prevent any subsequent transactions in
                        //  this batch from running - just marking the
                        //  transaction as failed is good enough for now
                        resolve()
                      })
                  })