'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); }); });