Skip to content

Instantly share code, notes, and snippets.

@rise-worlds
Last active October 17, 2019 08:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rise-worlds/a93f3228343b1a1c9574544e5e5b8202 to your computer and use it in GitHub Desktop.
Save rise-worlds/a93f3228343b1a1c9574544e5e5b8202 to your computer and use it in GitHub Desktop.
calc utxo for bcoin
// get /tx/address/${addrs}?reverse=1
const TX_TYPE_IN = 1;
const TX_TYPE_OUT = 2;
export const CreateUtxos = async (address: string, data: any) => {
let mapData = new Map();
let temp = new Map();
for (const iter of data) {
mapData.set(iter.hash, iter);
// console.log(iter.hash);
let type = TX_TYPE_IN;
for (const input of iter.inputs) {
if (input.coin.coinbase) continue;
if (address == input.coin.address) {
type = TX_TYPE_OUT;
}
}
let out = -1;
let balance = 0;
for (const output of iter.outputs) {
out++;
if (address == output.address) {
balance = output.value;
break;
}
}
temp.set(iter.hash, { type, out, balance, spentTxid: null, spentHeight: 0 });
}
for (const [key, value] of mapData) {
for (const input of value.inputs) {
if (input.coinbase) continue;
if (temp.has(input.prevout.hash)) {
const pre = temp.get(input.prevout.hash);
const local = temp.get(key);
if (pre.spentHeight <= 0 && (pre.type != local.type || local.type == TX_TYPE_OUT)) {
pre.spentTxid = value.hash;
pre.spentHeight = value.height;
}
}
}
}
let balance = 0;
let unspentList: Array<any> = [];
for (const [key, value] of temp) {
if (value.spentHeight === 0) {
balance += value.balance;
// console.info(key, value.out);
unspentList.push(value);
} /*else {
temp.delete(key);
}*/
}
// return {balance, unspentList: Array.from(temp.values())}
return { balance, unspentList };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment