New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

blockcast

Package Overview
Dependencies
Maintainers
1
Versions
44
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

blockcast - npm Package Compare versions

Comparing version 1.2.1 to 2.0.0

6

package.json
{
"name": "blockcast",
"version": "1.2.1",
"version": "2.0.0",
"description": "A multi-transaction protocol for storing data in the Bitcoin blockchain.",

@@ -30,4 +30,2 @@ "main": "./src/index.js",

"devDependencies": {
"async": "^1.4.2",
"bitcoin-tx-hex-to-json": "0.0.3",
"blockcypher-unofficial": "^1.5.0",

@@ -40,4 +38,6 @@ "jasmine-node": "^1.14.5",

"dependencies": {
"async": "^1.4.2",
"bitcoin-tx-hex-to-json": "0.0.3",
"bitcoinjs-lib": "^1.5.8"
}
}
var assert = require("assert");
var async = require('async');
var bitcoin = require("bitcoinjs-lib");
var txHexToJSON = require('bitcoin-tx-hex-to-json');
var dataPayload = require("./data-payload");
var txHexToJSON = require('bitcoin-tx-hex-to-json');
var OP_RETURN_BUFFER = new Buffer(1);
OP_RETURN_BUFFER.writeUInt8(bitcoin.opcodes.OP_RETURN, 0);

@@ -38,60 +40,74 @@ var loadAndSignTransaction = function(options, callback) {

var createTransactionWithPayload = function(payload, primaryTxHex) {
var primaryTx = primaryTxHex ? bitcoin.TransactionBuilder.fromTransaction(bitcoin.Transaction.fromHex(primaryTxHex)) : false;
var payloadScript = bitcoin.Script.fromChunks([bitcoin.opcodes.OP_RETURN, payload]);
var tx = primaryTx || new bitcoin.TransactionBuilder();
tx.addOutput(payloadScript, 0);
return tx;
};
var getPayloadsFromTransactions = function(transactions) {
var payloads = [];
var getPrimaryTransactions = function(transactions) {
var primaryTransactions = [];
for (var i = 0; i < transactions.length; i++) {
var transaction = transactions[i];
var transactionHex = transactions[i];
var transaction = txHexToJSON(transactionHex);
//console.log(transaction);
var vout = transaction.vout;
var address = transaction.vin[0] ? transaction.vin[0].addresses[0] : null;
//console.log("address", address);
for (var j = vout.length - 1; j >= 0; j--) {
var output = vout[j];
var scriptPubKey = output.scriptPubKey.hex;
//console.log("scriptPubKey", scriptPubKey);
var scriptPubKeyBuffer = new Buffer(scriptPubKey, 'hex');
if (scriptPubKeyBuffer[0] == 106 && scriptPubKeyBuffer[2] == 31) {
var payload = scriptPubKeyBuffer.slice(2, scriptPubKeyBuffer.length);
//console.log("payload", payload);
var info = dataPayload.getInfo(payload);
var data = payload;
payloads.push({
data: payload,
id: info.id,
index: info.index,
length: info.length,
address: address
});
//console.log(scriptPubKeyBuffer);
if (scriptPubKeyBuffer[0] == 106) {
var data = scriptPubKeyBuffer.slice(2,scriptPubKeyBuffer.length);
var length = dataPayload.parse(data);
if (length) {
primaryTransactions.push({tx: transaction, length: length, dataOutput: j, data: data});
}
}
}
};
return payloads;
return primaryTransactions;
};
var findByIdAndAddress = function(payloads, options) {
var matchingPayloads = [];
payloads.forEach(function(payload) {
if (payload.id == options.id && payload.address == options.address) {
matchingPayloads.push(payload.data);
}
});
return matchingPayloads;
}
var createTransactionWithPayload = function(payload, primaryTxHex) {
var primaryTx = primaryTxHex ? bitcoin.TransactionBuilder.fromTransaction(bitcoin.Transaction.fromHex(primaryTxHex)) : false;
var lengthBuffer = new Buffer(1);
lengthBuffer.writeUInt8(payload.length, 0);
var payloadScript = bitcoin.Script.fromBuffer(Buffer.concat([OP_RETURN_BUFFER, lengthBuffer, payload]));
var tx = primaryTx || new bitcoin.TransactionBuilder();
tx.addOutput(payloadScript, 0);
return tx;
};
var getData = function(options, callback) {
var transactions = options.transactions;
var commonWallet = options.commonWallet;
var address = commonWallet.address;
var id = options.id;
var unsortedPayloads = findByIdAndAddress(getPayloadsFromTransactions(transactions), {address: address, id: id});
var payloads = dataPayload.sort(unsortedPayloads);
dataPayload.decode(payloads, function(error, decodedData) {
callback(error, decodedData)
var primaryTransactions = getPrimaryTransactions(transactions);
var decodedTransactions = [];
async.each(primaryTransactions, function(primaryTx, cb) {
var tx = primaryTx.tx;
var data = primaryTx.data;
var length = primaryTx.length;
var dataOutput = primaryTx.dataOutput;
var payloads = [];
for (var i = 0; i < length; i++) {
if (i === 0) {
payloads.push(data);
}
else {
var prevTxid = tx.vin[dataOutput].txid;
var prevTx;
transactions.forEach(function(txHex) {
_tx = txHexToJSON(txHex);
if (prevTxid === _tx.txid) {
tx = _tx;
prevTx = tx;
var hexData = tx.vout[dataOutput].scriptPubKey.hex;
var data = new Buffer(hexData, 'hex');
payloads.push(data.slice(2, data.length));
}
});
}
};
dataPayload.decode(payloads, function(err, decodedData) {
var decodedTransaction = {
data: decodedData
}
decodedTransactions.push(decodedTransaction);
cb()
})
}, function(err) {
callback(false, decodedTransactions);
});

@@ -118,2 +134,3 @@ };

var address = commonWallet.address;
var fee = options.fee || 1000;
var commonBlockchain = options.commonBlockchain;

@@ -126,10 +143,6 @@ var buildStatus = options.buildStatus || function() {};

var unspentOutputs = addresses_unspents[0];
var id = options.id;
var fee = options.fee || 1000;
var address = commonWallet.address;
dataPayload.create({data: data}, function(err, payloads) {
dataPayload.create({data: data, id: id}, function(err, payloads) {
var signedTransactions = [];
var signedTransactionsCounter = 0;
var signedTransactionsCounter = payloads.length-1;
var payloadsLength = payloads.length;

@@ -165,2 +178,3 @@ var txid;

var signedTransactionResponse = function(err, signedTx) {
var signedTxBuilt = signedTx.buildIncomplete();

@@ -177,10 +191,6 @@ var signedTxHex = signedTxBuilt.toHex();

});
if (signedTransactionsCounter == 0) {
txid = signedTxid;
}
signedTransactions[signedTransactionsCounter] = signedTxHex;
signedTransactionsCounter++;
if (signedTransactionsCounter == payloadsLength) {
callback(false, signedTransactions, txid);
signedTransactionsCounter--;
if (signedTransactionsCounter < 0) {
callback(false, signedTransactions, signedTxid);
}

@@ -190,5 +200,12 @@ else {

var vout = signedTx.tx.outs.length - 1;
var payload = payloads[signedTransactionsCounter];
var tx;
if (signedTransactionsCounter === 0) {
tx = createTransactionWithPayload(payload, primaryTxHex);
}
else {
tx = createTransactionWithPayload(payload);
}
var payload = payloads[signedTransactionsCounter];
var tx = createTransactionWithPayload(payload);
var value = signedTx.tx.outs[vout].value;

@@ -225,3 +242,9 @@

var tx = createTransactionWithPayload(payloads[0], primaryTxHex);
var tx;
if (signedTransactionsCounter === 0) {
tx = createTransactionWithPayload(payloads[signedTransactionsCounter], primaryTxHex);
}
else {
tx = createTransactionWithPayload(payloads[signedTransactionsCounter]);
}

@@ -244,5 +267,3 @@ var signOptions = {

createSignedTransactionsWithData: createSignedTransactionsWithData,
getPayloadsFromTransactions: getPayloadsFromTransactions,
dataPayload: dataPayload,
getData: getData
};

@@ -5,4 +5,16 @@ var assert = require("assert");

var zlib = require("zlib");
var header = require("./header");
var OP_RETURN_SIZE = 80;
var MAGIC_NUMBER = new Buffer("1f", "hex");
var VERSION = new Buffer("00", "hex");
var dth = function(d) {
var h = Number(d).toString(16);
while (h.length < 2) {
h = "0" + h;
}
return h;
}
var compress = function(decompressedBuffer, callback) {

@@ -20,21 +32,6 @@ zlib.deflateRaw(decompressedBuffer, function(err, compressedBuffer) {

var sort = function(unsortedPayloads) {
var firstPayload;
var theRest = [];
for (var i = 0; i < unsortedPayloads.length; i++) {
var pl = unsortedPayloads[i];
var startHeader = pl.slice(0,3);
try {
var info = header.decodeStart(startHeader);
if (info) {
firstPayload = pl;
}
}
catch (e) {
var midHeader = pl.slice(0,2);
var info = header.decodeMid(midHeader);
theRest[info.index-1] = pl;
}
};
return [firstPayload].concat(theRest);
var parse = function(payload) {
var length = payload.slice(2,3).readUIntLE(0, 1);
var valid = payload.slice(0,1).equals(MAGIC_NUMBER) && payload.slice(1,2).equals(VERSION) && length;
return valid ? length : false;
};

@@ -44,3 +41,2 @@

var data = options.data;
var id = options.id;
var payloads = [];

@@ -51,30 +47,15 @@ var buffer = new Buffer(data);

var dataPayloads = [];
if (dataLength > 607) {
callback("data payload > 607", false);
if (dataLength > 1277) {
callback("data payload > 1277", false);
return;
}
var count = 0;
var index = 0;
var length = parseInt(((dataLength - 38) / 38) + 2);
var length = parseInt(((dataLength - OP_RETURN_SIZE) / OP_RETURN_SIZE) + 2);
var lengthByte = new Buffer(dth(length), "hex");
var count = OP_RETURN_SIZE - 3;
var dataPayload = compressedBuffer.slice(0, count);
payloads.push(Buffer.concat([MAGIC_NUMBER, VERSION, lengthByte, dataPayload]));
while(count < dataLength) {
var dataPayload, head;
if (count == 0) {
head = header.encodeStart({
id: id,
length: length
});
dataPayload = compressedBuffer.slice(0, 37);
count += 37;
}
else {
head = header.encodeMid({
id: id,
index: index
});
dataPayload = compressedBuffer.slice(count, count+38);
count += 38;
}
index++;
var payload = Buffer.concat([head, dataPayload]);
payloads.push(payload);
dataPayload = compressedBuffer.slice(count, count+OP_RETURN_SIZE);
count += OP_RETURN_SIZE;
payloads.push(dataPayload);
}

@@ -85,15 +66,2 @@ callback(false, payloads);

var getInfo = function(payload) {
var info;
try {
var startHeader = payload.slice(0,3);
info = header.decodeStart(startHeader);
}
catch (e) {
var midHeader = payload.slice(0,2);
info = header.decodeMid(midHeader);
}
return info;
};
var decode = function(payloads, callback) {

@@ -103,12 +71,6 @@ var firstPayload = payloads[0];

var compressedBuffer;
var info;
try {
info = header.decodeStart(startHeader);
}
catch (e) {
var length = startHeader.slice(2,3).readUIntLE(0, 1);
if (!length) {
callback("no start header", false);
return;
}
var id = info.id;
var length = info.length;
assert.equal(payloads.length, length);

@@ -118,3 +80,3 @@ var compressedBuffer = new Buffer("");

var payload = payloads[i];
var dataPayload = i == 0 ? payload.slice(3, 40) : payload.slice(2, 40);
var dataPayload = i == 0 ? payload.slice(3, OP_RETURN_SIZE) : payload;
compressedBuffer = Buffer.concat([compressedBuffer, dataPayload]);

@@ -135,4 +97,3 @@ };

decode: decode,
getInfo: getInfo,
sort: sort
parse: parse
};

@@ -0,7 +1,7 @@

var txHexToJSON = require('bitcoin-tx-hex-to-json');
var async = require('async');
var bitcoinTransactionBuilder = require("./bitcoin-transaction-builder");
var dataPayload = require("./data-payload");
var openTip = require("./open-tip");
var txHexToJSON = require('bitcoin-tx-hex-to-json');
var post = function(options, callback) {

@@ -28,3 +28,4 @@ var commonWallet = options.commonWallet;

}, function(err, signedTransactions, txid) {
var transactionTotal = signedTransactions.length;
var reverseSignedTransactions = signedTransactions.reverse();
var transactionTotal = reverseSignedTransactions.length;
var propagateCounter = 0;

@@ -42,3 +43,3 @@ var retryCounter = [];

retryCounter[propagateCounter] = rc + 1;
commonBlockchain.Transactions.Propagate(signedTransactions[propagateCounter], propagateResponse);
commonBlockchain.Transactions.Propagate(reverseSignedTransactions[propagateCounter], propagateResponse);
}

@@ -51,3 +52,3 @@ else {

if (propagateCounter < transactionTotal) {
commonBlockchain.Transactions.Propagate(signedTransactions[propagateCounter], propagateResponse);
commonBlockchain.Transactions.Propagate(reverseSignedTransactions[propagateCounter], propagateResponse);
}

@@ -62,3 +63,3 @@ else {

}
commonBlockchain.Transactions.Propagate(signedTransactions[0], propagateResponse);
commonBlockchain.Transactions.Propagate(reverseSignedTransactions[0], propagateResponse);
});

@@ -68,3 +69,3 @@ };

var payloadsLength = function(options, callback) {
bitcoinTransactionBuilder.dataPayload.create({data: options.data, id: 0}, function(err, payloads) {
dataPayload.create({data: options.data, id: 0}, function(err, payloads) {
if (err) {

@@ -82,25 +83,33 @@ callback(err, payloads);

var allTransactions = [];
var payloadDatum = [];
var payloads = [];
var transactionTotal;
var length;
var onTransaction = function(err, transactions) {
var tx = transactions[0];
allTransactions.push(tx);
if (!tx) {
return callback(err, false);
}
allTransactions.push(tx);
var payload = bitcoinTransactionBuilder.getPayloadsFromTransactions([tx])[0];
if (!payload || !payload.data) {
return callback("no payload", false);
var vout = tx.vout;
var dataOutput;
for (var j = vout.length - 1; j >= 0; j--) {
var output = vout[j];
var scriptPubKey = output.scriptPubKey.hex;
var scriptPubKeyBuffer = new Buffer(scriptPubKey, 'hex');
if (scriptPubKeyBuffer[0] == 106) {
var data = scriptPubKeyBuffer.slice(2,scriptPubKeyBuffer.length);
var parsedLength = dataPayload.parse(data);
dataOutput = parsedLength ? j : 0;
transactionTotal = parsedLength ? parsedLength : transactionTotal;
payloads.push(data);
}
}
payloadDatum.push(payload.data);
var spentTxid = tx.vout[1].spentTxid;
if (payload.length) {
transactionTotal = payload.length;
}
if (allTransactions.length == transactionTotal) {
dataPayload.decode(payloadDatum, function(err, data) {
dataPayload.decode(payloads, function(err, data) {
callback(err, data);
});
return;
}
else if (!spentTxid) {
var prevTxid = tx.vin[dataOutput].txid;
if (!prevTxid) {
callback("missing: " + (allTransactions.length + 1), false);

@@ -110,105 +119,15 @@ return;

else {
commonBlockchain.Transactions.Get([spentTxid], onTransaction);
commonBlockchain.Transactions.Get([prevTxid], onTransaction);
}
};
commonBlockchain.Transactions.Get([txid], onTransaction)
};
var scan = function(options, callback) {
var messages = [];
var transactions = options.transactions;
var addressesWithPayloads = bitcoinTransactionBuilder.getPayloadsFromTransactions(transactions);
var addresses = {};
var messageCount = 0;
addressesWithPayloads.forEach(function(messageFragment) {
var address = messageFragment.address;
addresses[address] = addresses[address] ? addresses[address] : {};
var id = messageFragment.id;
if (!addresses[address][id]) {
addresses[address][id] = [];
messageCount++;
}
addresses[address][id].push(messageFragment.data);
});
var decodeCount = 0;
onDecode = function(error, decodedData) {
if (error) {
decodeCount++;
return;
}
var message = {
address: address,
message: decodedData
}
messages.push(message);
decodeCount++;
if (decodeCount == messageCount) {
callback(false, messages);
}
}
for (var address in addresses) {
var addressMessages = addresses[address];
for (var id in addressMessages) {
var data = addressMessages[id];
dataPayload.decode(data, onDecode);
}
}
}
var tip = function(options, callback) {
var tipTransactionHash = options.tipTransactionHash;
var tipDestinationAddress = options.tipDestinationAddress;
var tipAmount = options.tipAmount || 10000;
var tipDestinationAddress = options.tipDestinationAddress;
var commonBlockchain = options.commonBlockchain;
var commonWallet = options.commonWallet;
var fee = options.fee;
openTip.createSignedTransaction({
tipTransactionHash: tipTransactionHash,
tipDestinationAddress: tipDestinationAddress,
tipAmount: tipAmount,
commonBlockchain: commonBlockchain,
commonWallet: commonWallet,
fee: fee,
}, function(err, signedTxHex, txid) {
var propagateResponse = function(err, res) {
var tipTx = {
tipTransactionHash: tipTransactionHash,
tipDestinationAddress: tipDestinationAddress,
tipAmount: tipAmount,
txid: txid
}
if (err) {
tipTx.propagateResponse = "failure";
}
else {
tipTx.propagateResponse = "success";
}
callback(err, tipTx);
}
commonBlockchain.Transactions.Propagate(signedTxHex, propagateResponse);
});
};
var parseTip = function(tx, callback) {
openTip.getTips({transactions: [tx]}, function(err, tips) {
var tip = tips[0];
callback(err, tip);
});
};
module.exports = {
post: post,
scan: scan,
scanSingle: scanSingle,
parse: dataPayload.getInfo,
tip: tip,
payloadsLength: payloadsLength,
parseTip: parseTip,
bitcoinTransactionBuilder: bitcoinTransactionBuilder
};
jasmine.getEnv().defaultTimeoutInterval = 50000;
var bitcoinTransactionBuilder = require("../src/bitcoin-transaction-builder");
var dataPayload = require("../src/data-payload");
var txHexToJSON = require('bitcoin-tx-hex-to-json');
var bitcoin = require("bitcoinjs-lib");
var async = require("async");
var commonBlockchain = require("mem-common-blockchain")();

@@ -86,3 +84,2 @@

data: test0.data,
id: 0,
commonWallet: test0Wallet,

@@ -131,7 +128,6 @@ commonBlockchain: test0Blockchain

data: test1.data,
id: 0,
commonWallet: test1Wallet,
commonBlockchain: test1Blockchain
}, function(err, signedTransactions) {
expect(signedTransactions.length).toBe(8);
expect(signedTransactions.length).toBe(4);
expect(signedTransactions).toEqual(test1.txHexes);

@@ -145,24 +141,18 @@ done();

var data = randomString(30);
var id = parseInt(Math.random()*16);
bitcoinTransactionBuilder.createSignedTransactionsWithData({
data: data,
id: id,
commonWallet: commonWallet,
commonBlockchain: commonBlockchain
}, function(err, signedTransactions) {
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(1);
var txHex = signedTransactions[0];
commonBlockchain.Transactions.Propagate(txHex, function(err, res) {
console.log(res.status, "1/1");
if (err) {
return done(err);
}
var txids = [res.txid];
commonBlockchain.Transactions.Get(txids, function(err, transactions) {
//console.log(transactions);
bitcoinTransactionBuilder.getData({commonWallet: commonWallet, transactions:transactions, id:id}, function(error, decodedData) {
expect(data).toBe(decodedData);
done();
});
});
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.txid).toBe(txid);
var primaryData = new Buffer(primaryTx.vout[0].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
expect(length).toBe(1);
bitcoinTransactionBuilder.getData({transactions:signedTransactions}, function(error, decodedTransactions) {
var decodedData = decodedTransactions[0].data;
expect(data).toBe(decodedData);
done();
});

@@ -172,110 +162,102 @@ });

it("should create the transaction for a random string of 70 bytes", function(done) {
var data = randomString(70);
var id = parseInt(Math.random()*16);
it("should create the transaction for a random string of 170 bytes", function(done) {
var data = randomString(170);
bitcoinTransactionBuilder.createSignedTransactionsWithData({
data: data,
id: id,
commonWallet: commonWallet,
commonBlockchain: commonBlockchain
}, function(err, signedTransactions) {
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(2);
var propagateCounter = 0;
var txids = [];
var propagateResponse = function(err, res) {
//console.log(err, res);
console.log(propagateCounter + 1 + "/" + signedTransactions.length);
if (err) {
return done(err);
}
txids.push(res.txid);
propagateCounter++;
if (propagateCounter == signedTransactions.length) {
commonBlockchain.Transactions.Get(txids, function(err, transactions) {
bitcoinTransactionBuilder.getData({commonWallet: commonWallet, transactions:transactions, id:id}, function(error, decodedData) {
expect(data).toBe(decodedData);
done();
});
});
}
}
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.txid).toBe(txid);
var primaryData = new Buffer(primaryTx.vout[0].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
var txHex1 = signedTransactions[1];
var tx1 = txHexToJSON(txHex1);
expect(primaryTx.vin[0].txid).toBe(tx1.txid);
expect(length).toBe(2);
bitcoinTransactionBuilder.getData({transactions:signedTransactions}, function(error, decodedTransactions) {
var decodedData = decodedTransactions[0].data;
expect(data).toBe(decodedData);
done();
});
});
});
commonBlockchain.Transactions.Propagate(signedTransactions[0], propagateResponse);
commonBlockchain.Transactions.Propagate(signedTransactions[1], propagateResponse);
it("should create the transaction for a random string of 320 bytes", function(done) {
var data = randomString(320);
bitcoinTransactionBuilder.createSignedTransactionsWithData({
data: data,
commonWallet: commonWallet,
commonBlockchain: commonBlockchain
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(4);
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.txid).toBe(txid);
var primaryData = new Buffer(primaryTx.vout[0].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
expect(length).toBe(4);
var tx1 = txHexToJSON(signedTransactions[1]);
expect(primaryTx.vin[0].txid).toBe(tx1.txid);
var tx2 = txHexToJSON(signedTransactions[2]);
expect(tx1.vin[0].txid).toBe(tx2.txid);
var tx3 = txHexToJSON(signedTransactions[3]);
expect(tx2.vin[0].txid).toBe(tx3.txid);
bitcoinTransactionBuilder.getData({transactions:signedTransactions}, function(error, decodedTransactions) {
var decodedData = decodedTransactions[0].data;
expect(data).toBe(decodedData);
done();
});
});
});
it("should create the transaction for a random string of 175 bytes", function(done) {
var data = randomString(175);
var id = parseInt(Math.random()*16);
it("should create the transaction for a random string of 675 bytes", function(done) {
var data = randomString(675);
bitcoinTransactionBuilder.createSignedTransactionsWithData({
data: data,
id: id,
commonWallet: commonWallet,
commonBlockchain: commonBlockchain
}, function(err, signedTransactions) {
expect(signedTransactions.length).toBe(5);
var propagateCounter = 0;
var txids = [];
var propagateResponse = function(err, res, body) {
//console.log(err, res);
console.log(propagateCounter + 1 + "/" + signedTransactions.length);
if (err) {
return done(err);
}
txids.push(res.txid);
propagateCounter++;
if (propagateCounter == signedTransactions.length) {
//console.log(txids);
commonBlockchain.Transactions.Get(txids, function(err, transactions) {
//console.log("ttt", transactions);
bitcoinTransactionBuilder.getData({commonWallet: commonWallet, transactions:transactions, id:id}, function(error, decodedData) {
expect(data).toBe(decodedData);
done();
});
});
}
else {
commonBlockchain.Transactions.Propagate(signedTransactions[propagateCounter], propagateResponse);
}
}
commonBlockchain.Transactions.Propagate(signedTransactions[0], propagateResponse);
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(7);
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.txid).toBe(txid);
var primaryData = new Buffer(primaryTx.vout[0].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
expect(length).toBe(7);
signedTransactions.forEach(function(signedTxHex) {
var signedTx = txHexToJSON(signedTxHex);
signedTx.vin.forEach(function(vin) {
expect(vin.scriptSig.hex).not.toBe('');
});
});
bitcoinTransactionBuilder.getData({transactions:signedTransactions}, function(error, decodedTransactions) {
var decodedData = decodedTransactions[0].data;
expect(data).toBe(decodedData);
done();
});
});
});
it("should create the transaction for full latin paragraph of 865 bytes", function(done) {
var data = loremIpsum.slice(0, 865);
var id = parseInt(Math.random()*16);
it("should create the transaction for full latin paragraph of 1265 bytes", function(done) {
var data = loremIpsum.slice(0, 1265);
bitcoinTransactionBuilder.createSignedTransactionsWithData({
data: data,
id: id,
commonWallet: commonWallet,
commonBlockchain: commonBlockchain
}, function(err, signedTransactions) {
expect(signedTransactions.length).toBe(12);
var propagateCounter = 0;
var txids = [];
var propagateResponse = function(err, res) {
//console.log(err, res);
console.log(propagateCounter + 1 + "/" + signedTransactions.length);
if (err) {
return done(err);
}
txids.push(res.txid);
propagateCounter++;
if (propagateCounter == signedTransactions.length) {
commonBlockchain.Transactions.Get(txids, function(err, transactions) {
//console.log("ttt", transactions);
bitcoinTransactionBuilder.getData({commonWallet: commonWallet, transactions:transactions, id:id}, function(error, decodedData) {
expect(data).toBe(decodedData);
done();
});
});
}
else {
commonBlockchain.Transactions.Propagate(signedTransactions[propagateCounter], propagateResponse);
}
}
commonBlockchain.Transactions.Propagate(signedTransactions[0], propagateResponse);
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(6);
signedTransactions.forEach(function(signedTxHex) {
var signedTx = txHexToJSON(signedTxHex);
signedTx.vin.forEach(function(vin) {
expect(vin.scriptSig.hex).not.toBe('');
});
});
bitcoinTransactionBuilder.getData({transactions:signedTransactions}, function(error, decodedTransactions) {
var decodedData = decodedTransactions[0].data;
expect(data).toBe(decodedData);
done();
});
});

@@ -286,3 +268,2 @@ });

var data = randomString(30);
var id = parseInt(Math.random()*16);
var value = 12345;

@@ -294,12 +275,26 @@ anotherCommonWallet.createTransaction({

}, function(err, primaryTxHex) {
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.vout[0].value).toBe(value);
expect(primaryTx.vin[0].scriptSig.hex).toBe('');
bitcoinTransactionBuilder.createSignedTransactionsWithData({
primaryTxHex: primaryTxHex,
data: data,
id: id,
commonWallet: commonWallet,
commonBlockchain: testnetCommonBlockchain
}, function(err, signedTransactions) {
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(1);
var txHex = signedTransactions[0];
anotherCommonWallet.signRawTransaction({txHex: txHex, input: 0}, function(err, signedTxHex) {
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.txid).toBe(txid);
expect(primaryTx.vin[0].scriptSig.hex).toBe('');
expect(primaryTx.vout[0].value).toBe(value);
expect(primaryTx.vout[2].value).toBe(0);
var primaryData = new Buffer(primaryTx.vout[2].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
expect(length).toBe(1);
anotherCommonWallet.signRawTransaction({txHex: primaryTxHex, input: 0}, function(err, signedTxHex) {
var signedTx = txHexToJSON(signedTxHex);
signedTx.vin.forEach(function(vin) {
expect(vin.scriptSig.hex).not.toBe('');
});
testnetCommonBlockchain.Transactions.Propagate(signedTxHex, function(err, res) {

@@ -327,3 +322,2 @@ console.log(res.status, "1/1");

var data = randomString(120);
var id = parseInt(Math.random()*16);
var value = 12345;

@@ -342,15 +336,23 @@ var signPrimaryTxHex = function(txHex, callback) {

data: data,
id: id,
commonWallet: commonWallet,
commonBlockchain: testnetCommonBlockchain
}, function(err, signedTransactions) {
expect(signedTransactions.length).toBe(4);
var txHex = signedTransactions[0];
var tx = txHexToJSON(txHex);
expect(tx.vout[0].value).toBe(12345);
expect(tx.vout[2].value).toBe(0);
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(2);
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
expect(primaryTx.txid).toBe(txid);
expect(primaryTx.vout[0].value).toBe(value);
expect(primaryTx.vout[2].value).toBe(0);
signedTransactions.forEach(function(signedTxHex) {
var signedTx = txHexToJSON(signedTxHex);
signedTx.vin.forEach(function(vin) {
expect(vin.scriptSig.hex).not.toBe('');
});
});
var primaryData = new Buffer(primaryTx.vout[2].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
expect(length).toBe(2);
var txHex1 = signedTransactions[1];
var tx1 = txHexToJSON(txHex1);
expect(tx1.vin[0].txid).toBe(tx.txid);
expect(tx1.vin[0].vout).toBe(3);
expect(primaryTx.vin[1].txid).toBe(tx1.txid);
done();

@@ -361,2 +363,38 @@ });

it("should create the transaction with a custom primaryTxHex with 320 bytes", function(done) {
var data = randomString(320);
var value = 12345;
var signPrimaryTxHex = function(txHex, callback) {
anotherCommonWallet.signRawTransaction({txHex: txHex, input: 0}, callback);
}
anotherCommonWallet.createTransaction({
destinationAddress: commonWallet.address,
value: value,
skipSign: true
}, function(err, primaryTxHex) {
bitcoinTransactionBuilder.createSignedTransactionsWithData({
primaryTxHex: primaryTxHex,
signPrimaryTxHex: signPrimaryTxHex,
data: data,
commonWallet: commonWallet,
commonBlockchain: testnetCommonBlockchain
}, function(err, signedTransactions, txid) {
expect(signedTransactions.length).toBe(4);
var primaryTxHex = signedTransactions[0];
var primaryTx = txHexToJSON(primaryTxHex);
var primaryData = new Buffer(primaryTx.vout[2].scriptPubKey.hex, 'hex');
var length = dataPayload.parse(primaryData.slice(2, primaryData.length));
expect(length).toBe(4);
signedTransactions.forEach(function(signedTxHex) {
var signedTx = txHexToJSON(signedTxHex);
signedTx.vin.forEach(function(vin) {
expect(vin.scriptSig.hex).not.toBe('');
});
});
expect(primaryTx.txid).toBe(txid);
done();
});
});
});
});
var dataPayload = require("../src/data-payload");
var nibble = require("../src/nibble");

@@ -14,2 +13,4 @@ var randomString = function(length) {

var OP_RETURN_SIZE = 80;
var loremIpsum = "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"

@@ -36,6 +37,5 @@

var data = randomString(30);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(1);
expect(payloads[0].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
expect(payloads[0].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -47,6 +47,5 @@ });

var data = loremIpsum.slice(0,30);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(1);
expect(payloads[0].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
expect(payloads[0].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -56,9 +55,8 @@ });

it("should create a data payload for some random data of 70 bytes", function(done) {
var data = randomString(70);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(2);
expect(payloads[0].length).toBe(40);
expect(payloads[1].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
it("should create a data payload for some random data of 270 bytes", function(done) {
var data = randomString(270);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(3);
expect(payloads[0].length).toBe(OP_RETURN_SIZE);
expect(payloads[2].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -69,8 +67,7 @@ });

it("should create a data payload for a latin sentence sentence of 70 bytes", function(done) {
var data = loremIpsum.slice(0,70);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(2);
expect(payloads[0].length).toBe(40);
expect(payloads[1].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
var data = loremIpsum.slice(0,270);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(3);
expect(payloads[0].length).toBe(OP_RETURN_SIZE);
expect(payloads[2].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -82,8 +79,6 @@ });

var data = randomString(110);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(3);
expect(payloads[0].length).toBe(40);
expect(payloads[1].length).toBe(40);
expect(payloads[2].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(2);
expect(payloads[0].length).toBe(OP_RETURN_SIZE);
expect(payloads[1].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -95,8 +90,6 @@ });

var data = loremIpsum.slice(0,110);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(3);
expect(payloads[0].length).toBe(40);
expect(payloads[1].length).toBe(40);
expect(payloads[2].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(2);
expect(payloads[0].length).toBe(OP_RETURN_SIZE);
expect(payloads[1].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -107,11 +100,10 @@ });

it("should create a data payload for some random data of 700 bytes", function(done) {
var data = randomString(700);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(15);
var data = randomString(1600);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(16);
for (var i = 0; i < payloads.length - 1; i++) {
var payload = payloads[i];
expect(payload.length).toBe(40);
expect(payload.length).toBe(OP_RETURN_SIZE);
};
expect(payloads[14].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
expect(payloads[15].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -121,13 +113,11 @@ });

it("should create a data payload for some random data of 800 bytes", function(done) {
it("should create a data payload for some random data of OP_RETURN_SIZE0 bytes", function(done) {
var data = randomString(750);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
console.log(payloads.length);
expect(payloads.length).toBe(16);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(8);
for (var i = 0; i < payloads.length - 1; i++) {
var payload = payloads[i];
expect(payload.length).toBe(40);
expect(payload.length).toBe(OP_RETURN_SIZE);
};
expect(payloads[15].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
expect(payloads[7].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -138,11 +128,10 @@ });

it("should create a data payload for the full latin paragraph of 865 bytes", function(done) {
var data = loremIpsum.slice(0,865);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(12);
var data = loremIpsum.slice(0,965);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(6);
for (var i = 0; i < payloads.length - 1; i++) {
var payload = payloads[i];
expect(payload.length).toBe(40);
expect(payload.length).toBe(OP_RETURN_SIZE);
};
expect(payloads[11].length).toBeLessThan(41);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
expect(payloads[5].length).toBeLessThan(OP_RETURN_SIZE+1);
done();

@@ -154,5 +143,4 @@ });

var data = randomJsonObject(865);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(payloads.length).toBe(14);
expect(nibble.fromByte(payloads[0].slice(2,3))[1]).toBe(payloads.length-1);
dataPayload.create({data: data}, function(err, payloads) {
expect(payloads.length).toBe(7);
done();

@@ -164,3 +152,3 @@ });

var data = loremIpsum.slice(0,30);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
dataPayload.create({data: data}, function(err, payloads) {
dataPayload.decode(payloads, function(error, decodedData) {

@@ -173,5 +161,15 @@ expect(data).toBe(decodedData);

it("should create a data payload for some 30 byte data and then decode it", function(done) {
var data = loremIpsum.slice(0,78);
dataPayload.create({data: data}, function(err, payloads) {
dataPayload.decode(payloads, function(error, decodedData) {
expect(data).toBe(decodedData);
done();
});
});
});
it("should create a data payload for some JSON data and then decode it", function(done) {
var data = randomJsonObject(865);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
dataPayload.create({data: data}, function(err, payloads) {
dataPayload.decode(payloads, function(erro, decodedData) {

@@ -184,23 +182,11 @@ expect(data).toBe(decodedData);

it("should not create a data payload for a larger amount of data", function(done) {
var data = randomString(1200);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
expect(err).toBeDefined();
expect(payloads).toBe(false);
done();
});
});
// it("should not create a data payload for a larger amount of data", function(done) {
// var data = randomString(1200);
// dataPayload.create({data: data}, function(err, payloads) {
// expect(err).toBeDefined();
// expect(payloads).toBe(false);
// done();
// });
// });
it("should sort a data payload", function(done) {
var data = randomString(700);
dataPayload.create({data: data, id: 3}, function(err, payloads) {
var shuffledPayloads = shuffle(payloads.slice(0));
var sortedPayloads = dataPayload.sort(shuffledPayloads);
for (var i = 0; i < payloads.length; i++) {
expect(payloads[i]).toBe(sortedPayloads[i]);
};
done();
});
});
});

@@ -19,2 +19,3 @@ jasmine.getEnv().defaultTimeoutInterval = 50000;

var memCommonBlockchain = require('mem-common-blockchain')();

@@ -54,7 +55,19 @@ var randomJsonObject = function(messageLength) {

var JSONdata = JSON.stringify({
op: 'r',
btih: '335400c43179bb1ad0085289e4e60c0574e6252e',
sha1: 'dc724af18fbdd4e59189f5fe768a5f8311527050',
ipfs: 'QmcJf1w9bVpquGdzCp86pX4K21Zcn7bJBUtrBP1cr2NFuR',
name: 'test.txt',
size: 7,
type: 'text/plain',
title: 'A text file for testing',
keywords: 'test, text, txt'
});
describe("blockcast", function() {
it("should post a message of a random string of 70 bytes", function(done) {
it("should post a message of a random string of 170 bytes", function(done) {
var data = randomString(70);
var data = randomString(170);

@@ -74,2 +87,17 @@ blockcast.post({

it("should post a message of a random string of 276 bytes", function(done) {
blockcast.post({
data: JSONdata,
commonWallet: commonWallet,
commonBlockchain: commonBlockchain
}, function(error, blockcastTx) {
expect(blockcastTx.data).toBe(JSONdata);
expect(blockcastTx.txid).toBeDefined();
expect(blockcastTx.transactionTotal).toBe(3);
done();
});
});
it("should post a message with a primaryTx", function(done) {

@@ -98,9 +126,7 @@

commonWallet: commonWallet,
commonBlockchain: commonBlockchain,
propagationStatus: console.log
commonBlockchain: commonBlockchain
}, function(error, blockcastTx) {
console.log(error, blockcastTx);
expect(blockcastTx.data).toBe(data);
expect(blockcastTx.txid).toBeDefined();
expect(blockcastTx.transactionTotal).toBe(2);
expect(blockcastTx.transactionTotal).toBe(1);
done();

@@ -113,27 +139,37 @@ });

it("should tip a post", function(done) {
it("should get the payloads length", function(done) {
var data = loremIpsum;
blockcast.payloadsLength({data: data}, function(err, payloadsLength) {
expect(payloadsLength).toBe(6);
done();
});
});
var tipDestinationAddress = "mr5qCMve7UVgJ8RCsqzsgQz9ry7sonEoKc";
var tipTransactionHash = "ec42f55249fb664609ef4329dcce3cab6d6ae14f6860a602747a72f966de3e13";
it("should warn when the payloads length is too big", function(done) {
var data = randomString(4200);
blockcast.payloadsLength({data: data}, function(err, payloadsLength) {
expect(err).toBe('data payload > 1277');
expect(payloadsLength).toBe(false);
done();
});
});
blockcast.tip({
tipDestinationAddress: tipDestinationAddress,
tipTransactionHash: tipTransactionHash,
commonWallet: commonWallet,
it("should scan single txid 884db69602bffa8be074068ac8ee44fa37e31817b56a9092c996587d40e01742", function(done) {
var txid = "884db69602bffa8be074068ac8ee44fa37e31817b56a9092c996587d40e01742";
blockcast.scanSingle({
txid: txid,
commonBlockchain: commonBlockchain
}, function(error, tipTx) {
expect(tipTx.tipDestinationAddress).toBe(tipDestinationAddress);
expect(tipTx.tipTransactionHash).toBe(tipTransactionHash);
expect(tipTx.tipAmount).toBe(10000);
expect(tipTx.txid).toBeDefined();
}, function(err, data) {
expect(data).toBe("ykt2AA31pAwBnB1IgNdoxsqcO41KxhsxVmqwhmWsRTTLQ9sp8QXNhWaZ58HhzMHB2O3p9CBkcvNtBngU1bgeMtsZywKHBCVRQgsVm6CtfFgrHNr8uaGX6kFLT8hvbMW6ID0XTUFFSTT83DIEeS4SifaFwTPex20B27QvwR0DDm");
done();
});
});
it("should get the payloads length", function(done) {
var data = loremIpsum;
blockcast.payloadsLength({data: data}, function(err, payloadsLength) {
expect(payloadsLength).toBe(12);
it("should scan single txid fe44cae45f69dd1d6115815356a73b9c5179feff1b276d99ac0e283156e1cd01", function(done) {
var txid = "fe44cae45f69dd1d6115815356a73b9c5179feff1b276d99ac0e283156e1cd01";
blockcast.scanSingle({
txid: txid,
commonBlockchain: commonBlockchain
}, function(err, data) {
expect(data).toBe(JSONdata);
done();

@@ -143,11 +179,23 @@ });

it("should warn when the payloads length is too big", function(done) {
var data = randomString(1200);
blockcast.payloadsLength({data: data}, function(err, payloadsLength) {
expect(err).toBe('data payload > 607');
expect(payloadsLength).toBe(false);
it("should post a message of a random string of 720 bytes and then scan (memCommonBlockchain) ", function(done) {
var randomStringData = randomString(720);
blockcast.post({
data: randomStringData,
commonWallet: commonWallet,
commonBlockchain: memCommonBlockchain
}, function(error, blockcastTx) {
expect(blockcastTx.txid).toBeDefined();
expect(blockcastTx.transactionTotal).toBe(8);
blockcast.scanSingle({
txid: blockcastTx.txid,
commonBlockchain: memCommonBlockchain
}, function(err, data) {
expect(data).toBe(randomStringData);
done();
});
done();
});
});
});

@@ -10,3 +10,3 @@ {

"data": "testData0",
"txHex": "0100000001c867596806afbe45852b602278e527d1cda8be41ab84b604db25feb3f05baf03000000006b483045022100f8b3bde24ae16edb8d0082148f7dabe6f72a30ff99520e20787e55de983e454502206776ad4d8fcb6764319b01d07822081002140ac131757a3429b3c24d9583e043012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000106a0e1f00002b492d2e71492c49340000583e0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000"
"txHex": "0100000001c867596806afbe45852b602278e527d1cda8be41ab84b604db25feb3f05baf03000000006b483045022100e4aa91932e04d68887c80fc4be5a6ff31c8c040938983e9b249e1f5885ab86590220627b547b2afaafe40b3e6e3f7aaae6e3d8fed185d2feefc70f7be314e0f24c84012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000106a0e1f00012b492d2e71492c49340000583e0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000"
}

@@ -10,3 +10,3 @@ {

"data": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.",
"txHexes": [ "0100000001c867596806afbe45852b602278e527d1cda8be41ab84b604db25feb3f05baf03000000006a47304402200ad01643d39e30476e0dbd08af9bb28adf237f7a30bda2297377adfa8281d47a02203c1477fc746593f47b991a9cdc7377e7d387e82739f5118f193bbd25c049cbae012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f000755915d6ec3300c83afc203143dca5e7602d5d63a01fe492c39d8f147271dd0bd048e40991f583e0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "01000000016470be116e1081ba1161264d414c2673933d7cd3cce8a1457ad719d0c3e478fb010000006b483045022100f3a6b8098d5113a241a99f590e003f480447e8ab4e0be92be8012d0c9d69bc6e02203c151b7e171e2bedb81f1e3e6df0673e949cbd02987b969af36b33d2f59a2441012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f01e94fcd98814d876f964cc21cb36545af8d47f3503489e9d031fa805be0e8656e21a11592d274703a0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "010000000116fc6fe2ee81b08b3f4a4e21d8297e03ff8bbf32013d9556d15f24f58bdc4ee2010000006a473044022034c14233cf74b34fd7b9de6c7c1176ea8e48f5532d5183e09e96e293d78d32de022071ead15e36ac86db1924cb9f85fe1aad0778b77bfc2d8dff5a150f9f6f0f7410012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f026961b322f7d287d67d2a8acc7c4d6f881e523196982e261ca92c916d2ed8a728e4012ba5c3da88360f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "010000000145cdac96f615608960df52a4519fbc4d631513c30694a06724cb4efdd9bad1b3010000006a473044022077e5d6cc984b709f34e2f4d8a7cf4cb07620ca2dd8cf8b4e4b8ae092bec8b58702205164b95989f4864b1c54ac4e0c579ae4c4e7d6b31a6efd716513bccb69b8aef1012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f03a12d78090e2ae384d1581a37c848df169aa2e3a1125c3b6c7db3a510f86c01fdd98a2579f43ba0320f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "010000000173909762e7c1cf8be5b8a574a397302a253ceb6e299c52e67ef00d3d3ae84b13010000006a47304402205827aa44f16531de21dd5e59f693617d8a113080f70f081cbf1415c78190677d0220620829de8d245d3362e55773db0a61148172ab245b52f0c84a430feb28284eaa012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f043eb47668b37adad477e67d9afcfdfb19489c642be580b08c9ed78c87aff9b4b8c1d9d1b9947ab82e0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "0100000001cc0f19df9d5911fe6875cbb2102591f49da5beb7d78afb8d90e131a10c4e9f07010000006b48304502210092ee992181fcb29c9686c1ef3ea1c00f5ab69fc190c7395575ef38a5272125d6022028b4a810518e33cdfa080245cfb38bb41c4a5d6b3fd7e1cc89c512abd96216a8012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f0573dd27ada8acf26cf60a4dccee4b8341e8def4dd6fad189a7a326e2eb4957eebec73ad38e355d02a0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "0100000001a85d622ea6b4fa70424b224a9579aea987f16dc16c9051ff66fe10dbf1f64892010000006b483045022100c06a887d954bbc1e402fa3f242551e4fbae5c1a2986414df04a74f37e731159c022030d2991a1ce9c34fe187c58d6c236b7a7857a591f352d3888be54f0f897a2cab012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff0200000000000000002a6a281f06a8d368e95e2d2eecf9623d47176855ca4e8c144a8a1b24db66bc9a95957fb0ad37b459afdb8de8260f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "0100000001a9b2663c9e188b4cd5b66ca80c16ae10b796924674e763d9b13eace2387de5d2010000006a473044022021b1df2bccb3c5da6de6a5925ea71509609e6d31a3156025b78146f93ec28abf02207754192a1f4130daf81727122b7b7a0a3caf567d5a4fb767effdb28a2cd213f9012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000286a261f070f58990b04a2b3b0ea647975c698858db173367d999fd1b825c5ceedf546ccf596e9fe0b00230f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000" ]
"txHexes": [ "01000000014c20db652a5415223acc1a612d973d04e9103364bc8733d5dcab4d4a0d845b46010000006a4730440220706aed669326274a0d38076abf9277f6a8972bf966a402f581b4e92bd563259c0220465d91f3bdd3b1f8715051f4132763317767c29c0ca5054d513b817cdf25c35a012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000526a501f000455915d6ec3300c83afc203143dca5e7602d5d63a01fe492c39d8f147271dd0bd048e40991fe94fcd98814d876f964cc21cb36545af8d47f3503489e9d031fa805be0e8656e21a11592d2746961a0320f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "0100000001fae95f6c403270594ed2243177a0238f9d4508c1970fac0689ec0715ed47c8a1010000006a473044022003c1b04d4f7d2786b8f3ff4fc36f9e39b6fbb911a259a3ec51d9c2eab602e7e80220138410d3fbb36837ce4a1ca841da5cce0b04779833a05064a017bbfccffca851012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000526a50b322f7d287d67d2a8acc7c4d6f881e523196982e261ca92c916d2ed8a728e4012ba5c3daa12d78090e2ae384d1581a37c848df169aa2e3a1125c3b6c7db3a510f86c01fdd98a2579f43b3eb47668b37a88360f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "01000000019e8bb9d47a19dc310f6bb988193a3bc48005ebee8da45554effee1946599816c010000006a47304402203895c9438464c11576b3678070df2ad7e1986242dfc25377a5d71cda1d35af9102202efbda5d06ce9b9fd6f2c332eb4e4725cc9e813e5584fecfe4ec3cb582abad61012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000526a50dad477e67d9afcfdfb19489c642be580b08c9ed78c87aff9b4b8c1d9d1b9947a73dd27ada8acf26cf60a4dccee4b8341e8def4dd6fad189a7a326e2eb4957eebec73ad38e355a8d368e95e2d2eecf962703a0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000", "0100000001c867596806afbe45852b602278e527d1cda8be41ab84b604db25feb3f05baf03000000006b4830450221009dde97b1044fde1cadf209cc8719b0de61d6fb2a5d03a8e982035dcbe49af5ba022067c405eeaae77e1e19a1240e2db3565ffdf4e59ee2879ebdd19fcc62b336020e012102bb80ce863dbd6132336d7cc915880d8cf5cdbf17787ded978b078f11d9441abfffffffff020000000000000000426a403d47176855ca4e8c144a8a1b24db66bc9a95957fb0ad37b459afdb8d0f58990b04a2b3b0ea647975c698858db173367d999fd1b825c5ceedf546ccf596e9fe0b583e0f00000000001976a914efdc12d9bd12a9a599d6d44706dd2328760c500188ac00000000" ]
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc