From eca4c9ec324700b00ce1be5b2e288a15bb8a8314 Mon Sep 17 00:00:00 2001
From: Daniel Cousens <github@dcousens.com>
Date: Fri, 6 Nov 2015 07:58:50 +1100
Subject: [PATCH 1/3] package: use typeforce 1.5.5

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 4208fc7..81dc9be 100644
--- a/package.json
+++ b/package.json
@@ -68,7 +68,7 @@
     "create-hmac": "^1.1.3",
     "ecurve": "^1.0.0",
     "randombytes": "^2.0.1",
-    "typeforce": "^1.3.0",
+    "typeforce": "^1.5.5",
     "wif": "^1.1.0"
   },
   "devDependencies": {

From d338c3872dfa648970799b3731fe6314af8a6290 Mon Sep 17 00:00:00 2001
From: Daniel Cousens <github@dcousens.com>
Date: Fri, 6 Nov 2015 07:59:09 +1100
Subject: [PATCH 2/3] 2.1.3

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 81dc9be..88b2a78 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "bitcoinjs-lib",
-  "version": "2.1.2",
+  "version": "2.1.3",
   "description": "Client-side Bitcoin JavaScript library",
   "main": "./src/index.js",
   "keywords": [

From 74fd5ae71d0eaaa1115b45a4af99103e9fcf51df Mon Sep 17 00:00:00 2001
From: Daniel Cousens <github@dcousens.com>
Date: Fri, 6 Nov 2015 10:49:06 +1100
Subject: [PATCH 3/3] tests: loop faucet until an unspent is given

---
 package.json                    |  2 +-
 test/integration/_blockchain.js | 47 ++++++++++++++++++-----
 test/integration/advanced.js    | 57 +++++++++++----------------
 test/integration/multisig.js    | 68 ++++++++++++++-------------------
 4 files changed, 89 insertions(+), 85 deletions(-)

diff --git a/package.json b/package.json
index 88b2a78..12598bb 100644
--- a/package.json
+++ b/package.json
@@ -72,7 +72,7 @@
     "wif": "^1.1.0"
   },
   "devDependencies": {
-    "async": "^0.9.0",
+    "async": "^1.5.0",
     "blanket": "^1.1.0",
     "browserify": "^10.0.0",
     "bs58": "^2.0.1",
diff --git a/test/integration/_blockchain.js b/test/integration/_blockchain.js
index 7d215ec..bb2b6b8 100644
--- a/test/integration/_blockchain.js
+++ b/test/integration/_blockchain.js
@@ -1,3 +1,4 @@
+var async = require('async')
 var Blockchain = require('cb-http-client')
 var httpify = require('httpify')
 
@@ -5,16 +6,42 @@ var BLOCKTRAIL_API_KEY = process.env.BLOCKTRAIL_API_KEY || 'c0bd8155c66e3fb148bb
 
 var mainnet = new Blockchain('https://api.blocktrail.com/cb/v0.2.1/BTC', { api_key: BLOCKTRAIL_API_KEY })
 var testnet = new Blockchain('https://api.blocktrail.com/cb/v0.2.1/tBTC', { api_key: BLOCKTRAIL_API_KEY })
-testnet.faucet = function faucet (address, amount, callback) {
-  httpify({
-    method: 'POST',
-    url: 'https://api.blocktrail.com/v1/tBTC/faucet/withdrawl?api_key=' + BLOCKTRAIL_API_KEY,
-    headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({
-      address: address,
-      amount: amount
-    })
-  }, callback)
+
+testnet.faucet = function faucet (address, amount, done) {
+  var unspents = []
+
+  async.whilst(
+    function condition () { return unspents.length === 0 },
+    function f (callback) {
+      httpify({
+        method: 'POST',
+        url: 'https://api.blocktrail.com/v1/tBTC/faucet/withdrawl?api_key=' + BLOCKTRAIL_API_KEY,
+        headers: { 'Content-Type': 'application/json' },
+        body: JSON.stringify({
+          address: address,
+          amount: amount
+        })
+      }, function (err) {
+        if (err) return callback(err)
+
+        testnet.addresses.unspents(address, function (err, result) {
+          if (err) return callback(err)
+
+          // filter small unspents
+          unspents = result.filter(function (unspent) {
+            return unspent.value > 1e3
+          })
+
+          callback()
+        })
+      })
+    },
+    function (err) {
+      if (err) return done(err)
+
+      done(null, unspents)
+    }
+  )
 }
 
 module.exports = {
diff --git a/test/integration/advanced.js b/test/integration/advanced.js
index 6473e08..8321da6 100644
--- a/test/integration/advanced.js
+++ b/test/integration/advanced.js
@@ -22,53 +22,42 @@ describe('bitcoinjs-lib (advanced)', function () {
   })
 
   it('can create an OP_RETURN transaction', function (done) {
-    this.timeout(20000)
+    this.timeout(30000)
 
     var network = bitcoin.networks.testnet
     var keyPair = bitcoin.ECPair.makeRandom({ network: network })
     var address = keyPair.getAddress()
 
-    blockchain.t.faucet(address, 2e4, function (err) {
+    blockchain.t.faucet(address, 2e4, function (err, unspents) {
       if (err) return done(err)
 
-      blockchain.t.addresses.unspents(address, function (err, unspents) {
+      // use the oldest unspent
+      var unspent = unspents.pop()
+      var tx = new bitcoin.TransactionBuilder(network)
+      var data = new Buffer('bitcoinjs-lib')
+      var dataScript = bitcoin.script.nullDataOutput(data)
+
+      tx.addInput(unspent.txId, unspent.vout)
+      tx.addOutput(dataScript, 1000)
+      tx.sign(0, keyPair)
+
+      var txBuilt = tx.build()
+
+      blockchain.t.transactions.propagate(txBuilt.toHex(), function (err) {
         if (err) return done(err)
 
-        // filter small unspents
-        unspents = unspents.filter(function (unspent) {
-          return unspent.value > 1e4
-        })
-
-        // use the oldest unspent
-        var unspent = unspents.pop()
-        if (!unspent) throw new Error('Faucet didn\'t provide an unspent')
-
-        var tx = new bitcoin.TransactionBuilder(network)
-        var data = new Buffer('bitcoinjs-lib')
-        var dataScript = bitcoin.script.nullDataOutput(data)
-
-        tx.addInput(unspent.txId, unspent.vout)
-        tx.addOutput(dataScript, 1000)
-        tx.sign(0, keyPair)
-
-        var txBuilt = tx.build()
-
-        blockchain.t.transactions.propagate(txBuilt.toHex(), function (err) {
+        // check that the message was propagated
+        blockchain.t.transactions.get(txBuilt.getId(), function (err, transaction) {
           if (err) return done(err)
 
-          // check that the message was propagated
-          blockchain.t.transactions.get(txBuilt.getId(), function (err, transaction) {
-            if (err) return done(err)
+          var actual = bitcoin.Transaction.fromHex(transaction.txHex)
+          var dataScript2 = actual.outs[0].script
+          var data2 = bitcoin.script.decompile(dataScript2)[1]
 
-            var actual = bitcoin.Transaction.fromHex(transaction.txHex)
-            var dataScript2 = actual.outs[0].script
-            var data2 = bitcoin.script.decompile(dataScript2)[1]
+          assert.deepEqual(dataScript, dataScript2)
+          assert.deepEqual(data, data2)
 
-            assert.deepEqual(dataScript, dataScript2)
-            assert.deepEqual(data, data2)
-
-            done()
-          })
+          done()
         })
       })
     })
diff --git a/test/integration/multisig.js b/test/integration/multisig.js
index 6303069..1a211d5 100644
--- a/test/integration/multisig.js
+++ b/test/integration/multisig.js
@@ -37,53 +37,41 @@ describe('bitcoinjs-lib (multisig)', function () {
     var address = bitcoin.address.fromOutputScript(scriptPubKey, bitcoin.networks.testnet)
 
     // attempt to send funds to the source address
-    blockchain.t.faucet(address, 2e4, function (err) {
+    blockchain.t.faucet(address, 2e4, function (err, unspents) {
       if (err) return done(err)
 
-      // get latest unspents from the address
-      blockchain.t.addresses.unspents(address, function (err, unspents) {
+      // use the oldest unspent
+      var unspent = unspents.pop()
+
+      // make a random destination address
+      var targetAddress = bitcoin.ECPair.makeRandom({
+        network: bitcoin.networks.testnet
+      }).getAddress()
+
+      var txb = new bitcoin.TransactionBuilder(bitcoin.networks.testnet)
+      txb.addInput(unspent.txId, unspent.vout)
+      txb.addOutput(targetAddress, 1e4)
+
+      // sign with 1st and 3rd key
+      txb.sign(0, keyPairs[0], redeemScript)
+      txb.sign(0, keyPairs[2], redeemScript)
+
+      // broadcast our transaction
+      var tx = txb.build()
+      var txId = tx.getId()
+
+      blockchain.t.transactions.propagate(tx.toHex(), function (err) {
         if (err) return done(err)
 
-        // filter small unspents
-        unspents = unspents.filter(function (unspent) {
-          return unspent.value > 1e4
-        })
-
-        // use the oldest unspent
-        var unspent = unspents.pop()
-
-        if (!unspent) throw new Error('Faucet didn\'t provide an unspent')
-
-        // make a random destination address
-        var targetAddress = bitcoin.ECPair.makeRandom({
-          network: bitcoin.networks.testnet
-        }).getAddress()
-
-        var txb = new bitcoin.TransactionBuilder(bitcoin.networks.testnet)
-        txb.addInput(unspent.txId, unspent.vout)
-        txb.addOutput(targetAddress, 1e4)
-
-        // sign with 1st and 3rd key
-        txb.sign(0, keyPairs[0], redeemScript)
-        txb.sign(0, keyPairs[2], redeemScript)
-
-        // broadcast our transaction
-        var tx = txb.build()
-        var txId = tx.getId()
-
-        blockchain.t.transactions.propagate(tx.toHex(), function (err) {
+        // check that the above transaction included the intended address
+        blockchain.t.addresses.unspents(targetAddress, function (err, unspents) {
           if (err) return done(err)
 
-          // check that the above transaction included the intended address
-          blockchain.t.addresses.unspents(targetAddress, function (err, unspents) {
-            if (err) return done(err)
+          assert(unspents.some(function (unspent) {
+            return unspent.txId === txId && unspent.value === 1e4
+          }))
 
-            assert(unspents.some(function (unspent) {
-              return unspent.txId === txId && unspent.value === 1e4
-            }))
-
-            done()
-          })
+          done()
         })
       })
     })