139 lines
2.3 KiB
JavaScript
139 lines
2.3 KiB
JavaScript
/*!
|
|
* common.js - commonly required functions for wallet.
|
|
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
|
|
* https://github.com/bcoin-org/bcoin
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
/**
|
|
* @exports wallet/common
|
|
*/
|
|
|
|
var common = exports;
|
|
|
|
/**
|
|
* Test whether a string is eligible
|
|
* to be used as a name or ID.
|
|
* @param {String} key
|
|
* @returns {Boolean}
|
|
*/
|
|
|
|
common.isName = function isName(key) {
|
|
if (typeof key !== 'string')
|
|
return false;
|
|
|
|
if (key === '_admin')
|
|
return false;
|
|
|
|
if (key === '__proto__')
|
|
return false;
|
|
|
|
if (!/^[\-\._0-9A-Za-z]+$/.test(key))
|
|
return false;
|
|
|
|
return key.length >= 1 && key.length <= 40;
|
|
};
|
|
|
|
/**
|
|
* Sort an array of transactions by time.
|
|
* @param {TX[]} txs
|
|
* @returns {TX[]}
|
|
*/
|
|
|
|
common.sortTX = function sortTX(txs) {
|
|
return txs.sort(function(a, b) {
|
|
return a.ps - b.ps;
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Sort an array of coins by height.
|
|
* @param {Coin[]} txs
|
|
* @returns {Coin[]}
|
|
*/
|
|
|
|
common.sortCoins = function sortCoins(coins) {
|
|
return coins.sort(function(a, b) {
|
|
a = a.height === -1 ? 0x7fffffff : a.height;
|
|
b = b.height === -1 ? 0x7fffffff : b.height;
|
|
return a - b;
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Sort an array of transactions in dependency order.
|
|
* @param {TX[]} txs
|
|
* @returns {TX[]}
|
|
*/
|
|
|
|
common.sortDeps = function sortDeps(txs) {
|
|
var depMap = {};
|
|
var count = {};
|
|
var result = [];
|
|
var top = [];
|
|
var map = txs;
|
|
var i, j, tx, hash, input;
|
|
var prev, hasDeps, deps;
|
|
|
|
if (Array.isArray(txs)) {
|
|
map = {};
|
|
for (i = 0; i < txs.length; i++) {
|
|
tx = txs[i];
|
|
hash = tx.hash('hex');
|
|
map[hash] = tx;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < txs.length; i++) {
|
|
tx = txs[i];
|
|
hash = tx.hash('hex');
|
|
hasDeps = false;
|
|
|
|
count[hash] = 0;
|
|
|
|
for (j = 0; j < tx.inputs.length; j++) {
|
|
input = tx.inputs[j];
|
|
prev = input.prevout.hash;
|
|
|
|
if (!map[prev])
|
|
continue;
|
|
|
|
count[hash] += 1;
|
|
hasDeps = true;
|
|
|
|
if (!depMap[prev])
|
|
depMap[prev] = [];
|
|
|
|
depMap[prev].push(tx);
|
|
}
|
|
|
|
if (hasDeps)
|
|
continue;
|
|
|
|
top.push(tx);
|
|
}
|
|
|
|
for (i = 0; i < top.length; i++) {
|
|
tx = top[i];
|
|
hash = tx.hash('hex');
|
|
|
|
result.push(tx);
|
|
|
|
deps = depMap[hash];
|
|
|
|
if (!deps)
|
|
continue;
|
|
|
|
for (j = 0; j < deps.length; j++) {
|
|
tx = deps[j];
|
|
hash = tx.hash('hex');
|
|
|
|
if (--count[hash] === 0)
|
|
top.push(tx);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
};
|