From 54fa31c85da027f526427abf059a8ac56275487d Mon Sep 17 00:00:00 2001
From: Manuel Araoz <manuelaraoz@gmail.com>
Date: Tue, 18 Nov 2014 18:59:31 -0300
Subject: [PATCH] remove crypto

---
 LICENSE.md                  |   30 -
 examples.md                 | 1104 -----------------------------------
 index.js                    |   11 -
 lib/expmt/aes.js            |   47 --
 lib/expmt/aescbc.js         |   34 --
 lib/expmt/cbc.js            |  138 -----
 lib/expmt/ecies.js          |   55 --
 lib/expmt/stealthaddress.js |  127 ----
 lib/expmt/stealthkey.js     |   88 ---
 lib/expmt/stealthmessage.js |   85 ---
 lib/expmt/stealthtx.js      |   69 ---
 test/aes.js                 |   85 ---
 test/aescbc.js              |   73 ---
 test/cbc.js                 |  317 ----------
 test/ecies.js               |   52 --
 test/stealthaddress.js      |  149 -----
 test/stealthkey.js          |  138 -----
 test/stealthmessage.js      |  139 -----
 test/stealthtx.js           |   68 ---
 19 files changed, 2809 deletions(-)
 delete mode 100644 LICENSE.md
 delete mode 100755 examples.md
 delete mode 100644 lib/expmt/aes.js
 delete mode 100644 lib/expmt/aescbc.js
 delete mode 100644 lib/expmt/cbc.js
 delete mode 100644 lib/expmt/ecies.js
 delete mode 100644 lib/expmt/stealthaddress.js
 delete mode 100644 lib/expmt/stealthkey.js
 delete mode 100644 lib/expmt/stealthmessage.js
 delete mode 100644 lib/expmt/stealthtx.js
 delete mode 100644 test/aes.js
 delete mode 100644 test/aescbc.js
 delete mode 100644 test/cbc.js
 delete mode 100644 test/ecies.js
 delete mode 100644 test/stealthaddress.js
 delete mode 100644 test/stealthkey.js
 delete mode 100644 test/stealthmessage.js
 delete mode 100644 test/stealthtx.js

diff --git a/LICENSE.md b/LICENSE.md
deleted file mode 100644
index 6fdf61a..0000000
--- a/LICENSE.md
+++ /dev/null
@@ -1,30 +0,0 @@
-This software is licensed under the MIT License.
-
-Copyright (c) 2014 Ryan X. Charles <ryanxcharles@gmail.com>
-
-Parts of this software are based on bitcore
-Copyright (c) 2014 BitPay Inc.
-
-Parts of this software are based on BitcoinJS
-Copyright (c) 2011 Stefan Thomas <justmoon@members.fsf.org>
-
-Parts of this software are based on BitcoinJ
-Copyright (c) 2011 Google Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/examples.md b/examples.md
deleted file mode 100755
index 8f30031..0000000
--- a/examples.md
+++ /dev/null
@@ -1,1104 +0,0 @@
-#Address.js
-	'use strict';
-	
-	
-	var run = function() {
-	  // Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var Address = bitcore.Address;
-	
-	  var addrs = [
-	    '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
-	    '1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx',
-	    'A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
-	    '1600 Pennsylvania Ave NW',
-	  ].map(function(addr) {
-	    return new Address(addr);
-	  });
-	
-	  addrs.forEach(function(addr) {
-	    var valid = addr.isValid();
-	    console.log(addr.data + ' is ' + (valid ? '' : 'not ') + 'valid');
-	  });
-	
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#Armory.js
-	var Armory = require('../lib/Armory');
-	var Address = require('../lib/Address');
-	
-	// Initial public key can be retrieved from paper backup
-	
-	var PublicX = '9df5 23e7 18b9 1f59 a790 2d46 999f 9357 ccf8 7208 24d4 3076 4516 b809 f7ab ce4e';
-	var PublicY = '66ba 5d21 4682 0dae 401d 9506 8437 2516 79f9 0c56 4186 cc50 07df c6d0 6989 1ff4';
-	var pubkey = '04' + PublicX.split(' ').join('') + PublicY.split(' ').join('');
-	
-	// Chain code can be generated by entering paper backup
-	// on brainwallet.org/#chains or by using Armory.fromSeed() below
-	
-	var chaincode = '84ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e';
-	
-	var armory = new Armory(chaincode, pubkey);
-	
-	console.log('Deriving public keys for');
-	console.log('------------------------');
-	console.log('Chain code: %s', chaincode);
-	console.log('Public key: %s', pubkey);
-	console.log('');
-	
-	for (var i = 0; i < 5; i++) {
-	  console.log(Address.fromPubKey(armory.pubkey).as('base58'));
-	  armory = armory.next();
-	}
-	
-	// Derive first public key and chain code from seed
-	var seed = [
-	  'aagh hjfj sihk ietj giik wwai awtd uodh hnji',
-	  'soss uaku egod utai itos fijj ihgi jhau jtoo'
-	];
-	
-	console.log('');
-	console.log('');
-	console.log('Deriving public keys for');
-	console.log('------------------------');
-	console.log('Seed: %s', seed.join(' '));
-	console.log('');
-	
-	// skip first public key
-	var a = Armory.fromSeed(seed.join('\n')).next();
-	
-	for (var i = 0; i < 5; i++) {
-	  console.log(Address.fromPubKey(a.pubkey).as('base58'));
-	  a = a.next();
-	}
-	
-	
-	var mpk = '045a09a3286873a72f164476bde9d1d8e5c2bc044e35aa47eb6e798e325a86417f7c35b61d9905053533e0b4f2a26eca0330aadf21c638969e45aaace50e4c0c8784ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e';
-	
-	console.log('');
-	console.log('');
-	console.log('Deriving public keys for');
-	console.log('------------------------');
-	console.log('Master Public Key: %s', mpk);
-	console.log('');
-	
-	// skip first public key
-	var b = Armory.fromMasterPublicKey(mpk).next();
-	
-	for (var i = 0; i < 5; i++) {
-	  console.log(Address.fromPubKey(b.pubkey).as('base58'));
-	  b = b.next();
-	}
-	
-#ConnectionTor.js
-	var Peer = require('../lib/Peer');
-	var Connection = require('../lib/Connection');
-	var dns = require('dns');
-	
-	// get a peer from dns seed
-	dns.resolve('dnsseed.bluematt.me', function(err, seeds) {
-	  // use the first peer
-	  var peer = new Peer(seeds[0], 8333);
-	
-	  //Custom peer:
-	  //var peer = new Peer('180.153.139.246', '8888');
-	
-	  // create a connection without an existing socket
-	  // but specify a socks5 proxy to create a socket 
-	  // that's bound to that proxy in it's place
-	  var connection = new Connection(null, peer, {
-	    proxy: {
-	      host: '127.0.0.1',
-	      port: 9050
-	    }
-	  });
-	
-	  connection.open();
-	
-	  connection.on('connect', function(data) {
-	    console.log('connected through socks5!');
-	  });
-	
-	  connection.on('error', function(err) {
-	    console.log('There was an error running this example.');
-	    console.log('Are you running Tor? Tor must running for this example to work.');
-	    console.log('If you still get an error, you may need to use a different proxy from here:');
-	    console.log('http://sockslist.net/');
-	    //console.log(err);
-	  });
-	
-	});
-	
-#CreateAndSignTx-Multisig.js
-	var run = function() {
-	  bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
-	  var networks = require('../networks');
-	  var WalletKey = bitcore.WalletKey;
-	  var Builder = bitcore.TransactionBuilder;
-	  var opts = {
-	    network: networks.testnet
-	  };
-	
-	  console.log('## Network: ' + opts.network.name);
-	
-	  var input = {};
-	  input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp";
-	  input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V";
-	
-	  // Complete with the corresponding UTXO you want to use
-	  var utxos = [{
-	    address: input.addr,
-	    txid: "39c71ebda371f75f4b854a720eaf9898b237facf3c2b101b58cd4383a44a6adc",
-	    vout: 1,
-	    scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac",
-	    amount: 0.4296,
-	    confirmations: 2
-	  }];
-	
-	  var privs = [
-	    "cP6JBHuQf7yqeqtdKRd22ibF3VehDv7G6BdzxSNABgrv3jFJUGoN",
-	    "cQfRwF7XLSM5xGUpF8PZvob2MZyULvZPA2j5cat2RKDJrja7FtCZ",
-	    "cUkYub4jtFVYymHh38yMMW36nJB4pXG5Pzd5QjResq79kAndkJcg",
-	    "cMyBgowsyrJRufoKWob73rMQB1PBqDdwFt8z4TJ6APN2HkmX1Ttm",
-	    "cN9yZCom6hAZpHtCp8ovE1zFa7RqDf3Cr4W6AwH2tp59Jjh9JcXu",
-	  ];
-	
-	  var pubkeys = []
-	  privs.forEach(function(p) {
-	    var wk = new WalletKey(opts);
-	    wk.fromObj({
-	      priv: p
-	    });
-	    pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public));
-	  });
-	
-	
-	  var outs = [{
-	    nreq: 3,
-	    pubkeys: pubkeys,
-	    amount: 0.05
-	  }];
-	  var tx = new Builder(opts)
-	    .setUnspent(utxos)
-	    .setOutputs(outs)
-	    .sign([input.priv])
-	    .build();
-	  var txHex = tx.serialize().toString('hex');
-	  console.log('1) SEND TO MULSISIG TX: ', txHex);
-	  console.log('[this example originally generated TXID: e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5 on testnet]\n\n\thttp://test.bitcore.io/tx/e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5\n\n');
-	
-	
-	  //save scriptPubKey
-	  var scriptPubKey = tx.outs[0].s.toString('hex');
-	
-	  /* 
-	   *
-	   * REDDEEM TX
-	   */
-	  var utxos2 = [{
-	    address: input.addr,
-	    txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5",
-	    vout: 0,
-	    scriptPubKey: scriptPubKey,
-	    amount: 0.05,
-	    confirmations: 2
-	  }];
-	
-	  outs = [{
-	    address: input.addr,
-	    amount: 0.04
-	  }];
-	  var b = new Builder(opts)
-	    .setUnspent(utxos2)
-	    .setOutputs(outs)
-	    .sign(privs);
-	
-	
-	  tx = b.build();
-	
-	
-	  var txHex = tx.serialize().toString('hex');
-	  console.log('2) REDEEM SCRIPT: ', txHex);
-	  console.log('=> Is signed status:', b.isFullySigned(), tx.countInputMissingSignatures(0));
-	
-	  console.log('[this example originally generated TXID: 1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83 on testnet]\n\n\thttp://test.bitcore.io/tx/1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83');
-	
-	};
-	
-	// This is just for browser & mocha compatibility
-	if (typeof module !== 'undefined') {
-	  module.exports.run = run;
-	  if (require.main === module) {
-	    run();
-	  }
-	} else {
-	  run();
-	}
-	
-	////
-	
-#CreateAndSignTx-PayToPubkeyHash.js
-	var run = function() {
-	  bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
-	
-	  var priv = 'cTgGUrcro89yUtKeG6gHBAS14r3qp25KwTTxG9d4kEzcFxecuZDm';
-	  var amt = '0.005';
-	  var toAddress = 'myuAQcCc1REUgXGsCTiYhZvPPc3XxZ36G1';
-	  var changeAddressString = 'moDz3jEo9q7CxjBDjmb13sL4SKkgo2AACE';
-	
-	  var utxos = [{
-	    address: "mqSjTad2TKbPcKQ3Jq4kgCkKatyN44UMgZ",
-	    txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1",
-	    vout: 1,
-	    scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac",
-	    amount: 0.01,
-	    confirmations: 2
-	  }];
-	
-	  console.log('TX Data: BTC:' + amt + ' => ' + toAddress + ', change To:' + changeAddressString);
-	  console.log('Unspends Outputs:', utxos);
-	
-	
-	  var outs = [{
-	    address: toAddress,
-	    amount: amt
-	  }];
-	  var keys = [priv];
-	  var opts = {
-	    remainderOut: {
-	      address: changeAddressString
-	    }
-	  };
-	  var Builder = bitcore.TransactionBuilder;
-	
-	  var tx = new Builder(opts)
-	    .setUnspent(utxos)
-	    .setOutputs(outs)
-	    .sign(keys)
-	    .build();
-	
-	  /* create and signing can be done in multiple steps using:
-	   *
-	   *  var builder = new bitcore.TransactionBuilder(opts)
-	   *             .setUnspent(utxos)
-	   *             .setOutputs(outs);
-	   *
-	   *  builder.sign(key1);
-	   *  builder.sign(key2);
-	   *  ...
-	   *  if (builder.isFullySigned()){
-	   *   var tx = builder.build();
-	   *  }
-	   *
-	   *  The selected Unspent Outputs for the transaction can be retrieved with:
-	   *
-	   *    var selectedUnspent = build.getSelectedUnspent();
-	   */
-	
-	  var txHex = tx.serialize().toString('hex');
-	  console.log('TX HEX IS: ', txHex);
-	};
-	
-	// This is just for browser & mocha compatibility
-	if (typeof module !== 'undefined') {
-	  module.exports.run = run;
-	  if (require.main === module) {
-	    run();
-	  }
-	} else {
-	  run();
-	}
-	
-	////
-	
-#CreateAndSignTx-PayToScriptHash.js
-	var run = function() {
-	  bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
-	  var networks = require('../networks');
-	  var WalletKey = bitcore.WalletKey;
-	  var Script = bitcore.Script;
-	  var Builder = bitcore.TransactionBuilder;
-	  var opts = {
-	    network: networks.testnet
-	  };
-	
-	  console.log('## Network: ' + opts.network.name);
-	
-	  var input = {};
-	  input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp";
-	  input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V";
-	
-	  // Complete with the corresponding UTXO you want to use
-	  var utxos = [{
-	    address: "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp",
-	    txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5",
-	    vout: 1,
-	    scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac",
-	    amount: 0.3795,
-	    confirmations: 7
-	  }];
-	
-	  var privs = [
-	    "cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA",
-	    "cVf32m9MR4vxcPwKNJuPepUe8XrHD2z63eCk76d6njRGyCkXpkSM",
-	    "cQ2sVRFX4jQYMLhWyzz6jTQ2xju51P36968ecXnPhRLKLH677eKR",
-	    "cSw7x9ERcmeWCU3yVBT6Nz7b9JiZ5yjUB7JMhBUv9UM7rSaDpwX9",
-	    "cRQBM8qM4ZXJGP1De4D5RtJm7Q6FNWQSMx7YExxzgn2ehjM3haxW",
-	  ];
-	
-	  var pubkeys = []
-	  privs.forEach(function(p) {
-	    var wk = new WalletKey(opts);
-	    wk.fromObj({
-	      priv: p
-	    });
-	    pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public));
-	  });
-	
-	  // multisig p2sh
-	  var opts = {
-	    nreq: 3,
-	    pubkeys: pubkeys
-	  };
-	
-	  // p2scriphash p2sh
-	  //var opts = [{address: an_address}];
-	
-	  var info = Builder.infoForP2sh(opts, 'testnet');
-	  var p2shScript = info.scriptBufHex;
-	  var p2shAddress = info.address;
-	
-	
-	  var outs = [{
-	    address: p2shAddress,
-	    amount: 0.05
-	  }];
-	  var tx = new Builder(opts)
-	    .setUnspent(utxos)
-	    .setOutputs(outs)
-	    .sign([input.priv])
-	    .build();
-	
-	  var txHex = tx.serialize().toString('hex');
-	
-	
-	  console.log('## p2sh address: ' + p2shAddress); //TODO
-	  console.log('\n1) SEND TO P2SH TX: ', txHex);
-	  console.log('[this example originally generated TXID: c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7 on testnet]\n\n\thttp://test.bitcore.io/tx/c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7\n\n');
-	
-	  //save scriptPubKey
-	  var scriptPubKey = tx.outs[0].s.toString('hex');
-	
-	  /* 
-	   *
-	   * REDDEEM TX
-	   */
-	  var utxos2 = [{
-	    address: p2shAddress,
-	    txid: "c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7",
-	    vout: 0,
-	    scriptPubKey: scriptPubKey,
-	    amount: 0.05,
-	    confirmations: 1
-	  }];
-	
-	  outs = [{
-	    address: input.addr,
-	    amount: 0.04
-	  }];
-	
-	  var hashMap = {};
-	  hashMap[p2shAddress] = p2shScript;
-	
-	  var b = new Builder(opts)
-	    .setUnspent(utxos2)
-	    .setHashToScriptMap(hashMap)
-	    .setOutputs(outs)
-	    .sign(privs);
-	
-	  tx = b.build();
-	
-	
-	  console.log('Builder:');
-	  console.log('\tSignatures:' + tx.countInputMissingSignatures(0));
-	  console.log('\t#isFullySigned:' + b.isFullySigned());
-	
-	  console.log('TX:');
-	  console.log('\t #isComplete:' + tx.isComplete());
-	
-	  var txHex = tx.serialize().toString('hex');
-	  console.log('2) REDEEM SCRIPT: ', txHex);
-	  console.log('[this example originally generated TXID: 8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7 on testnet]\n\n\thttp://test.bitcore.io/tx/8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7\n\n');
-	
-	  /*
-	  // To send TX with RPC:
-	  var RpcClient = bitcore.RpcClient;
-	  var config = {
-	    protocol: 'http',
-	    user: 'user',
-	    pass: 'pass',
-	    host: '127.0.0.1',
-	    port: '18332',
-	  };
-	  var rpc = new RpcClient(config);
-	  rpc.sendRawTransaction(txHex, function(err, ret) {
-	    console.log('err', err); //TODO
-	    console.log('ret', ret); //TODO
-	    process.exit(-1);
-	  });
-	};
-	*/
-	
-	};
-	
-	
-	// This is just for browser & mocha compatibility
-	if (typeof module !== 'undefined') {
-	  module.exports.run = run;
-	  if (require.main === module) {
-	    run();
-	  }
-	} else {
-	  run();
-	}
-	
-#CreateKey.js
-	'use strict';
-	
-	
-	
-	var run = function() {
-	  // replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var networks = require('../networks');
-	  var WalletKey = bitcore.WalletKey;
-	
-	  var opts = {
-	    network: networks.testnet
-	  };
-	
-	  function print(wk) {
-	
-	    console.log('\n## Network: ' + wk.network.name);
-	    console.log('\t * Hex Representation');
-	    console.log('\tPrivate: ' + bitcore.buffertools.toHex(wk.privKey.private));
-	    console.log('\tPublic : ' + bitcore.buffertools.toHex(wk.privKey.public));
-	    console.log('\tPublic Compressed : ' + (wk.privKey.compressed ? 'Yes' : 'No'));
-	
-	    var wkObj = wk.storeObj();
-	    console.log('\n\t * WalletKey Store Object');
-	    console.log('\tPrivate: ' + wkObj.priv);
-	    console.log('\tPublic : ' + wkObj.pub);
-	    console.log('\tAddr   : ' + wkObj.addr);
-	  };
-	
-	  //Generate a new one (compressed public key, compressed WIF flag)
-	  var wk = new WalletKey(opts);
-	  wk.generate();
-	  print(wk);
-	
-	  //Generate from private Key WIF. Compressed status taken from WIF.
-	  var wk2 = new WalletKey(opts);
-	  wk2.fromObj({
-	    priv: 'cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA'
-	  });
-	  print(wk2);
-	
-	
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#CreateScript.js
-	'use strict';
-	
-	var run = function() {
-	  // replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var networks = require('../networks');
-	  var Script = bitcore.Script;
-	  var WalletKey = bitcore.WalletKey;
-	  var buffertools = bitcore.buffertools;
-	  var Address = bitcore.Address;
-	  var util = bitcore.util;
-	  var opts = {
-	    network: networks.testnet
-	  };
-	
-	  var p = console.log;
-	
-	  var wk = new WalletKey(opts);
-	  wk.generate();
-	  var wkObj = wk.storeObj();
-	
-	  var s = Script.createPubKeyOut(wk.privKey.public);
-	  p('\nScript PubKey:');
-	  p('\tHex     : ' + buffertools.toHex(s.buffer));
-	  p('\tHuman   : ' + s.toHumanReadable());
-	  p('\tKey      -------------------------------');
-	  console.log('\tPrivate: ' + wkObj.priv);
-	  console.log('\tPublic : ' + wkObj.pub);
-	  console.log('\tAddr   : ' + wkObj.addr);
-	
-	  s = Script.createPubKeyHashOut(wk.privKey.public);
-	  p('\nScript PubKeyHash:');
-	  p('\tHex     : ' + buffertools.toHex(s.buffer));
-	  p('\tHuman   : ' + s.toHumanReadable());
-	  p('\tKey      -------------------------------');
-	  console.log('\tPrivate: ' + wkObj.priv);
-	  console.log('\tPublic : ' + wkObj.pub);
-	  console.log('\tAddr   : ' + wkObj.addr);
-	
-	  var wks = [];
-	  var pubs = [];
-	  for (var i = 0; i < 5; i++) {
-	    wks[i] = new WalletKey(opts);
-	    wks[i].generate();
-	    pubs.push(wks[i].privKey.public);
-	  }
-	
-	  s = Script.createMultisig(3, pubs);
-	  p('\nScript MultiSig (3 out of 5 required signatures):');
-	  p('\tHex     : ' + buffertools.toHex(s.buffer));
-	  p('\tHuman   : ' + s.toHumanReadable());
-	
-	  for (i = 0; i < 5; i++) {
-	    wkObj = wks[i].storeObj();
-	    p('\tKey [' + i + '] -------------------------------');
-	    console.log('\tPrivate: ' + wkObj.priv);
-	    console.log('\tPublic : ' + wkObj.pub);
-	    console.log('\tAddr   : ' + wkObj.addr);
-	  }
-	
-	  var hash = util.sha256ripe160(s.buffer);
-	
-	  s = Script.createP2SH(hash);
-	  p('\nScript P2SH:');
-	  p('\tHex     : ' + buffertools.toHex(s.buffer));
-	  p('\tHuman   : ' + s.toHumanReadable());
-	  p('\tScript Hash: ' + buffertools.toHex(hash));
-	  var a = new Address(networks.livenet.P2SHVersion, hash);
-	  p('\tp2sh Addr: ' + a.toString());
-	
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#ECIES.js
-	var run = function() {
-	  bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
-	
-	  console.log('ECIES: Elliptic Curve Integrated Encryption Scheme');
-	  console.log('A way of encrypting with a public key and decrypting with a private key.');
-	
-	  var key = bitcore.Key.generateSync();
-	  console.log('Private key: ' + key.private.toString('hex'));
-	  console.log('Public key: ' + key.public.toString('hex'));
-	
-	  var message = new Buffer('This is a message to be encrypted');
-	  console.log('Message: "' + message.toString() + '"');
-	
-	  var encrypted = bitcore.ECIES.encrypt(key.public, message);
-	  console.log('Encrypted (with public key): ' + encrypted.toString('hex'));
-	
-	  var decrypted = bitcore.ECIES.decrypt(key.private, encrypted);
-	  console.log('Decrypted (with private key): "' + decrypted.toString() + '"');
-	};
-	
-	
-	// This is just for browser & mocha compatibility
-	if (typeof module !== 'undefined') {
-	  module.exports.run = run;
-	  if (require.main === module) {
-	    run();
-	  }
-	} else {
-	  run();
-	}
-	
-#ElectrumMPK.js
-	var Electrum = require('../lib/Electrum');
-	var Address = require('../lib/Address');
-	
-	var mpk = '92eea4d2f5263651db9e3222caded1fd4c89772f79a7c03fb6afc00e9d2c9d2ed9b86c2c95fc1171e49163079dacb7f048b3c509a27a490e1df9e7128362d468';
-	
-	mpk = new Electrum(mpk);
-	
-	var key0 = mpk.generatePubKey(0);
-	var addr0 = Address.fromPubKey(key0);
-	
-	console.log(addr0.as('base58'));
-	
-#HierarchicalKey.js
-	var run = function() {
-	  bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
-	  var HierarchicalKey = bitcore.HierarchicalKey;
-	  var Address = bitcore.Address;
-	  var networks = bitcore.networks;
-	  var coinUtil = bitcore.util;
-	  var crypto = require('crypto');
-	
-	  console.log('HierarchicalKey: Hierarchical Deterministic Wallets (BIP32)');
-	  console.log('https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n');
-	  console.log('1) Make new hkey from randomly generated new seed');
-	
-	  var randomBytes = crypto.randomBytes(32);
-	  var hkey = HierarchicalKey.seed(randomBytes);
-	  console.log('master extended private key: ' + hkey.extendedPrivateKeyString());
-	  console.log('master extended public key: ' + hkey.extendedPublicKeyString());
-	  console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString());
-	  console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString());
-	  console.log();
-	
-	  console.log('2) Make new hkey from known seed');
-	  var knownBytes = coinUtil.sha256('do not use this password as a brain wallet');
-	  var hkey = HierarchicalKey.seed(knownBytes);
-	  console.log('master extended private key: ' + hkey.extendedPrivateKeyString());
-	  console.log('master extended public key: ' + hkey.extendedPublicKeyString());
-	  console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString());
-	  console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString());
-	  console.log();
-	
-	  console.log('3) Make new hkey from known master private key');
-	  var knownMasterPrivateKey = 'xprv9s21ZrQH143K2LvayFZWVVTomiDKheKWvnupDB8fmjKwxkKG47uvzmFa3vCXoy9fxPJhRYsU19apVfexvMeLpJQuF2XtX1zRF3eao9GqqaQ';
-	  var hkey = new HierarchicalKey(knownMasterPrivateKey);
-	  console.log('master extended private key: ' + hkey.extendedPrivateKeyString());
-	  console.log('master extended public key: ' + hkey.extendedPublicKeyString());
-	  console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString());
-	  console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString());
-	  console.log();
-	
-	  console.log('4) Make new hkey from known master public key');
-	  var knownMasterPublicKey = 'xpub661MyMwAqRbcGpiFufipqsKKBG1NHNwfJKishAEFNqJ6ryLcKeKyFNEZces7gMWd4XGg4uUhXy8DS64o1oPGUECVHeLq957Txjwagxt475H';
-	  var hkey = new HierarchicalKey(knownMasterPublicKey);
-	  console.log('master extended private key: cannot derive');
-	  console.log('master extended public key: ' + hkey.extendedPublicKeyString());
-	  console.log('m/0/3/5 extended private key: cannot derive');
-	  console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString());
-	  console.log();
-	
-	  console.log('5) Make new hkey from known derived public key');
-	  var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3';
-	  var hkey = new HierarchicalKey(knownPublicKey);
-	  console.log('master extended private key: cannot derive');
-	  console.log('master extended public key: ' + hkey.extendedPublicKeyString());
-	  console.log('m/0/3/5 extended private key: cannot derive');
-	  console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString());
-	  console.log();
-	
-	  console.log('6) Make a bunch of new addresses from known public key');
-	  var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3';
-	  var hkey = new HierarchicalKey(knownPublicKey);
-	  console.log('m/0 address: ' + Address.fromPubKey(hkey.derive('m/0').eckey.public).toString());
-	  //console.log('m/1 extended public key: ' + hkey.derive('m/1').extendedPublicKeyString());
-	  console.log('m/1 address: ' + Address.fromPubKey(hkey.derive('m/1').eckey.public).toString());
-	  //console.log('m/2 extended public key: ' + hkey.derive('m/2').extendedPublicKeyString());
-	  console.log('m/2 address: ' + Address.fromPubKey(hkey.derive('m/2').eckey.public).toString());
-	  //console.log('m/3 extended public key: ' + hkey.derive('m/3').extendedPublicKeyString());
-	  console.log('m/3 address: ' + Address.fromPubKey(hkey.derive('m/3').eckey.public).toString());
-	  console.log('...');
-	  //console.log('m/100 extended public key: ' + hkey.derive('m/100').extendedPublicKeyString());
-	  console.log('m/100 address: ' + Address.fromPubKey(hkey.derive('m/100').eckey.public).toString());
-	  console.log();
-	
-	};
-	
-	
-	// This is just for browser & mocha compatibility
-	if (typeof module !== 'undefined') {
-	  module.exports.run = run;
-	  if (require.main === module) {
-	    run();
-	  }
-	} else {
-	  run();
-	}
-	
-#PayToScriptHashAddress.js
-	var bitcore = require('../bitcore');
-	var Address = bitcore.Address;
-	var bitcoreUtil = bitcore.util;
-	var Script = bitcore.Script;
-	var network = bitcore.networks.livenet;
-	
-	
-	var script = ''; // write down your script here
-	var s = Script.fromHumanReadable(script);
-	var hash = bitcoreUtil.sha256ripe160(s.getBuffer());
-	var version = network.addressScript;
-	
-	var addr = new Address(version, hash);
-	var addrStr = addr.as('base58');
-	
-	// This outputs the "address" of thescript
-	console.log(addrStr);
-	
-#PeerDiscovery.js
-	var PeerManager = require('../lib/PeerManager');
-	var peerman = new PeerManager();
-	
-	peerman.discover({
-	  limit: 12
-	}).start();
-	
-#PeerManager.js
-	'use strict';
-	
-	var run = function() {
-	  // Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var Peer = bitcore.Peer;
-	  var PeerManager = bitcore.PeerManager;
-	
-	  var handleBlock = function(info) {
-	    console.log('** Block Received **');
-	    console.log(info.message);
-	  };
-	
-	  var handleTx = function(info) {
-	    var tx = info.message.tx.getStandardizedObject();
-	
-	    console.log('** TX Received **');
-	    console.log(tx);
-	  };
-	
-	  var handleInv = function(info) {
-	    console.log('** Inv **');
-	    console.log(info.message);
-	
-	    var invs = info.message.invs;
-	    info.conn.sendGetData(invs);
-	  };
-	
-	  var peerman = new PeerManager({
-	    network: 'testnet'
-	  });
-	
-	  peerman.addPeer(new Peer('127.0.0.1', 18333));
-	
-	  peerman.on('connection', function(conn) {
-	    conn.on('inv', handleInv);
-	    conn.on('block', handleBlock);
-	    conn.on('tx', handleTx);
-	  });
-	
-	  peerman.start();
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#Rpc.js
-	'use strict';
-	
-	var run = function() {
-	  // Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var RpcClient = bitcore.RpcClient;
-	  var hash = '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4';
-	
-	  var config = {
-	    protocol: 'http',
-	    user: 'user',
-	    pass: 'pass',
-	    host: '127.0.0.1',
-	    port: '18332',
-	  };
-	
-	  var rpc = new RpcClient(config);
-	
-	  rpc.getBlock(hash, function(err, ret) {
-	    if (err) {
-	      console.error('An error occured fetching block', hash);
-	      console.error(err);
-	      return;
-	    }
-	    console.log(ret);
-	  });
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#Script.js
-	'use strict';
-	
-	var run = function() {
-	  // Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var Address = bitcore.Address;
-	  var coinUtil = bitcore.util;
-	  var Script = bitcore.Script;
-	  var network = bitcore.networks.testnet;
-	
-	  var getAddrStr = function(s) {
-	    var addrStrs = [];
-	    var type = s.classify();
-	    var addr;
-	
-	    switch (type) {
-	      case Script.TX_PUBKEY:
-	        var chunk = s.captureOne();
-	        addr = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk));
-	        addrStrs.push(addr.toString());
-	        break;
-	      case Script.TX_PUBKEYHASH:
-	        addr = new Address(network.addressVersion, s.captureOne());
-	        addrStrs.push(addr.toString());
-	        break;
-	      case Script.TX_SCRIPTHASH:
-	        addr = new Address(network.P2SHVersion, s.captureOne());
-	        addrStrs.push(addr.toString());
-	        break;
-	      case Script.TX_MULTISIG:
-	        var chunks = s.capture();
-	        chunks.forEach(function(chunk) {
-	          var a = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk));
-	          addrStrs.push(a.toString());
-	        });
-	        break;
-	      case Script.TX_UNKNOWN:
-	        console.log('tx type unkown');
-	        break;
-	    }
-	    return addrStrs;
-	  };
-	
-	  var script = 'DUP HASH160 0x14 0x3744841e13b90b4aca16fe793a7f88da3a23cc71 EQUALVERIFY CHECKSIG';
-	  var s = Script.fromHumanReadable(script);
-	  console.log(getAddrStr(s)[0]); // mkZBYBiq6DNoQEKakpMJegyDbw2YiNQnHT
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#SendTx.js
-	'use strict';
-	
-	var run = function() {
-	  // Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var Peer = bitcore.Peer;
-	
-	  var TransactionBuilder = bitcore.TransactionBuilder;
-	  var PeerManager = bitcore.PeerManager;
-	
-	  // Unspent transactions can be found via the insight.bitcore.io or blockchain.info APIs
-	  var unspent = [{
-	      'txid': '707108b5ba4f78dc951df4647a03365bf36432ea57fb641676045c5044daaea7',
-	      'vout': 0,
-	      'address': 'n3QDC7DzsMmN4mcyp3k7XGPX7zFXXHG387',
-	      'scriptPubKey': '76a914f00c4a92ee2314ab08ac0283dc8d07d9bf2be32388ac',
-	      'amount': 0.12345600,
-	      'confirmations': 43537
-	    }, {
-	      'txid': '87a158d32833cb555aea27b6a21af569ccaeb8f9b19691e05f1e6c2b3440bdb3',
-	      'vout': 1,
-	      'address': 'mxdrp9s4mVxS9X4RBYiLe99v59V81XA5C3',
-	      'scriptPubKey': '76a914bbc87986da6b17c7876db4efacf59a95e14f6cf588ac',
-	      'amount': 0.05749800,
-	      'confirmations': 43536
-	    }
-	
-	  ];
-	
-	  // Private keys in WIF format (see TransactionBuilder.js for other options)
-	  var keys = [
-	    'cQA75LXhV5JkMT8wkkqjR87SnHK4doh3c21p7PAd5tp8tc1tRBAY',
-	    'cRz85dz9AiDieRpEwoucfXXQa1jdHHghcv6YnnVVGZ3MQyR1X4u2',
-	    'cSq7yo4fvsbMyWVN945VUGUWMaSazZPWqBVJZyoGsHmNq6W4HVBV',
-	    'cPa87VgwZfowGZYaEenoQeJgRfKW6PhZ1R65EHTkN1K19cSvc92G',
-	    'cPQ9DSbBRLva9av5nqeF5AGrh3dsdW8p2E5jS4P8bDWZAoQTeeKB'
-	  ];
-	
-	  var peerman = new PeerManager({
-	    network: 'testnet'
-	  });
-	  peerman.addPeer(new Peer('127.0.0.1', 18333));
-	
-	  peerman.on('connect', function() {
-	    var conn = peerman.getActiveConnection();
-	    if (conn) {
-	      // define transaction output
-	      var outs = [{
-	        address: 'mhNCT9TwZAGF1tLPpZdqfkTmtBkY282YDW',
-	        amount: 0.1337
-	      }];
-	      // set change address
-	      var opts = {
-	        remainderOut: {
-	          address: 'n4g2TFaQo8UgedwpkYdcQFF6xE2Ei9Czvy'
-	        }
-	      };
-	      var tx = new TransactionBuilder(opts)
-	        .setUnspent(unspent)
-	        .setOutputs(outs)
-	        .sign(keys)
-	        .build();
-	
-	      /* Create and signing can be done in multiple steps:
-	       *
-	       *  var builder = new bitcore.TransactionBuilder(opts)
-	       *                .setUnspent(utxos)
-	       *                .setOutputs(outs);
-	       *
-	       *  // Sign with the first key
-	       *  builder.sign(key1);
-	       *  var tx = builder.build(); // Partially signed transaction
-	       *
-	       *  // Sign with the second key
-	       *  builder.sign(key2);
-	       *  if (builder.isFullySigned()){
-	       *   var tx = builder.build();
-	       *  }
-	       *
-	       *  var selectedUnspent = build.getSelectedUnspent(); // Retrieve selected unspent outputs from the transaction
-	       */
-	
-	      var txid = tx.getHash().toString('hex');
-	      console.log('Created transaction with txid ' + txid);
-	      var raw_tx = tx.serialize().toString('hex');
-	      console.log('Transaction raw hex dump:');
-	      console.log('-------------------------------------');
-	      console.log(raw_tx);
-	      console.log('-------------------------------------');
-	      // finally, send transaction to the bitcoin network
-	      conn.sendTx(tx);
-	
-	      // for now, the network won't respond in any case
-	      // (transaction accepted, transaction rejected)
-	      // in the future, we may listen to 'reject' message
-	      // see https://gist.github.com/gavinandresen/7079034
-	    }
-	  });
-	
-	  peerman.start();
-	
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
-#SimpleP2Pmonitor.js
-	/**
-	 * This is a simple script that will display network messages.
-	 * It users the Peer / Connection classes directly instead of
-	 * relying on PeerManager.
-	 */
-	
-	// replace by require('bitcore') if you use somewhere else
-	var bitcore = require('../');
-	
-	//bitcore.config.logger = 'debug';
-	
-	var Peer = bitcore.Peer,
-	  Connection = bitcore.Connection;
-	
-	var peer = new Peer('127.0.0.1', 8333);
-	
-	var socket = peer.createConnection();
-	
-	var con = new Connection(socket, peer);
-	
-	con.on('error', function(msg) {
-	  var peer = msg.peer,
-	    err = msg.err;
-	  console.error('Error connecting to peer', peer.host + ':' + peer.port, '(' + err.message + ')');
-	});
-	
-	con.on('disconnect', function(msg) {
-	  console.log('disconnect: ', msg);
-	});
-	
-	con.on('connect', function(msg) {
-	  console.log('Connected to %s', msg.peer.host + ':' + msg.peer.port);
-	});
-	
-	/* Listen P2P messages */
-	
-	// Make a log function available to all listeners
-	// The log function is just like console.log except it prefixes 
-	// messages with [host:port]
-	function listen(event_name, fn) {
-	  con.on(event_name, function(event) {
-	    fn(event, function() {
-	      var args = Array.prototype.slice.call(arguments);
-	      var str = args.shift();
-	      str = '[%s:%s] ' + str;
-	      args = [str, event.peer.host, event.peer.port].concat(args);
-	      console.log.apply(console, args);
-	    });
-	  });
-	}
-	
-	listen('getaddr', function(event, log) {
-	  log('Received message getaddr');
-	  log(event);
-	});
-	
-	listen('verack', function(event, log) {
-	  log('Received message verack');
-	});
-	
-	listen('version', function(event, log) {
-	  log('Received message version (%s)', event.message.version);
-	});
-	
-	listen('addr', function(event, log) {
-	  log('Received message addr (%s addresses)', event.message.addrs.length);
-	});
-	
-	listen('inv', function(event, log) {
-	  log('Received message inv (%s invs)', event.message.count);
-	  console.log(event.message.invs);
-	});
-	
-#VanityAddress.js
-	'use strict';
-	
-	
-	var run = function() {
-	  // Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
-	  var bitcore = require('../bitcore');
-	  var Key = bitcore.Key;
-	  var Address = bitcore.Address;
-	
-	  // config your regular expression
-	  var re = /[0-9]{6}$/; // ends in 6 digits
-	
-	  var a, k, m;
-	  while (true) {
-	    k = Key.generateSync();
-	    a = Address.fromKey(k);
-	    m = a.toString().match(re);
-	    if (m) break;
-	  }
-	  console.log('Address: ' + a.toString());
-	  console.log('Private Key: ' + k.private.toString('hex'));
-	
-	};
-	
-	module.exports.run = run;
-	if (require.main === module) {
-	  run();
-	}
-	
diff --git a/index.js b/index.js
index 144b8cd..efd44c6 100644
--- a/index.js
+++ b/index.js
@@ -29,17 +29,6 @@ bitcore.Txin = require('./lib/txin');
 bitcore.Txout = require('./lib/txout');
 bitcore.Varint = require('./lib/varint');
 
-//experimental, nonstandard, or unstable features
-bitcore.expmt = {};
-bitcore.expmt.AES = require('./lib/expmt/aes');
-bitcore.expmt.AESCBC = require('./lib/expmt/aescbc');
-bitcore.expmt.CBC = require('./lib/expmt/cbc');
-bitcore.expmt.ECIES = require('./lib/expmt/ecies');
-bitcore.expmt.StealthAddress = require('./lib/expmt/stealthaddress');
-bitcore.expmt.Stealthkey = require('./lib/expmt/stealthkey');
-bitcore.expmt.StealthMessage = require('./lib/expmt/stealthmessage');
-bitcore.expmt.StealthTx = require('./lib/expmt/stealthtx');
-
 //dependencies, subject to change
 bitcore.deps = {};
 bitcore.deps.aes = require('aes');
diff --git a/lib/expmt/aes.js b/lib/expmt/aes.js
deleted file mode 100644
index 4117ed4..0000000
--- a/lib/expmt/aes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var aes = require('aes');
-
-var AES = function AES() {
-};
-
-AES.encrypt = function(messagebuf, keybuf) {
-  var key = AES.buf2words(keybuf);
-  var message = AES.buf2words(messagebuf);
-  var a = new aes(key);
-  var enc = a.encrypt(message);
-  var encbuf = AES.words2buf(enc);
-  return encbuf;
-};
-
-AES.decrypt = function(encbuf, keybuf) {
-  var enc = AES.buf2words(encbuf);
-  var key = AES.buf2words(keybuf);
-  var a = new aes(key);
-  var message = a.decrypt(enc);
-  var messagebuf = AES.words2buf(message);
-  return messagebuf;
-};
-
-AES.buf2words = function(buf) {
-  if (buf.length % 4)
-    throw new Error('buf length must be a multiple of 4');
-
-  var words = [];
-
-  for (var i = 0; i < buf.length / 4; i++) {
-    words.push(buf.readUInt32BE(i * 4));
-  };
-
-  return words;
-};
-
-AES.words2buf = function(words) {
-  var buf = new Buffer(words.length * 4);
-
-  for (var i = 0; i < words.length; i++) {
-    buf.writeUInt32BE(words[i], i * 4);
-  };
-
-  return buf;
-};
-
-module.exports = AES;
diff --git a/lib/expmt/aescbc.js b/lib/expmt/aescbc.js
deleted file mode 100644
index 401cb78..0000000
--- a/lib/expmt/aescbc.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var AES = require('./aes');
-var CBC = require('./cbc');
-var Random = require('../random');
-var Hash = require('../hash');
-
-// Symmetric encryption with AES and CBC convenience class
-var AESCBC = function AESCBC() {
-};
-
-AESCBC.encrypt = function(messagebuf, passwordstr) {
-  var cipherkeybuf = Hash.sha256(new Buffer(passwordstr));
-  return AESCBC.encryptCipherkey(messagebuf, cipherkeybuf);
-};
-
-AESCBC.decrypt = function(encbuf, passwordstr) {
-  var cipherkeybuf = Hash.sha256(new Buffer(passwordstr));
-  return AESCBC.decryptCipherkey(encbuf, cipherkeybuf);
-};
-
-AESCBC.encryptCipherkey = function(messagebuf, cipherkeybuf, ivbuf) {
-  ivbuf = ivbuf || Random.getRandomBuffer(128 / 8);
-  var ctbuf = CBC.encrypt(messagebuf, ivbuf, AES, cipherkeybuf);
-  var encbuf = Buffer.concat([ivbuf, ctbuf]);
-  return encbuf;
-};
-
-AESCBC.decryptCipherkey = function(encbuf, cipherkeybuf) {
-  var ivbuf = encbuf.slice(0, 128 / 8);
-  var ctbuf = encbuf.slice(128 / 8);
-  var messagebuf = CBC.decrypt(ctbuf, ivbuf, AES, cipherkeybuf);
-  return messagebuf;
-};
-
-module.exports = AESCBC;
diff --git a/lib/expmt/cbc.js b/lib/expmt/cbc.js
deleted file mode 100644
index f509ba8..0000000
--- a/lib/expmt/cbc.js
+++ /dev/null
@@ -1,138 +0,0 @@
-var Random = require('../random');
-
-// Cipher Block Chaining
-// http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29
-var CBC = function CBC(blockcipher, cipherkeybuf, ivbuf) {
-  if (!(this instanceof CBC))
-    return new CBC(blockcipher, cipherkeybuf, ivbuf);
-
-  this.blockcipher = blockcipher;
-  this.cipherkeybuf = cipherkeybuf;
-  this.ivbuf = ivbuf;
-};
-
-CBC.buf2blockbufs = function(buf, blocksize) {
-  var bytesize = blocksize / 8;
-  var blockbufs = [];
-
-  for (var i = 0; i <= buf.length / bytesize; i++) {
-    var blockbuf = buf.slice(i * bytesize, i * bytesize + bytesize);
-
-    if (blockbuf.length < blocksize)
-      blockbuf = CBC.pkcs7pad(blockbuf, blocksize);
-
-    blockbufs.push(blockbuf);
-  }
-
-  return blockbufs;
-};
-
-CBC.blockbufs2buf = function(blockbufs, blocksize) {
-  var bytesize = blocksize / 8;
-
-  var last = blockbufs[blockbufs.length - 1];
-  last = CBC.pkcs7unpad(last);
-  blockbufs[blockbufs.length - 1] = last;
-
-  var buf = Buffer.concat(blockbufs);
-
-  return buf;
-};
-
-CBC.encrypt = function(messagebuf, ivbuf, blockcipher, cipherkeybuf) {
-  var blocksize = ivbuf.length * 8;
-  var blockbufs = CBC.buf2blockbufs(messagebuf, blocksize);
-  var encbufs = CBC.encryptblocks(blockbufs, ivbuf, blockcipher, cipherkeybuf);
-  var encbuf = Buffer.concat(encbufs);
-  return encbuf;
-};
-
-CBC.decrypt = function(encbuf, ivbuf, blockcipher, cipherkeybuf) {
-  var blocksize = ivbuf.length * 8;
-  var bytesize = ivbuf.length;
-  var encbufs = [];
-  for (var i = 0; i < encbuf.length / bytesize; i++) {
-    encbufs.push(encbuf.slice(i * bytesize, i * bytesize + bytesize));
-  }
-  var blockbufs = CBC.decryptblocks(encbufs, ivbuf, blockcipher, cipherkeybuf);
-  var buf = CBC.blockbufs2buf(blockbufs, blocksize);
-  return buf;
-};
-
-CBC.encryptblock = function(blockbuf, ivbuf, blockcipher, cipherkeybuf) {
-  var xorbuf = CBC.xorbufs(blockbuf, ivbuf);
-  var encbuf = blockcipher.encrypt(xorbuf, cipherkeybuf);
-  return encbuf;
-};
-
-CBC.decryptblock = function(encbuf, ivbuf, blockcipher, cipherkeybuf) {
-  var xorbuf = blockcipher.decrypt(encbuf, cipherkeybuf);
-  var blockbuf = CBC.xorbufs(xorbuf, ivbuf);
-  return blockbuf;
-};
-
-CBC.encryptblocks = function(blockbufs, ivbuf, blockcipher, cipherkeybuf) {
-  var encbufs = [];
-
-  for (var i = 0; i < blockbufs.length; i++) {
-    var blockbuf = blockbufs[i];
-    var encbuf = CBC.encryptblock(blockbuf, ivbuf, blockcipher, cipherkeybuf);
-
-    encbufs.push(encbuf);
-
-    ivbuf = encbuf;
-  }
-
-  return encbufs;
-};
-
-CBC.decryptblocks = function(encbufs, ivbuf, blockcipher, cipherkeybuf) {
-  var blockbufs = [];
-
-  for (var i = 0; i < encbufs.length; i++) {
-    var encbuf = encbufs[i];
-    var blockbuf = CBC.decryptblock(encbuf, ivbuf, blockcipher, cipherkeybuf);
-
-    blockbufs.push(blockbuf);
-
-    ivbuf = encbuf;
-  }
-
-  return blockbufs;
-};
-
-CBC.pkcs7pad = function(buf, blocksize) {
-  var bytesize = blocksize / 8;
-  var padbytesize = bytesize - buf.length;
-  var pad = new Buffer(padbytesize);
-  pad.fill(padbytesize);
-  var paddedbuf = Buffer.concat([buf, pad]);
-  return paddedbuf;
-};
-
-CBC.pkcs7unpad = function(paddedbuf, blocksize) {
-  var bytesize = blocksize / 8;
-  var padbytesize = bytesize - paddedbuf.length;
-  var padlength = paddedbuf[paddedbuf.length - 1];
-  var padbuf = paddedbuf.slice(paddedbuf.length - padlength, paddedbuf.length);
-  var padbuf2 = new Buffer(padlength);
-  padbuf2.fill(padlength);
-  if (padbuf.toString('hex') !== padbuf2.toString('hex'))
-    throw new Error('invalid padding');
-  return paddedbuf.slice(0, paddedbuf.length - padlength);
-};
-
-CBC.xorbufs = function(buf1, buf2) {
-  if (buf1.length !== buf2.length)
-    throw new Error('bufs must have the same length');
-
-  var buf = new Buffer(buf1.length);
-
-  for (var i = 0; i < buf1.length; i++) {
-    buf[i] = buf1[i] ^ buf2[i];
-  }
-
-  return buf;
-};
-
-module.exports = CBC;
diff --git a/lib/expmt/ecies.js b/lib/expmt/ecies.js
deleted file mode 100644
index 4eb4bff..0000000
--- a/lib/expmt/ecies.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var AESCBC = require('./aescbc');
-var Keypair = require('../keypair');
-var Point = require('../point');
-var Hash = require('../hash');
-var Pubkey = require('../pubkey');
-var Privkey = require('../privkey');
-
-// http://en.wikipedia.org/wiki/Integrated_Encryption_Scheme
-var ECIES = function ECIES() {
-  if (!(this instanceof ECIES))
-    return new ECIES();
-};
-
-ECIES.encrypt = function(messagebuf, topubkey, fromkeypair, ivbuf) {
-  if (!fromkeypair)
-    fromkeypair = Keypair().fromRandom();
-  var r = fromkeypair.privkey.bn;
-  var R = fromkeypair.pubkey.point;
-  var Rpubkey = fromkeypair.pubkey;
-  var Rbuf = Rpubkey.toDER(true);
-  var KB = topubkey.point;
-  var P = KB.mul(r);
-  var S = P.getX();
-  var Sbuf = S.toBuffer({size: 32});
-  var kEkM = Hash.sha512(Sbuf);
-  var kE = kEkM.slice(0, 32);
-  var kM = kEkM.slice(32, 64);
-  var c = AESCBC.encryptCipherkey(messagebuf, kE, ivbuf);
-  var d = Hash.sha256hmac(c, kM);
-  var encbuf = Buffer.concat([Rbuf, c, d]);
-  return encbuf;
-};
-
-ECIES.decrypt = function(encbuf, toprivkey) {
-  var kB = toprivkey.bn;
-  var frompubkey = Pubkey().fromDER(encbuf.slice(0, 33));
-  var R = frompubkey.point;
-  var P = R.mul(kB);
-  if (P.eq(new Point()))
-    throw new Error('P equals 0');
-  var S = P.getX();
-  var Sbuf = S.toBuffer({size: 32});
-  var kEkM = Hash.sha512(Sbuf);
-  var kE = kEkM.slice(0, 32);
-  var kM = kEkM.slice(32, 64);
-  var c = encbuf.slice(33, encbuf.length - 32);
-  var d = encbuf.slice(encbuf.length - 32, encbuf.length);
-  var d2 = Hash.sha256hmac(c, kM);
-  if (d.toString('hex') !== d2.toString('hex'))
-    throw new Error('Invalid checksum');
-  var messagebuf = AESCBC.decryptCipherkey(c, kE);
-  return messagebuf;
-};
-
-module.exports = ECIES;
diff --git a/lib/expmt/stealthaddress.js b/lib/expmt/stealthaddress.js
deleted file mode 100644
index 6635167..0000000
--- a/lib/expmt/stealthaddress.js
+++ /dev/null
@@ -1,127 +0,0 @@
-var Stealthkey = require('./stealthkey');
-var Base58check = require('../base58check');
-var Pubkey = require('../pubkey');
-var KDF = require('../kdf');
-var BufferWriter = require('../bufferwriter');
-var BufferReader = require('../bufferreader');
-
-var StealthAddress = function StealthAddress(addrstr) {
-  if (!(this instanceof StealthAddress))
-    return new StealthAddress(addrstr);
-  
-  if (typeof addrstr === 'string') {
-    this.fromString(addrstr)
-  }
-  else if (Buffer.isBuffer(addrstr)) {
-    var buf = addrstr;
-    this.fromBuffer(buf);
-  }
-  else if (addrstr) {
-    var obj = addrstr;
-    this.set(obj);
-  }
-};
-
-StealthAddress.mainver = 42;
-StealthAddress.testver = 43;
-
-StealthAddress.prototype.set = function(obj) {
-  this.payloadPubkey = obj.payloadPubkey || this.payloadPubkey;
-  this.scanPubkey = obj.scanPubkey || this.scanPubkey;
-  return this;
-};
-
-StealthAddress.prototype.fromJSON = function(json) {
-  this.fromString(json);
-  return this;
-};
-
-StealthAddress.prototype.toJSON = function() {
-  return this.toString();
-};
-
-StealthAddress.prototype.fromStealthkey = function(stealthkey) {
-  this.set({
-    payloadPubkey: stealthkey.payloadKeypair.pubkey,
-    scanPubkey: stealthkey.scanKeypair.pubkey
-  });
-  return this;
-};
-
-StealthAddress.prototype.fromBuffer = function(buf) {
-  var parsed = StealthAddress.parseDWBuffer(buf);
-  if ((parsed.version !== StealthAddress.mainver) && (parsed.version !== StealthAddress.testver))
-    throw new Error('Invalid version');
-  if (parsed.options !== 0)
-    throw new Error('Invalid options');
-  if (!parsed.scanPubkey)
-    throw new Error('Invalid scanPubkey');
-  if (parsed.payloadPubkeys.length !== 1)
-    throw new Error('Must have exactly one payloadPubkey');
-  if (parsed.nSigs !== 1)
-    throw new Error('Must require exactly one signature');
-  if (parsed.prefix.toString() !== "")
-    throw new Error('Only blank prefixes supported');
-  this.scanPubkey = parsed.scanPubkey;
-  this.payloadPubkey = parsed.payloadPubkeys[0];
-  return this;
-};
-
-StealthAddress.prototype.fromString = function(str) {
-  return this.fromBuffer(Base58check(str).toBuffer());
-};
-
-StealthAddress.prototype.getSharedKeypair = function(senderKeypair) {
-  var sharedSecretPoint = this.scanPubkey.point.mul(senderKeypair.privkey.bn);
-  var sharedSecretPubkey = Pubkey(sharedSecretPoint);
-  var buf = sharedSecretPubkey.toDER(true);
-  var sharedKeypair = KDF.sha256hmac2keypair(buf);
-
-  return sharedKeypair;
-};
-
-StealthAddress.prototype.getReceivePubkey = function(senderKeypair) {
-  var sharedKeypair = this.getSharedKeypair(senderKeypair);
-  var pubkey = Pubkey(this.payloadPubkey.point.add(sharedKeypair.pubkey.point));
-
-  return pubkey;
-};
-
-StealthAddress.prototype.toBuffer = function(networkstr) {
-  if (networkstr === 'testnet')
-    var version = StealthAddress.testver;
-  else
-    var version = StealthAddress.mainver;
-  var bw = new BufferWriter();
-  bw.writeUInt8(version);
-  bw.writeUInt8(0); //options
-  bw.write(this.scanPubkey.toDER(true));
-  bw.writeUInt8(1); //number of payload keys - we only support 1 (not multisig)
-  bw.write(this.payloadPubkey.toDER(true));
-  bw.writeUInt8(1); //number of signatures - we only support 1 (not multisig)
-  bw.writeUInt8(0); //prefix length - we do not support prefix yet
-  var buf = bw.concat();
-  return buf;
-};
-
-StealthAddress.prototype.toString = function(networkstr) {
-  return Base58check(this.toBuffer(networkstr)).toString();
-};
-
-StealthAddress.parseDWBuffer = function(buf) {
-  var br = new BufferReader(buf);
-  var parsed = {};
-  parsed.version = br.readUInt8();
-  parsed.options = br.readUInt8();
-  parsed.scanPubkey = Pubkey().fromBuffer(br.read(33));
-  parsed.nPayloadPubkeys = br.readUInt8();
-  parsed.payloadPubkeys = [];
-  for (var i = 0; i < parsed.nPayloadPubkeys; i++)
-    parsed.payloadPubkeys.push(Pubkey().fromBuffer(br.read(33)));
-  parsed.nSigs = br.readUInt8();
-  parsed.nPrefix = br.readUInt8();
-  parsed.prefix = br.read(parsed.nPrefix / 8);
-  return parsed;
-};
-
-module.exports = StealthAddress;
diff --git a/lib/expmt/stealthkey.js b/lib/expmt/stealthkey.js
deleted file mode 100644
index 7cf4d0f..0000000
--- a/lib/expmt/stealthkey.js
+++ /dev/null
@@ -1,88 +0,0 @@
-var Keypair = require('../keypair');
-var Privkey = require('../privkey');
-var Pubkey = require('../pubkey');
-var Point = require('../point');
-var Hash = require('../hash');
-var KDF = require('../kdf');
-
-var Stealthkey = function Stealthkey(payloadKeypair, scanKeypair) {
-  if (!(this instanceof Stealthkey))
-    return new Stealthkey(payloadKeypair, scanKeypair);
-
-  if (payloadKeypair instanceof Keypair) {
-    this.set({
-      payloadKeypair: payloadKeypair,
-      scanKeypair: scanKeypair
-    });
-  }
-  else if (payloadKeypair) {
-    var obj = payloadKeypair;
-    this.set(obj);
-  }
-};
-
-Stealthkey.prototype.set = function(obj) {
-  this.payloadKeypair = obj.payloadKeypair || this.payloadKeypair;
-  this.scanKeypair = obj.scanKeypair || this.scanKeypair;
-  return this;
-};
-
-Stealthkey.prototype.fromJSON = function(json) {
-  this.set({
-    payloadKeypair: Keypair().fromJSON(json.payloadKeypair),
-    scanKeypair: Keypair().fromJSON(json.scanKeypair)
-  });
-  return this;
-};
-
-Stealthkey.prototype.toJSON = function() {
-  return {
-    payloadKeypair: this.payloadKeypair.toJSON(),
-    scanKeypair: this.scanKeypair.toJSON()
-  };
-};
-
-Stealthkey.prototype.fromRandom = function() {
-  this.payloadKeypair = Keypair().fromRandom();
-  this.scanKeypair = Keypair().fromRandom();
-
-  return this;
-};
-
-Stealthkey.prototype.getSharedKeypair = function(senderPubkey) {
-  var sharedSecretPoint = senderPubkey.point.mul(this.scanKeypair.privkey.bn);
-  var sharedSecretPubkey = Pubkey({point: sharedSecretPoint});
-  var buf = sharedSecretPubkey.toDER(true);
-  var sharedKeypair = KDF.sha256hmac2keypair(buf);
-
-  return sharedKeypair;
-};
-
-Stealthkey.prototype.getReceivePubkey = function(senderPubkey) {
-  var sharedKeypair = this.getSharedKeypair(senderPubkey);
-  var pubkey = Pubkey({point: this.payloadKeypair.pubkey.point.add(sharedKeypair.pubkey.point)});
-
-  return pubkey;
-};
-
-Stealthkey.prototype.getReceiveKeypair = function(senderPubkey) {
-  var sharedKeypair = this.getSharedKeypair(senderPubkey);
-  var privkey = Privkey({bn: this.payloadKeypair.privkey.bn.add(sharedKeypair.privkey.bn).mod(Point.getN())});
-  var key = Keypair({privkey: privkey});
-  key.privkey2pubkey();
-
-  return key;
-};
-
-Stealthkey.prototype.isForMe = function(senderPubkey, myPossiblePubkeyhashbuf) {
-  var pubkey = this.getReceivePubkey(senderPubkey);
-  var pubkeybuf = pubkey.toDER(true);
-  var pubkeyhash = Hash.sha256ripemd160(pubkeybuf);
-
-  if (pubkeyhash.toString('hex') === myPossiblePubkeyhashbuf.toString('hex'))
-    return true;
-  else
-    return false;
-};
-
-module.exports = Stealthkey;
diff --git a/lib/expmt/stealthmessage.js b/lib/expmt/stealthmessage.js
deleted file mode 100644
index 71efd61..0000000
--- a/lib/expmt/stealthmessage.js
+++ /dev/null
@@ -1,85 +0,0 @@
-var Stealthkey = require('./stealthkey');
-var StealthAddress = require('./stealthaddress');
-var ECIES = require('./ecies');
-var Message = require('../message');
-var Keypair = require('../keypair');
-var Address = require('../address');
-var Pubkey = require('../pubkey');
-
-var StealthMessage = function StealthMessage(obj) {
-  if (!(this instanceof StealthMessage))
-    return new StealthMessage(obj);
-  if (obj)
-    this.set(obj);
-};
-
-StealthMessage.prototype.set = function(obj) {
-  this.messagebuf = obj.messagebuf || this.messagebuf;
-  this.encbuf = obj.encbuf || this.encbuf;
-  this.toStealthAddress = obj.toStealthAddress || this.toStealthAddress;
-  this.toStealthkey = obj.toStealthkey || this.toStealthkey;
-  this.fromKeypair = obj.fromKeypair || this.fromKeypair;
-  this.receiveAddress = obj.receiveAddress || this.receiveAddress;
-  return this;
-};
-
-StealthMessage.encrypt = function(messagebuf, toStealthAddress, fromKeypair, ivbuf) {
-  var sm = StealthMessage().set({
-    messagebuf: messagebuf,
-    toStealthAddress: toStealthAddress,
-    fromKeypair: fromKeypair
-  });
-  sm.encrypt(ivbuf);
-  var buf = Buffer.concat([
-    sm.receiveAddress.hashbuf,
-    sm.fromKeypair.pubkey.toDER(true),
-    sm.encbuf
-  ]);
-  return buf;
-};
-
-StealthMessage.decrypt = function(buf, toStealthkey) {
-  var sm = StealthMessage().set({
-    toStealthkey: toStealthkey,
-    receiveAddress: Address().set({hashbuf: buf.slice(0, 20)}),
-    fromKeypair: Keypair().set({pubkey: Pubkey().fromDER(buf.slice(20, 20 + 33))}),
-    encbuf: buf.slice(20 + 33)
-  });
-  return sm.decrypt().messagebuf;
-};
-
-StealthMessage.isForMe = function(buf, toStealthkey) {
-  var sm = StealthMessage().set({
-    toStealthkey: toStealthkey,
-    receiveAddress: Address().set({hashbuf: buf.slice(0, 20)}),
-    fromKeypair: Keypair().set({pubkey: Pubkey().fromDER(buf.slice(20, 20 + 33))}),
-    encbuf: buf.slice(20 + 33)
-  });
-  return sm.isForMe();
-};
-
-StealthMessage.prototype.encrypt = function(ivbuf) {
-  if (!this.fromKeypair)
-    this.fromKeypair = Keypair().fromRandom();
-  var receivePubkey = this.toStealthAddress.getReceivePubkey(this.fromKeypair);
-  this.receiveAddress = Address().fromPubkey(receivePubkey);
-  this.encbuf = ECIES.encrypt(this.messagebuf, receivePubkey, this.fromKeypair, ivbuf);
-  return this;
-};
-
-StealthMessage.prototype.decrypt = function() {
-  var receiveKeypair = this.toStealthkey.getReceiveKeypair(this.fromKeypair.pubkey);
-  this.messagebuf = ECIES.decrypt(this.encbuf, receiveKeypair.privkey);
-  return this;
-};
-
-StealthMessage.prototype.isForMe = function() {
-  var receivePubkey = this.toStealthkey.getReceivePubkey(this.fromKeypair.pubkey);
-  var receiveAddress = Address().fromPubkey(receivePubkey);
-  if (receiveAddress.toString('hex') === this.receiveAddress.toString('hex'))
-    return true;
-  else
-    return false;
-};
-
-module.exports = StealthMessage;
diff --git a/lib/expmt/stealthtx.js b/lib/expmt/stealthtx.js
deleted file mode 100644
index 0133166..0000000
--- a/lib/expmt/stealthtx.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var StealthAddress = require('./stealthaddress');
-var StealthKey = require('./stealthkey');
-var Transaction = require('../transaction');
-var Pubkey = require('../pubkey');
-
-var StealthTx = function StealthTx(tx, sa, sk) {
-  if (!(this instanceof StealthTx))
-    return new StealthTx(tx, sa, sk);
-  if (tx instanceof Transaction) {
-    this.tx = tx;
-    this.sa = sa;
-    this.sk = sk;
-  } else if (tx) {
-    var obj = tx;
-    this.set(obj);
-  }
-};
-
-StealthTx.prototype.set = function(obj) {
-  this.sk = obj.sk || this.sk;
-  this.sa = obj.sa || this.sa;
-  this.tx = obj.tx || this.tx;
-  return this;
-};
-
-StealthTx.prototype.isForMe = function() {
-  if (!this.notMine())
-    return true;
-  else
-    return false;
-};
-
-StealthTx.prototype.notMine = function() {
-  var err;
-  if (err = this.notStealth())
-    return "Not stealth: " + err;
-  var txopbuf = this.tx.txouts[0].script.chunks[1].buf;
-  var parsed = StealthTx.parseOpReturnData(txopbuf);
-  var pubkey = parsed.pubkey;
-  var pubkeyhashbuf = this.tx.txouts[1].script.chunks[2].buf;
-  var sk = this.sk;
-  if (sk.isForMe(pubkey, pubkeyhashbuf)) {
-    return false;
-  } else {
-    return "StealthTx not mine";
-  }
-};
-
-//For now, we only support a very limited variety of stealth tx
-StealthTx.prototype.notStealth = function() {
-  var txouts = this.tx.txouts;
-  if (!(txouts.length >= 2))
-    return "Not enough txouts";
-  if (!txouts[0].script.isOpReturn())
-    return "First txout is not OP_RETURN";
-  if (!txouts[1].script.isPubkeyhashOut())
-    return "Second txout is not pubkeyhash";
-  return false;
-};
-
-StealthTx.parseOpReturnData = function(buf) {
-  var parsed = {};
-  parsed.version = buf[0];
-  parsed.noncebuf = buf.slice(1, 5);
-  parsed.pubkey = Pubkey().fromBuffer(buf.slice(5, 5 + 33));
-  return parsed;
-};
-
-module.exports = StealthTx;
diff --git a/test/aes.js b/test/aes.js
deleted file mode 100644
index be09a4c..0000000
--- a/test/aes.js
+++ /dev/null
@@ -1,85 +0,0 @@
-var should = require('chai').should();
-var Hash = require('../lib/hash');
-var AES = require('../lib/expmt/aes');
-
-describe('AES', function() {
-  var m128 = Hash.sha256(new Buffer('test1')).slice(0, 128 / 8);
-  
-  var k128 = Hash.sha256(new Buffer('test2')).slice(0, 128 / 8);
-  var k192 = Hash.sha256(new Buffer('test2')).slice(0, 192 / 8);
-  var k256 = Hash.sha256(new Buffer('test2')).slice(0, 256 / 8);
-
-  var e128 = new Buffer('3477e13884125038f4dc24e9d2cfbbc7', 'hex');
-  var e192 = new Buffer('b670954c0e2da1aaa5f9063de04eb961', 'hex');
-  var e256 = new Buffer('dd2ce24581183a4a7c0b1068f8bc79f0', 'hex');
-
-
-  describe('@encrypt', function() {
-    
-    it('should encrypt with a 128 bit key', function() {
-      var encbuf = AES.encrypt(m128, k128);
-      encbuf.toString('hex').should.equal(e128.toString('hex'));
-    });
-      
-    it('should encrypt with a 192 bit key', function() {
-      var encbuf = AES.encrypt(m128, k192);
-      encbuf.toString('hex').should.equal(e192.toString('hex'));
-    });
-      
-    it('should encrypt with a 256 bit key', function() {
-      var encbuf = AES.encrypt(m128, k256);
-      encbuf.toString('hex').should.equal(e256.toString('hex'));
-    });
-      
-  });
-
-  describe('@decrypt', function() {
-    
-    it('should encrypt/decrypt with a 128 bit key', function() {
-      var encbuf = AES.encrypt(m128, k128);
-      var m = AES.decrypt(encbuf, k128);
-      m.toString('hex').should.equal(m128.toString('hex'));
-    });
-      
-    it('should encrypt/decrypt with a 192 bit key', function() {
-      var encbuf = AES.encrypt(m128, k192);
-      var m = AES.decrypt(encbuf, k192);
-      m.toString('hex').should.equal(m128.toString('hex'));
-    });
-      
-    it('should encrypt/decrypt with a 256 bit key', function() {
-      var encbuf = AES.encrypt(m128, k256);
-      var m = AES.decrypt(encbuf, k256);
-      m.toString('hex').should.equal(m128.toString('hex'));
-    });
-      
-  });
-
-  describe('@buf2words', function() {
-    
-    it('should convert this 4 length buffer into an array', function() {
-      var buf = new Buffer([0, 0, 0, 0]);
-      var words = AES.buf2words(buf);
-      words.length.should.equal(1);
-    });
-
-    it('should throw an error on this 5 length buffer', function() {
-      var buf = new Buffer([0, 0, 0, 0, 0]);
-      (function() {
-        var words = AES.buf2words(buf);
-      }).should.throw();
-    });
-
-  });
-
-  describe('@words2buf', function() {
-    
-    it('should convert this array into a buffer', function() {
-      var a = [100, 0];
-      var buf = AES.words2buf(a);
-      buf.length.should.equal(8);
-    });
-
-  });
-
-});
diff --git a/test/aescbc.js b/test/aescbc.js
deleted file mode 100644
index a1dca59..0000000
--- a/test/aescbc.js
+++ /dev/null
@@ -1,73 +0,0 @@
-var should = require('chai').should();
-var AESCBC = require('../lib/expmt/aescbc');
-
-describe('AESCBC', function() {
-
-  describe('@encrypt', function() {
-
-    it('should return encrypt one block', function() {
-      var password = "password";
-      var messagebuf = new Buffer(128 / 8 - 1);
-      messagebuf.fill(0);
-      var encbuf = AESCBC.encrypt(messagebuf, password);
-      encbuf.length.should.equal(128 / 8 + 128 / 8);
-    });
-
-  });
-
-  describe('@decrypt', function() {
-
-    it('should decrypt that which was encrypted', function() {
-      var password = "password";
-      var messagebuf = new Buffer(128 / 8 - 1);
-      messagebuf.fill(0);
-      var encbuf = AESCBC.encrypt(messagebuf, password);
-      var messagebuf2 = AESCBC.decrypt(encbuf, password);
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-
-  describe('@encryptCipherkey', function() {
-
-    it('should return encrypt one block', function() {
-      var cipherkeybuf = new Buffer(256 / 8);
-      cipherkeybuf.fill(0x10);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0);
-      var messagebuf = new Buffer(128 / 8 - 1);
-      messagebuf.fill(0);
-      var encbuf = AESCBC.encryptCipherkey(messagebuf, cipherkeybuf, ivbuf);
-      encbuf.length.should.equal(128 / 8 + 128 / 8);
-    });
-
-    it('should return encrypt two blocks', function() {
-      var cipherkeybuf = new Buffer(256 / 8);
-      cipherkeybuf.fill(0x10);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0);
-      var messagebuf = new Buffer(128 / 8);
-      messagebuf.fill(0);
-      var encbuf = AESCBC.encryptCipherkey(messagebuf, cipherkeybuf, ivbuf);
-      encbuf.length.should.equal(128 / 8 + 128 / 8 + 128 / 8);
-    });
-
-  });
-
-  describe('@decryptCipherkey', function() {
-    
-    it('should decrypt that which was encrypted', function() {
-      var cipherkeybuf = new Buffer(256 / 8);
-      cipherkeybuf.fill(0x10);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0);
-      var messagebuf = new Buffer(128 / 8);
-      messagebuf.fill(0);
-      var encbuf = AESCBC.encryptCipherkey(messagebuf, cipherkeybuf, ivbuf);
-      var messagebuf2 = AESCBC.decryptCipherkey(encbuf, cipherkeybuf);
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-
-});
diff --git a/test/cbc.js b/test/cbc.js
deleted file mode 100644
index 1b163f5..0000000
--- a/test/cbc.js
+++ /dev/null
@@ -1,317 +0,0 @@
-var AES = require('../lib/expmt/aes');
-var should = require('chai').should();
-var CBC = require('../lib/expmt/cbc');
-
-describe('CBC', function() {
-
-  it('should return a new CBC', function() {
-    var cbc = new CBC();
-    should.exist(cbc);
-  })
-
-  it('should return a new CBC when called without "new"', function() {
-    var cbc = new CBC();
-    should.exist(cbc);
-  });
-
-  describe('@buf2blockbufs', function() {
-
-    it('should convert this buffer into one block', function() {
-      var buf = new Buffer(16 - 1);
-      buf.fill(0);
-      var blockbufs = CBC.buf2blockbufs(buf, 16 * 8);
-      blockbufs.length.should.equal(1);
-      blockbufs[0].toString('hex').should.equal('00000000000000000000000000000001');
-    });
-
-    it('should convert this buffer into two blocks', function() {
-      var buf = new Buffer(16);
-      buf.fill(0);
-      var blockbufs = CBC.buf2blockbufs(buf, 16 * 8);
-      blockbufs.length.should.equal(2);
-      blockbufs[0].toString('hex').should.equal('00000000000000000000000000000000');
-      blockbufs[1].toString('hex').should.equal('10101010101010101010101010101010');
-    });
-
-  });
-  
-  describe('@buf2blockbufs', function() {
-
-    it('should convert this buffer into one block and back into the same buffer', function() {
-      var buf = new Buffer(16 - 1);
-      buf.fill(0);
-      var blockbufs = CBC.buf2blockbufs(buf, 16 * 8);
-      var buf2 = CBC.blockbufs2buf(blockbufs, 16 * 8);
-      buf2.toString('hex').should.equal(buf.toString('hex'));
-    });
-
-    it('should convert this buffer into two blocks and back into the same buffer', function() {
-      var buf = new Buffer(16);
-      buf.fill(0);
-      var blockbufs = CBC.buf2blockbufs(buf, 16 * 8);
-      var buf2 = CBC.blockbufs2buf(blockbufs, 16 * 8);
-      buf2.toString('hex').should.equal(buf.toString('hex'));
-    });
-
-  });
-  
-  describe('@encrypt', function() {
-
-    it('should return this known value', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(128 / 8);
-      messagebuf2.fill(0x10);
-      var messagebuf = Buffer.concat([messagebuf1, messagebuf2]);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      blockcipher.decrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf);
-    });
-
-    it('should return this shorter known value', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(120 / 8);
-      messagebuf2.fill(0x10);
-      var messagebuf = Buffer.concat([messagebuf1, messagebuf2]);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      blockcipher.decrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf);
-    });
-
-    it('should return this shorter known value', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(136 / 8);
-      messagebuf2.fill(0x10);
-      var messagebuf = Buffer.concat([messagebuf1, messagebuf2]);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      blockcipher.decrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf);
-    });
-
-    it('should encrypt something with AES', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(128 / 8);
-      messagebuf2.fill(0x10);
-      var messagebuf = Buffer.concat([messagebuf1, messagebuf2]);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = AES;
-      var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf);
-      buf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-  
-  describe('@decrypt', function() {
-
-    it('should properly decrypt an encrypted message', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(128 / 8);
-      messagebuf2.fill(0x10);
-      var messagebuf = Buffer.concat([messagebuf1, messagebuf2]);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      blockcipher.decrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      var messagebuf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf);
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-  
-  describe('@encryptblock', function() {
-
-    it('should return this known value', function() {
-      var messagebuf = new Buffer(128 / 8);
-      messagebuf.fill(0);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var enc = CBC.encryptblock(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      enc.toString('hex').should.equal(ivbuf.toString('hex'));
-    });
-
-    it('should return this other known value', function() {
-      var messagebuf = new Buffer(128 / 8);
-      messagebuf.fill(0x10);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var enc = CBC.encryptblock(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      enc.toString('hex').should.equal('00000000000000000000000000000000');
-    });
-
-  });
-  
-  describe('@decryptblock', function() {
-
-    it('should decrypt an encrypted block', function() {
-      var messagebuf = new Buffer(128 / 8);
-      messagebuf.fill(0);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {};
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      blockcipher.decrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbuf = CBC.encryptblock(messagebuf, ivbuf, blockcipher, cipherkeybuf);
-      var buf = CBC.decryptblock(encbuf, ivbuf, blockcipher, cipherkeybuf);
-      buf.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-  
-  describe('@encryptblocks', function() {
-
-    it('should return this known value', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(128 / 8);
-      messagebuf2.fill(0x10);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {}
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbufs = CBC.encryptblocks([messagebuf1, messagebuf2], ivbuf, blockcipher, cipherkeybuf);
-      encbufs[0].toString('hex').should.equal('10101010101010101010101010101010');
-      encbufs[1].toString('hex').should.equal('00000000000000000000000000000000');
-    });
-
-  });
-  
-  describe('@decryptblocks', function() {
-
-    it('should decrypt encrypted blocks', function() {
-      var messagebuf1 = new Buffer(128 / 8);
-      messagebuf1.fill(0);
-      var messagebuf2 = new Buffer(128 / 8);
-      messagebuf2.fill(0x10);
-      var ivbuf = new Buffer(128 / 8);
-      ivbuf.fill(0x10);
-      var cipherkeybuf = new Buffer(128 / 8);
-      cipherkeybuf.fill(0);
-      var blockcipher = {}
-      blockcipher.encrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      blockcipher.decrypt = function(messagebuf, cipherkeybuf) {
-        return messagebuf;
-      };
-      var encbufs = CBC.encryptblocks([messagebuf1, messagebuf2], ivbuf, blockcipher, cipherkeybuf);
-      var bufs = CBC.decryptblocks(encbufs, ivbuf, blockcipher, cipherkeybuf);
-      bufs[0].toString('hex').should.equal(messagebuf1.toString('hex'));
-      bufs[1].toString('hex').should.equal(messagebuf2.toString('hex'));
-    });
-
-  });
-  
-  describe('@pkcs7pad', function() {
-    
-    it('should pad this 32 bit buffer to 128 bits with the number 128/8 - 32/8', function() {
-      var buf = new Buffer(32 / 8);
-      buf.fill(0);
-      var padbuf = CBC.pkcs7pad(buf, 128);
-      padbuf.length.should.equal(128 / 8);
-      padbuf[32 / 8].should.equal(128 / 8 - 32 / 8);
-      padbuf[32 / 8 + 1].should.equal(128 / 8 - 32 / 8);
-      // ...
-      padbuf[32 / 8 + 128 / 8 - 32 / 8 - 1].should.equal(128 / 8 - 32 / 8);
-    });
-
-  });
-
-  describe('@pkcs7unpad', function() {
-    
-    it('should unpad this padded 32 bit buffer', function() {
-      var buf = new Buffer(32 / 8);
-      buf.fill(0);
-      var paddedbuf = CBC.pkcs7pad(buf, 128);
-      var unpaddedbuf = CBC.pkcs7unpad(paddedbuf, 128);
-      unpaddedbuf.toString('hex').should.equal(buf.toString('hex'));
-    });
-
-  });
-
-  describe('@xorbufs', function() {
-    
-    it('should xor 1 and 0', function() {
-      var buf1 = new Buffer([1]);
-      var buf2 = new Buffer([0]);
-      var buf = CBC.xorbufs(buf1, buf2);
-      buf[0].should.equal(1);
-    });
-
-    it('should xor 1 and 1', function() {
-      var buf1 = new Buffer([1]);
-      var buf2 = new Buffer([1]);
-      var buf = CBC.xorbufs(buf1, buf2);
-      buf[0].should.equal(0);
-    });
-
-  });
-
-});
diff --git a/test/ecies.js b/test/ecies.js
deleted file mode 100644
index 5e8078b..0000000
--- a/test/ecies.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var ECIES = require('../lib/expmt/ecies');
-var should = require('chai').should();
-var Keypair = require('../lib/keypair');
-var Hash = require('../lib/hash');
-
-describe('#ECIES', function() {
-  
-  it('should make a new ECIES object', function() {
-    var ecies = new ECIES();
-    should.exist(ecies);
-  });
-
-  it('should make a new ECIES object when called without "new"', function() {
-    var ecies = ECIES();
-    should.exist(ecies);
-  });
-
-  var fromkey = Keypair().fromRandom();
-  var tokey = Keypair().fromRandom();
-  var messagebuf = Hash.sha256(new Buffer('my message is the hash of this string'));
-
-  describe('@encrypt', function() {
-
-    it('should return a buffer', function() {
-      var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey, fromkey);
-      Buffer.isBuffer(encbuf).should.equal(true);
-    });
-
-    it('should return a buffer if fromkey is not present', function() {
-      var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey);
-      Buffer.isBuffer(encbuf).should.equal(true);
-    });
-
-  });
-
-  describe('@decrypt', function() {
-
-    it('should decrypt that which was encrypted', function() {
-      var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey, fromkey);
-      var messagebuf2 = ECIES.decrypt(encbuf, tokey.privkey);
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-    it('should decrypt that which was encrypted if fromkeypair was randomly generated', function() {
-      var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey);
-      var messagebuf2 = ECIES.decrypt(encbuf, tokey.privkey);
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-
-});
diff --git a/test/stealthaddress.js b/test/stealthaddress.js
deleted file mode 100644
index 3b8e3e8..0000000
--- a/test/stealthaddress.js
+++ /dev/null
@@ -1,149 +0,0 @@
-var StealthAddress = require('../lib/expmt/stealthaddress');
-var should = require('chai').should();
-var Stealthkey = require('../lib/expmt/stealthkey');
-var Keypair = require('../lib/keypair');
-var Privkey = require('../lib/privkey');
-var Pubkey = require('../lib/pubkey');
-var BN = require('../lib/bn');
-var Hash = require('../lib/hash');
-var Base58check = require('../lib/base58check');
-
-describe('StealthAddress', function() {
-  
-  var stealthkey = Stealthkey();
-  stealthkey.payloadKeypair = Keypair();
-  stealthkey.payloadKeypair.privkey = Privkey();
-  stealthkey.payloadKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 1')));
-  stealthkey.payloadKeypair.privkey2pubkey();
-  stealthkey.scanKeypair = Keypair();
-  stealthkey.scanKeypair.privkey = Privkey();
-  stealthkey.scanKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 2')));
-  stealthkey.scanKeypair.privkey2pubkey();
-
-  var senderKeypair = Keypair();
-  senderKeypair.privkey = Privkey();
-  senderKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 3')));
-  senderKeypair.privkey2pubkey();
-
-  var addressString = 'vJmtuUb8ysKiM1HtHQF23FGfjGAKu5sM94UyyjknqhJHNdj5CZzwtpGzeyaATQ2HvuzomNVtiwsTJSWzzCBgCTtUZbRFpzKVq9MAUr';
-  var dwhex = '2a0002697763d7e9becb0c180083738c32c05b0e2fee26d6278020c06bbb04d5f66b32010362408459041e0473298af3824dbabe4d2b7f846825ed4d1c2e2c670c07cb275d0100';
-  var dwbuf = new Buffer(dwhex, 'hex');
-
-  it('should make a new stealth address', function() {
-    var sa = new StealthAddress();
-    should.exist(sa);
-    sa = StealthAddress();
-    should.exist(sa);
-    sa = StealthAddress(addressString);
-    should.exist(sa);
-    sa = StealthAddress(Base58check.decode(addressString));
-    should.exist(sa);
-  });
-
-  describe('#fromJSON', function() {
-
-    it('should give a stealthkey address with the right pubkeys', function() {
-      var sa = new StealthAddress();
-      sa.fromJSON(addressString);
-      sa.payloadPubkey.toString().should.equal(stealthkey.payloadKeypair.pubkey.toString());
-      sa.scanPubkey.toString().should.equal(stealthkey.scanKeypair.pubkey.toString());
-    });
-
-  });
-
-  describe('#toJSON', function() {
-    
-    it('should return this known address string', function() {
-      StealthAddress().fromJSON(addressString).toJSON().should.equal(addressString);
-    });
-
-  });
-
-  describe('#fromBuffer', function() {
-
-    it('should parse this DW buffer', function() {
-      StealthAddress().fromBuffer(new Buffer(dwhex, 'hex')).toBuffer().toString('hex').should.equal(dwhex);
-    });
-
-  });
-
-  describe('#fromString', function() {
-
-    it('should parse this DW buffer', function() {
-      StealthAddress().fromString(Base58check(new Buffer(dwhex, 'hex')).toString()).toBuffer().toString('hex').should.equal(dwhex);
-    });
-
-  });
-
-  describe('#getSharedKeypair', function() {
-
-    it('should return a key', function() {
-      var sa = new StealthAddress();
-      sa.payloadPubkey = stealthkey.payloadKeypair.pubkey;
-      sa.scanPubkey = stealthkey.scanKeypair.pubkey;
-      var key = sa.getSharedKeypair(senderKeypair);
-      (key instanceof Keypair).should.equal(true);
-    });
-
-    it('should return the same key as Stealthkey.prototype.getSharedKeypair', function() {
-      var sa = new StealthAddress();
-      sa.payloadPubkey = stealthkey.payloadKeypair.pubkey;
-      sa.scanPubkey = stealthkey.scanKeypair.pubkey;
-      var key = sa.getSharedKeypair(senderKeypair);
-
-      var key2 = stealthkey.getSharedKeypair(senderKeypair.pubkey);
-      key.toString().should.equal(key2.toString());
-    });
-
-  });
-
-  describe('#getReceivePubkey', function() {
-    
-    it('should return a pubkey', function() {
-      var pubkey = StealthAddress().fromStealthkey(stealthkey).getReceivePubkey(senderKeypair);
-      (pubkey instanceof Pubkey).should.equal(true);
-    });
-
-    it('should return the same pubkey as getReceivePubkey', function() {
-      var pubkey = StealthAddress().fromStealthkey(stealthkey).getReceivePubkey(senderKeypair);
-      var pubkey2 = stealthkey.getReceivePubkey(senderKeypair.pubkey);
-      pubkey2.toString().should.equal(pubkey.toString());
-    });
-
-  });
-
-  describe('#toBuffer', function() {
-    
-    it('should return this known address buffer', function() {
-      var buf = Base58check.decode(addressString);
-      StealthAddress().fromBuffer(dwbuf).toBuffer().toString('hex').should.equal(dwhex);
-    });
-
-  });
-
-  describe('#toString', function() {
-    
-    it('should return this known address buffer', function() {
-      var buf = Base58check.decode(addressString);
-      StealthAddress().fromBuffer(buf).toString().should.equal(Base58check(new Buffer(dwhex, 'hex')).toString());
-    });
-
-  });
-
-  describe('@parseDWBuffer', function() {
-
-    it('should parse this known DW buffer', function() {
-      var buf = new Buffer(dwhex, 'hex');
-      var parsed = StealthAddress.parseDWBuffer(buf);
-      parsed.version.should.equal(42);
-      parsed.options.should.equal(0);
-      parsed.scanPubkey.toString().should.equal('02697763d7e9becb0c180083738c32c05b0e2fee26d6278020c06bbb04d5f66b32');
-      parsed.nPayloadPubkeys.should.equal(1);
-      parsed.payloadPubkeys[0].toString().should.equal('0362408459041e0473298af3824dbabe4d2b7f846825ed4d1c2e2c670c07cb275d');
-      parsed.nSigs.should.equal(1);
-      parsed.prefix.toString().should.equal('');
-    });
-
-  });
-
-});
diff --git a/test/stealthkey.js b/test/stealthkey.js
deleted file mode 100644
index 17eed96..0000000
--- a/test/stealthkey.js
+++ /dev/null
@@ -1,138 +0,0 @@
-var should = require('chai').should();
-var Stealthkey = require('../lib/expmt/stealthkey');
-var Keypair = require('../lib/keypair');
-var Privkey = require('../lib/privkey');
-var Pubkey = require('../lib/pubkey');
-var BN = require('../lib/bn');
-var Hash = require('../lib/hash');
-
-describe('Stealthkey', function() {
-  
-  var stealthkey = Stealthkey();
-  stealthkey.payloadKeypair = Keypair();
-  stealthkey.payloadKeypair.privkey = Privkey();
-  stealthkey.payloadKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 1')));
-  stealthkey.payloadKeypair.privkey2pubkey();
-  stealthkey.scanKeypair = Keypair();
-  stealthkey.scanKeypair.privkey = Privkey();
-  stealthkey.scanKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 2')));
-  stealthkey.scanKeypair.privkey2pubkey();
-
-  var senderKeypair = Keypair();
-  senderKeypair.privkey = Privkey();
-  senderKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 3')));
-  senderKeypair.privkey2pubkey();
-
-  it('should create a new stealthkey', function() {
-    var stealthkey = new Stealthkey();
-    should.exist(stealthkey);
-  });
-
-  it('should create a new stealthkey without using "new"', function() {
-    var stealthkey = Stealthkey();
-    should.exist(stealthkey);
-  });
-
-  it('should create a new stealthkey with both keypairs in the constructor', function() {
-    var keypair1 = Keypair();
-    var keypair2 = Keypair();
-    var stealthkey = Stealthkey(keypair1, keypair2);
-    should.exist(stealthkey.payloadKeypair);
-    should.exist(stealthkey.scanKeypair);
-  });
-
-  describe('#set', function() {
-
-    it('should set payload key', function() {
-      should.exist(Stealthkey().set({payloadKeypair: stealthkey.payloadKeypair}).payloadKeypair);
-    });
-
-  });
-
-  describe('#fromJSON', function() {
-    
-    it('should make a stealthkey from this JSON', function() {
-      var sk = Stealthkey().fromJSON({
-        payloadKeypair: stealthkey.payloadKeypair.toJSON(),
-        scanKeypair: stealthkey.scanKeypair.toJSON()
-      });
-      sk.payloadKeypair.toString().should.equal(stealthkey.payloadKeypair.toString());
-      sk.scanKeypair.toString().should.equal(stealthkey.scanKeypair.toString());
-    });
-
-  });
-
-  describe('#toJSON', function() {
-    
-    it('should convert this stealthkey to json', function() {
-      var json = stealthkey.toJSON()
-      var json2 = Stealthkey().fromJSON(json).toJSON();
-      json.payloadKeypair.privkey.should.equal(json2.payloadKeypair.privkey);
-      json.scanKeypair.privkey.should.equal(json2.scanKeypair.privkey);
-    });
-
-  });
-
-  describe('#fromRandom', function() {
-
-    it('should create a new stealthkey from random', function() {
-      var stealthkey = Stealthkey().fromRandom();
-      should.exist(stealthkey.payloadKeypair.privkey.bn.gt(0));
-      should.exist(stealthkey.scanKeypair.privkey.bn.gt(0));
-    });
-
-  });
-
-  describe('#getSharedKeypair', function() {
-
-    it('should return a key', function() {
-      var key = stealthkey.getSharedKeypair(senderKeypair.pubkey);
-      (key instanceof Keypair).should.equal(true);
-    });
-
-  });
-
-  describe('#getReceivePubkey', function() {
-    
-    it('should return a pubkey', function() {
-      var pubkey = stealthkey.getReceivePubkey(senderKeypair.pubkey);
-      (pubkey instanceof Pubkey).should.equal(true);
-    });
-
-  });
-
-  describe('#getReceiveKeypair', function() {
-
-    it('should return a key', function() {
-      var key = stealthkey.getReceiveKeypair(senderKeypair.pubkey);
-      (key instanceof Keypair).should.equal(true);
-    });
-
-    it('should return a key with the same pubkey as getReceivePubkey', function() {
-      var key = stealthkey.getReceiveKeypair(senderKeypair.pubkey);
-      var pubkey = stealthkey.getReceivePubkey(senderKeypair.pubkey);
-      key.pubkey.toString().should.equal(pubkey.toString());
-    });
-
-    it('should return private key with length 32 or less', function() {
-      var key = stealthkey.getReceiveKeypair(senderKeypair.pubkey);
-      key.privkey.bn.toBuffer().length.should.be.below(33);
-    });
-
-  });
-
-  describe('#isForMe', function() {
-
-    it('should return true if it (the transaction or message) is for me', function() {
-      var pubkeyhash = new Buffer('3cb64fa6ee9b3e8754e3e2bd033bf61048604a99', 'hex');
-      stealthkey.isForMe(senderKeypair.pubkey, pubkeyhash).should.equal(true);
-    });
-
-    it('should return false if it (the transaction or message) is not for me', function() {
-      var pubkeyhash = new Buffer('00b64fa6ee9b3e8754e3e2bd033bf61048604a99', 'hex');
-      stealthkey.isForMe(senderKeypair.pubkey, pubkeyhash).should.equal(false);
-    });
-
-  });
-
-});
diff --git a/test/stealthmessage.js b/test/stealthmessage.js
deleted file mode 100644
index 16b2139..0000000
--- a/test/stealthmessage.js
+++ /dev/null
@@ -1,139 +0,0 @@
-var Keypair = require('../lib/keypair');
-var StealthMessage = require('../lib/expmt/stealthmessage');
-var Stealthkey = require('../lib/expmt/stealthkey');
-var StealthAddress = require('../lib/expmt/stealthaddress');
-var KDF = require('../lib/kdf');
-var Hash = require('../lib/hash');
-var should = require('chai').should();
-var Address = require('../lib/address');
-
-describe('StealthMessage', function() {
-
-  var payloadKeypair = KDF.buf2keypair(new Buffer('key1'));
-  var scanKeypair = KDF.buf2keypair(new Buffer('key2'));
-  var fromKeypair = KDF.buf2keypair(new Buffer('key3'));
-  var enchex = 'f557994f16d0d628fa4fdb4ab3d7e0bc5f2754f20381c7831a20c7c9ec88dcf092ea3683261798ccda991ed65a3a54a036d8125dec0381c7831a20c7c9ec88dcf092ea3683261798ccda991ed65a3a54a036d8125dec9f86d081884c7d659a2feaa0c55ad01560ba2904d3bc8395b6c4a6f87648edb33db6a22170e5e26f340c7ba943169210234cd6a753ad13919b0ab7d678b47b5e7d63e452382de2c2590fb57ef048f7b3';
-  var encbuf = new Buffer(enchex, 'hex');
-  var ivbuf = Hash.sha256(new Buffer('test')).slice(0, 128 / 8);
-  var sk = Stealthkey().set({payloadKeypair: payloadKeypair, scanKeypair: scanKeypair});
-  var sa = StealthAddress().fromStealthkey(sk);
-  var messagebuf = new Buffer('this is my message');
-  
-  it('should make a new stealthmessage', function() {
-    var sm = new StealthMessage();
-    should.exist(sm);
-    sm = StealthMessage()
-    should.exist(sm);
-  });
-
-  it('should allow "set" style syntax', function() {
-    var encbuf = StealthMessage().set({
-      messagebuf: messagebuf,
-      toStealthAddress: sa
-    }).encrypt().encbuf;
-    should.exist(encbuf);
-    encbuf.length.should.equal(113);
-  });
-
-  describe('#set', function() {
-    
-    it('should set the messagebuf', function() {
-      var sm = StealthMessage().set({messagebuf: messagebuf});
-      should.exist(sm.messagebuf);
-    });
-
-  });
-
-  describe('@encrypt', function() {
-
-    it('should encrypt a message', function() {
-      var encbuf = StealthMessage.encrypt(messagebuf, sa);
-      encbuf.length.should.equal(166);
-    });
-
-    it('should encrypt a message with this fromKeypair and ivbuf the same each time', function() {
-      var encbuf = StealthMessage.encrypt(messagebuf, sa, fromKeypair, ivbuf);
-      encbuf.length.should.equal(166);
-      encbuf.toString('hex').should.equal(enchex);
-    });
-
-  });
-
-  describe('@decrypt', function() {
-
-    it('should decrypt this known message correctly', function() {
-      var messagebuf2 = StealthMessage.decrypt(encbuf, sk);
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-
-  describe('@isForMe', function() {
-
-    it('should know that this message is for me', function() {
-      StealthMessage.isForMe(encbuf, sk).should.equal(true);
-    });
-
-    it('should know that this message is for me even if my payloadPrivkey is not present', function() {
-      var sk2 = new Stealthkey();
-      sk2.scanKeypair = sk.scanKeypair;
-      sk2.payloadKeypair = Keypair().set({pubkey: sk.payloadKeypair.pubkey});
-      should.not.exist(sk2.payloadKeypair.privkey);
-      StealthMessage.isForMe(encbuf, sk2).should.equal(true);
-    });
-
-  });
-
-  describe('#encrypt', function() {
-    
-    it('should encrypt this message', function() {
-      var sm = StealthMessage().set({
-        messagebuf: messagebuf,
-        toStealthAddress: sa,
-        fromKeypair: fromKeypair
-      });
-      sm.encrypt().encbuf.length.should.equal(113);
-    });
-
-  });
-
-  describe('#decrypt', function() {
-    
-    it('should decrypt that which was encrypted', function() {
-      var sm = StealthMessage().set({
-        messagebuf: messagebuf,
-        toStealthAddress: sa
-      }).encrypt();
-      var messagebuf2 = StealthMessage().set({
-        encbuf: sm.encbuf,
-        fromKeypair: sm.fromKeypair,
-        toStealthkey: sk
-      }).decrypt().messagebuf;
-      messagebuf2.toString('hex').should.equal(messagebuf.toString('hex'));
-    });
-
-  });
-
-  describe('#isForMe', function() {
-    
-    it('should know that this message is for me', function() {
-      StealthMessage().set({
-        encbuf: encbuf,
-        toStealthkey: sk,
-        fromKeypair: fromKeypair,
-        receiveAddress: Address().set({hashbuf: encbuf.slice(0, 20)})
-      }).isForMe().should.equal(true);
-    });
-
-    it('should know that this message is not for me', function() {
-      StealthMessage().set({
-        encbuf: encbuf,
-        toStealthkey: sk,
-        fromKeypair: fromKeypair,
-        receiveAddress: Address().set({hashbuf: encbuf.slice(0, 20)})
-      }).isForMe().should.equal(true);
-    });
-
-  });
-
-});
diff --git a/test/stealthtx.js b/test/stealthtx.js
deleted file mode 100644
index f00d73e..0000000
--- a/test/stealthtx.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var should = require('chai').should();
-var Txout = require('../lib/txout');
-var Stealthkey = require('../lib/expmt/stealthkey');
-var StealthTx = require('../lib/expmt/stealthtx');
-var Transaction = require('../lib/transaction');
-var Varint = require('../lib/varint');
-
-describe('StealthTx', function() {
-  
-  var txhex = '0100000001c828ccce36eca04f96321ad488528af86c7598e67157c4f8e2f462a9e0e3af5f010000006a47304402204525eef6a56cc57fb184e53efdfdc1086d5265da21480d55c2184536440a64f70220349cdc6c66a8507dde0d172fe64aeb57ae56e014b50315f615086a6b85c5424e012102c0633ddb6bf2a8686e2ba4ce8026c94e1e27ef12e73f8fed6d6d2b97199f9b74ffffffff020000000000000000286a2606deadbeef0365b5a5b0ba059666e907b0b5e07b37fdb162d1399ed829315491fe1f30c87b3f905f0100000000001976a9142042d5e7ef9e82346419fbfe7df5ae52fe4bea3c88ac00000000';
-  var txbuf = new Buffer(txhex, 'hex');
-  var txidhex = '66da969fff214c329e27062beaf3baf20ed035801559b31f3e868c2de4cdfc5b';
-  var tx = Transaction(txbuf);
-
-  it('should make a new StealthTx', function() {
-    var stx = new StealthTx();
-    should.exist(stx);
-    stx = StealthTx();
-    should.exist(stx);
-  });
-
-  describe('#isForMe', function() {
-    
-    it('should return false for this known tx and random stealthkey', function() {
-      var sk = Stealthkey().fromRandom();
-      var stx = StealthTx().set({sk: sk, tx: tx});
-      stx.isForMe().should.equal(false);
-    });
-
-  });
-
-  describe('#notMine', function() {
-    
-    it('should return true for this known tx and random stealthkey', function() {
-      var sk = Stealthkey().fromRandom();
-      var stx = StealthTx().set({sk: sk, tx: tx});
-      stx.notMine().should.equal("StealthTx not mine");
-    });
-
-  });
-
-  describe('#notStealth', function() {
-
-    it('should know this is a stealth tx', function() {
-      var stx = StealthTx().set({tx: tx});
-      stx.notStealth().should.equal(false);
-    });
-
-    it('should know this is not a stealth tx', function() {
-      var tx2 = Transaction(tx);
-      tx2.txouts.pop();
-      tx2.txoutsvi = Varint(1);
-      var stx = StealthTx().set({tx: tx2});
-      stx.notStealth().should.equal("Not enough txouts");
-    });
-
-  });
-
-  describe('@parseOpReturnData', function() {
-    var txout = tx.txouts[0];
-    var buf = txout.script.chunks[1].buf;
-    var parsed = StealthTx.parseOpReturnData(buf);
-    (typeof parsed.version).should.equal('number');
-    parsed.noncebuf.length.should.be.above(0);
-    parsed.pubkey.toBuffer().length.should.equal(33);
-  });
-
-});