161 lines
3.6 KiB
JavaScript
161 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
angular.module('insight.transactions').controller('transactionsController',
|
|
function($scope, $rootScope, $routeParams, $location, Global, Transaction, TransactionsByBlock, TransactionsByAddress) {
|
|
$scope.global = Global;
|
|
$scope.loading = false;
|
|
$scope.loadedBy = null;
|
|
|
|
var pageNum = 0;
|
|
var pagesTotal = 1;
|
|
|
|
var _aggregateItems = function(items) {
|
|
if (!items) return [];
|
|
|
|
var l = items.length;
|
|
|
|
var ret = [];
|
|
var tmp = {};
|
|
var u = 0;
|
|
|
|
// TODO multiple output address
|
|
//
|
|
for(var i=0; i < l; i++) {
|
|
|
|
var notAddr = false;
|
|
|
|
// non standard input
|
|
if (items[i].scriptSig && !items[i].addr) {
|
|
items[i].addr = 'Unparsed address [' + u++ + ']';
|
|
items[i].notAddr = true;
|
|
notAddr = true;
|
|
}
|
|
|
|
// non standard output
|
|
if (items[i].scriptPubKey && !items[i].scriptPubKey.addresses) {
|
|
items[i].scriptPubKey.addresses = ['Unparsed address [' + u++ + ']'];
|
|
items[i].notAddr = true;
|
|
notAddr = true;
|
|
}
|
|
|
|
// multiple addr at output
|
|
if (items[i].scriptPubKey && items[i].scriptPubKey.addresses.length > 1) {
|
|
items[i].addr = items[i].scriptPubKey.addresses.join(',');
|
|
ret.push(items[i]);
|
|
continue;
|
|
}
|
|
|
|
var addr = items[i].addr || (items[i].scriptPubKey && items[i].scriptPubKey.addresses[0]);
|
|
|
|
if (!tmp[addr]) {
|
|
tmp[addr] = {};
|
|
tmp[addr].valueSat = 0;
|
|
tmp[addr].count = 0;
|
|
tmp[addr].addr = addr;
|
|
tmp[addr].items = [];
|
|
}
|
|
|
|
tmp[addr].valueSat += items[i].valueSat;
|
|
tmp[addr].value = tmp[addr].valueSat / 100000000;
|
|
tmp[addr].items.push(items[i]);
|
|
tmp[addr].notAddr = notAddr;
|
|
tmp[addr].count++;
|
|
}
|
|
|
|
angular.forEach(tmp, function(v) {
|
|
ret.push(v);
|
|
});
|
|
|
|
return ret;
|
|
};
|
|
|
|
var _processTX = function(tx) {
|
|
tx.vinSimple = _aggregateItems(tx.vin);
|
|
tx.voutSimple = _aggregateItems(tx.vout);
|
|
};
|
|
|
|
var _paginate = function (data) {
|
|
$scope.loading = false;
|
|
|
|
pagesTotal = data.pagesTotal;
|
|
pageNum += 1;
|
|
|
|
data.txs.forEach(function(tx) {
|
|
_processTX(tx);
|
|
$scope.txs.push(tx);
|
|
});
|
|
};
|
|
|
|
var _byBlock = function() {
|
|
TransactionsByBlock.get({
|
|
block: $routeParams.blockHash,
|
|
pageNum: pageNum
|
|
}, function(data) {
|
|
_paginate(data);
|
|
});
|
|
};
|
|
|
|
var _byAddress = function () {
|
|
TransactionsByAddress.get({
|
|
address: $routeParams.addrStr,
|
|
pageNum: pageNum
|
|
}, function(data) {
|
|
_paginate(data);
|
|
});
|
|
};
|
|
|
|
$scope.findThis = function() {
|
|
$scope.findTx($routeParams.txId);
|
|
};
|
|
|
|
$scope.findTx = function(txid) {
|
|
Transaction.get({
|
|
txId: txid
|
|
}, function(tx) {
|
|
$scope.tx = tx;
|
|
_processTX(tx);
|
|
$scope.txs.unshift(tx);
|
|
}, function(e) {
|
|
if (e.status === 400) {
|
|
$rootScope.flashMessage = 'Invalid Transaction ID: ' + $routeParams.txId;
|
|
}
|
|
else if (e.status === 503) {
|
|
$rootScope.flashMessage = 'Backend Error. ' + e.data;
|
|
}
|
|
else {
|
|
$rootScope.flashMessage = 'Transaction Not Found';
|
|
}
|
|
|
|
$location.path('/');
|
|
});
|
|
};
|
|
|
|
//Initial load
|
|
$scope.load = function(from) {
|
|
$scope.loadedBy = from;
|
|
$scope.loadMore();
|
|
};
|
|
|
|
//Load more transactions for pagination
|
|
$scope.loadMore = function() {
|
|
if (pageNum < pagesTotal && !$scope.loading) {
|
|
$scope.loading = true;
|
|
|
|
if ($scope.loadedBy === 'address') {
|
|
_byAddress();
|
|
}
|
|
else {
|
|
_byBlock();
|
|
}
|
|
}
|
|
};
|
|
|
|
//Init without txs
|
|
$scope.txs = [];
|
|
|
|
$scope.$on('tx', function(event, txid) {
|
|
$scope.findTx(txid);
|
|
});
|
|
|
|
});
|