Example #1
0
    it('will not error and return the transaction hash', function(done) {

      // create and sign the transaction
      var tx = bitcore.Transaction();
      tx.from(utxos[0]);
      tx.change(privateKey.toAddress());
      tx.to(destKey.toAddress(), utxos[0].amount * 1e8 - 1000);
      tx.sign(bitcore.PrivateKey.fromWIF(utxos[0].privateKeyWIF));

      // test sending the transaction
      bitcoind.sendTransaction(tx.serialize(), function(err, hash) {
        if (err) {
          return done(err);
        }
        hash.should.equal(tx.hash);
        done();
      });

    });
Example #2
0
    it('will emit "tx" events', function(done) {
      var tx = bitcore.Transaction();
      tx.from(utxos[2]);
      tx.change(privateKey.toAddress());
      tx.to(destKey.toAddress(), utxos[2].amount * 1e8 - 1000);
      tx.sign(bitcore.PrivateKey.fromWIF(utxos[2].privateKeyWIF));

      var serialized = tx.serialize();

      bitcoind.once('tx', function(buffer) {
        buffer.toString('hex').should.equal(serialized);
        done();
      });
      bitcoind.sendTransaction(serialized, function(err, hash) {
        if (err) {
          return done(err);
        }
        should.exist(hash);
      });
    });
Example #3
0
      before(function(done) {
        /* jshint maxstatements: 50 */

        // Finished once all blocks have been mined
        var startHeight = node.services.bitcoind.height;
        node.services.bitcoind.on('tip', function(height) {
          if (height === startHeight + 5) {
            done();
          }
        });

        testKey2 = bitcore.PrivateKey.fromWIF('cNfF4jXiLHQnFRsxaJyr2YSGcmtNYvxQYSakNhuDGxpkSzAwn95x');
        address2 = testKey2.toAddress(regtest).toString();

        testKey3 = bitcore.PrivateKey.fromWIF('cVTYQbaFNetiZcvxzXcVMin89uMLC43pEBMy2etgZHbPPxH5obYt');
        address3 = testKey3.toAddress(regtest).toString();

        testKey4 = bitcore.PrivateKey.fromWIF('cPNQmfE31H2oCUFqaHpfSqjDibkt7XoT2vydLJLDHNTvcddCesGw');
        address4 = testKey4.toAddress(regtest).toString();

        testKey5 = bitcore.PrivateKey.fromWIF('cVrzm9gCmnzwEVMGeCxY6xLVPdG3XWW97kwkFH3H3v722nb99QBF');
        address5 = testKey5.toAddress(regtest).toString();

        testKey6 = bitcore.PrivateKey.fromWIF('cPfMesNR2gsQEK69a6xe7qE44CZEZavgMUak5hQ74XDgsRmmGBYF');
        address6 = testKey6.toAddress(regtest).toString();

        var tx = new Transaction();
        tx.from(unspentOutput);
        tx.to(address, 1 * 1e8);
        tx.to(address, 2 * 1e8);
        tx.to(address, 0.5 * 1e8);
        tx.to(address, 3 * 1e8);
        tx.fee(10000);
        tx.change(address);
        tx.sign(testKey);

        unspentOutputSpentTxId = tx.id;

        function mineBlock(next) {
          client.generate(1, function(err, response) {
            if (err) {
              throw err;
            }
            should.exist(response);
            next();
          });
        }

        node.sendTransaction(tx.serialize(), function(err, hash) {
          if (err) {
            return done(err);
          }

          client.generate(1, function(err, response) {
            if (err) {
              throw err;
            }
            should.exist(response);

            node.getAddressUnspentOutputs(address, false, function(err, results) {
              /* jshint maxstatements: 50 */
              if (err) {
                throw err;
              }
              results.length.should.equal(5);

              async.series([
                function(next) {
                  var tx2 = new Transaction();
                  tx2Amount = results[0].satoshis - 10000;
                  tx2.from(results[0]);
                  tx2.to(address2, tx2Amount);
                  tx2.change(address);
                  tx2.sign(testKey);
                  tx2Hash = tx2.hash;
                  node.sendTransaction(tx2.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }, function(next) {
                  var tx3 = new Transaction();
                  tx3.from(results[1]);
                  tx3.to(address3, results[1].satoshis - 10000);
                  tx3.change(address);
                  tx3.sign(testKey);
                  node.sendTransaction(tx3.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }, function(next) {
                  var tx4 = new Transaction();
                  tx4.from(results[2]);
                  tx4.to(address4, results[2].satoshis - 10000);
                  tx4.change(address);
                  tx4.sign(testKey);
                  node.sendTransaction(tx4.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }, function(next) {
                  var tx5 = new Transaction();
                  tx5.from(results[3]);
                  tx5.from(results[4]);
                  tx5.to(address5, results[3].satoshis - 10000);
                  tx5.to(address6, results[4].satoshis - 10000);
                  tx5.change(address);
                  tx5.sign(testKey);
                  node.sendTransaction(tx5.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }
              ], function(err) {
                if (err) {
                  throw err;
                }
              });
            });

          });

        });

      });
Example #4
0
describe('Messages', function() {

  var privateKey = bitcore.PrivateKey.fromWIF('cQwApHAg8hw9AZuxiU4a7g9kFWdaemhPxVZXWiAKgJTx6dPP32fN');
  var address = 'yYjwsLsPUmsfe3RJ5YqZdJYC2Y9tzHYMWL';
  var badAddress = 'yYjwsLsPUmsfe3RJ5YqZdJYC2Y9tzHYMWW';
  var signature = 'H2TSaZyMt9/oLqqgQzE2iBKNlPVfPp6XOVP7LiNDFU3sdiHahS+aemajhhp4XDaRClee/hlUkJtF0Nuqm3egpPw=';
  var message = 'cellar door';

  it('will verify a message (true)', function(done) {

    var controller = new MessagesController({node: {}});

    var req = {
      body: {
        'address': address,
        'signature': signature,
        'message': message
      },
      query: {}
    };
    var res = {
      json: function(data) {
        data.result.should.equal(true);
        done();
      }
    };

    controller.verify(req, res);
  });

  it('will verify a message (false)', function(done) {

    var controller = new MessagesController({node: {}});

    var req = {
      body: {
        'address': address,
        'signature': signature,
        'message': 'wrong message'
      },
      query: {}
    };
    var res = {
      json: function(data) {
        data.result.should.equal(false);
        done();
      }
    };

    controller.verify(req, res);
  });

  it('handle an error from message verification', function(done) {
    var controller = new MessagesController({node: {}});
    var req = {
      body: {
        'address': badAddress,
        'signature': signature,
        'message': message
      },
      query: {}
    };
    var send = sinon.stub();
    var status = sinon.stub().returns({send: send});
    var res = {
      status: status,
    };
    controller.verify(req, res);
    status.args[0][0].should.equal(400);
    send.args[0][0].should.equal('Unexpected error: Checksum mismatch. Code:1');
    done();
  });

  it('handle error with missing parameters', function(done) {
    var controller = new MessagesController({node: {}});
    var req = {
      body: {},
      query: {}
    };
    var send = sinon.stub();
    var status = sinon.stub().returns({send: send});
    var res = {
      status: status
    };
    controller.verify(req, res);
    status.args[0][0].should.equal(400);
    send.args[0][0].should.match(/^Missing parameters/);
    done();
  });

});
Example #5
0
      before(function(done) {
        /* jshint maxstatements: 50 */

        // Finished once all blocks have been mined
        var startHeight = node.services.bitcoind.height;
        node.services.bitcoind.on('tip', function(height) {
          if (height === startHeight + 5) {
            done();
          }
        });

        testKey2 = bitcore.PrivateKey.fromWIF('7sTymLSNn9SoCrb2awe7fUcjTHns8HXDWNnCzKqC1K5D1GXzTJv');
        address2 = testKey2.toAddress(regtest).toString();

        testKey3 = bitcore.PrivateKey.fromWIF('7rx9vzpRJpydL8p6wMX71U1UTtkWkymBJMxHoYduBn4KnL5c591');
        address3 = testKey3.toAddress(regtest).toString();

        testKey4 = bitcore.PrivateKey.fromWIF('7s7WGhd7hB3e1ZSpwhd2hyc9aSkDYamEYNqvYrXHPJbgvfMmXec');
        address4 = testKey4.toAddress(regtest).toString();

        testKey5 = bitcore.PrivateKey.fromWIF('7rtwSf4qmiGuaxJGPQzHZ2SsiocXfVitoFrfQt17EFMgsA491pd');
        address5 = testKey5.toAddress(regtest).toString();

        testKey6 = bitcore.PrivateKey.fromWIF('7r859FVkts4gRPDB3xzjGMwVkvDxEoV9EVTNW9ijwy4Riqankdw');
        address6 = testKey6.toAddress(regtest).toString();

        var tx = new Transaction();
        tx.from(unspentOutput);
        tx.to(address, 1 * 1e8);
        tx.to(address, 2 * 1e8);
        tx.to(address, 0.5 * 1e8);
        tx.to(address, 3 * 1e8);
        tx.fee(10000);
        tx.change(address);
        tx.sign(testKey);

        unspentOutputSpentTxId = tx.id;

        function mineBlock(next) {
          client.generate(1, function(err, response) {
            if (err) {
              throw err;
            }
            should.exist(response);
            next();
          });
        }

        node.sendTransaction(tx.serialize(), function(err, hash) {
          if (err) {
            return done(err);
          }

          client.generate(1, function(err, response) {
            if (err) {
              throw err;
            }
            should.exist(response);

            node.getAddressUnspentOutputs(address, false, function(err, results) {
              /* jshint maxstatements: 50 */
              if (err) {
                throw err;
              }
              results.length.should.equal(5);

              async.series([
                function(next) {
                  var tx2 = new Transaction();
                  tx2Amount = results[0].satoshis - 10000;
                  tx2.from(results[0]);
                  tx2.to(address2, tx2Amount);
                  tx2.change(address);
                  tx2.sign(testKey);
                  tx2Hash = tx2.hash;
                  node.sendTransaction(tx2.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }, function(next) {
                  var tx3 = new Transaction();
                  tx3.from(results[1]);
                  tx3.to(address3, results[1].satoshis - 10000);
                  tx3.change(address);
                  tx3.sign(testKey);
                  node.sendTransaction(tx3.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }, function(next) {
                  var tx4 = new Transaction();
                  tx4.from(results[2]);
                  tx4.to(address4, results[2].satoshis - 10000);
                  tx4.change(address);
                  tx4.sign(testKey);
                  node.sendTransaction(tx4.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }, function(next) {
                  var tx5 = new Transaction();
                  tx5.from(results[3]);
                  tx5.from(results[4]);
                  tx5.to(address5, results[3].satoshis - 10000);
                  tx5.to(address6, results[4].satoshis - 10000);
                  tx5.change(address);
                  tx5.sign(testKey);
                  node.sendTransaction(tx5.serialize(), function(err) {
                    if (err) {
                      return next(err);
                    }
                    mineBlock(next);
                  });
                }
              ], function(err) {
                if (err) {
                  throw err;
                }
              });
            });

          });

        });

      });