Compare commits

...

177 Commits

Author SHA1 Message Date
Larry Ruane 5a5fdc2aad Further URL updates: issues to zcash, str4d -> zcash-hackworks 2019-01-11 15:52:38 -07:00
Simon aa3f3c8b27 Add support for Sapling shielded spends and outputs 2018-09-17 22:51:48 -07:00
Simon 78f050070a Update url to zcash-hackworks. 2018-05-09 14:25:29 -07:00
Simon 010e6af5de Update contributors. 2018-05-07 23:06:43 -07:00
Simon 9c67396e94 Add support for Overwinter transactions. 2018-05-07 23:04:41 -07:00
Jack Grigg ce057c4338
More testnet/mainnet awareness 2016-10-28 22:36:59 -07:00
Jack Grigg 6630449b7e
Make it easier to show mainnet or testnet 2016-10-28 17:29:55 -07:00
Jack Grigg 7ea8ed4bf3
Missing compile 2016-10-28 12:16:10 -07:00
Jack Grigg 130a8b2031
Revert to mainnet symbol 2016-10-28 11:53:47 -07:00
Jack Grigg 5fd8e9071e Add some basic charts 2016-09-12 02:17:31 +12:00
Jack Grigg 4def8706b1 Add c3 2016-09-11 19:37:20 +12:00
Jack Grigg b6a64af705 Upgrade AngularJS to 1.5.8 2016-09-11 03:25:24 +12:00
Jack Grigg fcf035d140 Replace deprecated method
See http://momentjs.com/docs/#/manipulating/max/
2016-09-11 03:21:05 +12:00
Jack Grigg 12d960183c Upgrade AngularJS to 1.4.12 2016-09-11 03:21:02 +12:00
Jack Grigg 07dcf73a98 Fix errors caused by AngularJS upgrade 2016-09-11 03:17:42 +12:00
Jack Grigg 1d5273d621 Upgrade AngularJS to 1.3.20 2016-09-11 03:17:36 +12:00
Jack Grigg 83fb8fe973 Zcash testnet currency symbol is TAZ 2016-09-10 15:16:25 +12:00
Jack Grigg 880f629811 Emphasise that the explorer currently shows testnet Zcash 2016-08-31 16:30:42 +12:00
Jack Grigg ade6b06fae Specify blockchain currency symbol in one location 2016-08-31 16:27:07 +12:00
Jack Grigg 5d45cd463e Fix empty text for transaction JoinSplits 2016-08-30 20:04:12 +12:00
Jack Grigg 5162ec052d Render JoinSplit public values 2016-08-29 21:18:58 +12:00
Jack Grigg 66b5e70114 Bitcoin -> Zcash 2016-08-29 01:56:48 +12:00
Jack Grigg e71dbd81d0 Render nonce and Equihash solution in block view 2016-08-29 01:44:07 +12:00
Jack Grigg afa8866655 BTC -> ZEC 2016-08-29 01:43:52 +12:00
Jack Grigg 93d1b3bad1 Zcash-ify 2016-08-29 01:43:40 +12:00
Braydon Fuller ddcd05cbc2 Bump package version to 0.4.0 2016-05-27 14:24:15 -04:00
Chris Kleeschulte df19530235 Merge pull request #718 from braydonf/bitcoind
bitcoind: change to use bitcoind/addresstxid event
2016-05-27 14:19:37 -04:00
Braydon Fuller d7c161d7b6 Update compiled files 2016-05-18 10:19:52 -04:00
Braydon Fuller ffed19b8b3 Unsubscribe to address event, and update addresstxid data format 2016-05-18 10:19:36 -04:00
Braydon Fuller 0a06f9aba9 Update compiled files 2016-05-17 22:58:20 -04:00
Braydon Fuller f50abae460 Fix url to transaciton sound 2016-05-17 21:00:36 -04:00
Braydon Fuller 3532cd25a1 Change to use bitcoind/addresstxid event 2016-05-17 20:17:04 -04:00
Braydon Fuller 923c596b74 Merge pull request #713 from Gitju/master
sed -i 's#github.com/bitpay/insight#github.com/bitpay/insight-ui#g' package.json
2016-04-25 10:25:43 -04:00
Cryptoanarchist f002131366 sed -i 's#github.com/bitpay/insight#github.com/bitpay/insight-ui#g'
and adding https where necessary
2016-04-24 16:24:23 +02:00
Cryptoanarchist 3ff860c483 sed -i 's#github.com/bitpay/insight#github.com/bitpay/insight-ui#g' 2016-04-24 14:57:34 +02:00
Matias Alejo Garcia e3ef214b21 Merge pull request #691 from braydonf/readme2
Docs: Update documentation with the most recent commands.
2016-02-17 13:47:00 -03:00
Braydon Fuller 653fd60a24 Bump package version to 0.3.1 2016-02-08 12:43:23 -05:00
Matias Alejo Garcia d16892d7af Merge pull request #703 from braydonf/network
Show network name instead of testnet boolean
2016-02-05 12:52:06 -03:00
Braydon Fuller 2e013122db Show network name instead of testnet boolean 2016-02-05 10:40:26 -05:00
Braydon Fuller 840fd0db21 Docs: Update documentation with the most recent commands. 2015-11-12 17:22:35 -05:00
Stephen Pair 7c5a79c80a Merge pull request #670 from bitpay/v0.3.0
v0.3.0
2015-10-16 20:51:18 -04:00
Patrick Nagurny 7d68b0cc82 Merge pull request #678 from braydonf/feature/configurable-routes
Added ability to configure HTTP route prefixes.
2015-10-13 11:20:38 -04:00
Braydon Fuller e006e5cbcd Remove unnecessary line. 2015-10-13 11:19:35 -04:00
Braydon Fuller 7ec3124d82 Fix bug with trailing `/`. 2015-10-13 11:16:12 -04:00
Braydon Fuller c45a0edd60 Added ability to configure HTTP route prefixes. 2015-10-13 10:49:44 -04:00
Patrick Nagurny 933c378a8d Merge pull request #672 from braydonf/v0.3.0-buttons
Removed href="#" that was redirecting the the landing page.
2015-10-02 14:21:35 -04:00
Braydon Fuller accff4e43c Removed href="#" that was redirecting the the landing page. 2015-10-02 13:14:30 -04:00
Matias Alejo Garcia fb43ff70d4 Merge pull request #669 from kleetus/feature/remove_getTxOutInfo
Removed button and div for Show Transaction Output Data
2015-09-25 12:51:27 -03:00
Chris Kleeschulte 19974a7d3d Removed button and div for Show Transaction Output Data 2015-09-25 11:26:21 -04:00
Chris Kleeschulte 4684224a53 Merge pull request #668 from braydonf/bug/tx-mined-time
Fix bug with displaying mined time for mempool transactions.
2015-09-22 13:17:47 -04:00
Braydon Fuller b5251849a0 Fix bug with displaying mined time for mempool transactions. 2015-09-21 17:21:11 -04:00
Patrick Nagurny 2105492ff9 Merge pull request #666 from braydonf/verify-message
Fix for Messages URL
2015-09-18 14:00:36 -04:00
Braydon Fuller e45396435b Add updated generate files until we have a better solution. 2015-09-18 13:58:05 -04:00
Braydon Fuller fc15f2982f Update link to messages. 2015-09-17 17:00:59 -04:00
Braydon Fuller af08592d01 Fix for Messages URL 2015-09-17 15:51:31 -04:00
Patrick Nagurny dd3d590a44 Merge pull request #659 from braydonf/readme
Update README to reflect running as a Bitcore Node service.
2015-09-03 18:19:03 -04:00
Patrick Nagurny e4eb09f87f update css 2015-09-03 18:16:34 -04:00
Braydon Fuller 36f5c75880 Update README to reflect running as a Bitcore Node service. 2015-09-03 18:15:52 -04:00
Patrick Nagurny a9828d8539 change name to insight-ui, remove dependency on insight-api 2015-09-03 17:33:59 -04:00
Patrick Nagurny 1d70f0196c add bitcore-node service and make everything relative paths 2015-09-03 11:39:21 -04:00
Matias Alejo Garcia 4253de1ed4 Update index.html 2015-08-05 14:48:28 -03:00
Matias Alejo Garcia 443507c6bd Merge pull request #644 from cmgustavo/fix/bundles-angular
Update bundles
2015-07-14 13:03:38 -03:00
Gustavo Maximiliano Cortez 52b665e79a
Update bundles 2015-07-14 13:01:02 -03:00
Matias Alejo Garcia c2a0dee752 update bundles 2015-07-13 19:20:21 -03:00
Matias Alejo Garcia aae6847235 bump version 2015-07-10 18:06:43 -03:00
Gustavo Maximiliano Cortez 805099de1b Merge pull request #643 from matiu/feat/unconfirmed-input
add unconfirmed input banner
2015-07-10 18:02:46 -03:00
Matias Alejo Garcia 53d8cd4412 add unconfirmed input banner 2015-07-10 17:41:26 -03:00
Gustavo Maximiliano Cortez aaa21faae5 Merge pull request #641 from bitpay/revert-640-addfeeperkb
Revert "Fix max decimal place + trailing zeroes when in BTC"
2015-07-08 10:13:11 -03:00
Gustavo Maximiliano Cortez ea0adc1d9e Merge pull request #640 from dabura667/addfeeperkb
Fix max decimal place + trailing zeroes when in BTC
2015-07-08 09:56:39 -03:00
dabura667 4d3e71a346 Fix max decimal place + trailing zeroes when in BTC 2015-07-08 21:15:29 +09:00
Gustavo Maximiliano Cortez 81c71415ed Revert "Fix max decimal place + trailing zeroes when in BTC" 2015-07-08 07:11:20 -03:00
Matias Alejo Garcia 07d8dddfb3 Merge pull request #639 from matiu/version
bump version
2015-07-07 20:50:04 -03:00
Matias Alejo Garcia 8241dfe9ba Merge pull request #638 from dabura667/addfeeperkb
Fix fee per kb
2015-07-07 20:48:51 -03:00
Matias Alejo Garcia d188b2512c bump version 2015-07-07 20:47:34 -03:00
dabura667 1423811d4e Fix fee per kb 2015-07-08 08:38:12 +09:00
Matias Alejo Garcia 9183ffcf10 Merge pull request #636 from dabura667/addfeeperkb
Add fee per kB to transaction view
2015-07-07 11:59:33 -03:00
dabura667 245e52d6fb Add fee per kB to transaction view
https://www.reddit.com/r/Bitcoin/comments/3ceyaz/block_explorers_please_display_feeperkb/
2015-07-07 23:50:50 +09:00
Gustavo Maximiliano Cortez 76e47fd077 Merge pull request #625 from saschad/master
German Translation
2015-06-09 17:16:59 -03:00
Sascha Dückers d91894e0ea Add German translation. 2015-06-09 15:25:44 +02:00
Matias Alejo Garcia 9e7ff7e092 Merge pull request #623 from thesoftwarejedi/patch-1
Update README.md
2015-05-29 14:49:06 -03:00
Dana Hanna 1a821f9c2a Update README.md
fix typo
2015-05-29 02:38:14 -04:00
Gustavo Maximiliano Cortez 79341717ec Merge pull request #588 from cmgustavo/bug/footer-01
Fix footer. Update angularjs-all
2014-11-30 19:37:47 -03:00
Gustavo Maximiliano Cortez af028e41e6 Fix footer. Update angularjs-all 2014-11-30 19:31:12 -03:00
Gustavo Maximiliano Cortez 51a6ff9e85 Update README.md
fixes #580
2014-11-22 13:43:10 -03:00
Manuel Aráoz 7d4014f573 Merge pull request #584 from BlaiseExpMore25/bug/545-unit-translation
issue 545 - added unit change for transactions on homepage
2014-11-10 18:37:03 -03:00
BlaiseExpMore25 e4a82a838b issue 545 - added unit change for transactions on homepage 2014-11-10 22:07:31 +01:00
Matias Alejo Garcia f29f5a8f4a Merge pull request #581 from visvirial/translate-ja
Add Japanese translation.
2014-11-10 15:59:57 -03:00
Vis Virial 5435744f05 Add Japanese translation. 2014-11-10 02:01:51 +09:00
Manuel Aráoz 94faf2d9f9 Merge pull request #579 from koirikivi/verifymessage-broadcasttx
Add support for verifymessage and sendrawtransaction
2014-11-06 15:09:21 -03:00
Rainer Koirikivi f20550259f Add support for broadcasting a raw transaction 2014-11-05 00:32:16 +02:00
Rainer Koirikivi f47133cd4b Add support for verifying messages
/messages/verify contains a view that utilizes the API method of
verifying Bitcoin messages. A link to the page is also added to the
footer.
2014-11-05 00:32:16 +02:00
Matias Alejo Garcia 594216e998 Merge pull request #578 from andrewfhart/feature/add-robots-txt
Add robots.txt
2014-11-02 08:43:43 -03:00
Andrew Hart 8bde44134b Add initial robots.txt with rules from #544 2014-11-01 20:48:56 -07:00
Gustavo Maximiliano Cortez 2852afc12b Merge pull request #572 from cmgustavo/feature/angular-ammoment
Changing deprecated value "changeLanguage" by "changeLocale"
2014-10-27 11:43:41 -03:00
Gustavo Maximiliano Cortez c1d14c6652 display languages if available 2014-10-27 11:40:59 -03:00
Gustavo Maximiliano Cortez 40411ca2aa Change deprecated value "changeLanguage" by "changeLocale" 2014-10-27 11:37:24 -03:00
Matias Alejo Garcia adc3f2ade4 Merge pull request #573 from andrewfhart/fix-blocks-length
Fix $scope.blocksLength assignment in index controller
2014-10-26 19:57:07 -03:00
Andrew Hart 5b48e4444d Update generated files with fix from 7698739 2014-10-26 10:34:13 -07:00
Andrew Hart 7698739215 Fix typo (lenght) in index controller 2014-10-26 10:31:41 -07:00
Gustavo Maximiliano Cortez 0b255f5f32 Merge pull request #570 from andrewfhart/feature/unify-search
Unify Search
2014-10-23 23:46:49 -03:00
Andrew Hart dd2d32a06a Add mobile-specific attributes to the mobile-visible search form reference 2014-10-22 12:56:42 -07:00
Andrew Hart 67ff2cd06a Reference the views/includes/search.html template in header.html 2014-10-22 12:55:09 -07:00
Andrew Hart d6b90fe871 Remove mobile-specific attributes in the search form snippet 2014-10-22 12:49:40 -07:00
Andrew Hart 9e6fccc554 Add placeholder translation in mobile search input 2014-10-22 12:10:35 -07:00
Gustavo Maximiliano Cortez 4225e59ae0 Merge pull request #569 from andrewfhart/feature/generated-files-for-567
Add generated JavaScript files pertaining to #567
2014-10-22 14:52:19 -03:00
Andrew Hart 5217763a1e Add updated angular-all generated javascript 2014-10-22 10:15:25 -07:00
Andrew Hart b1cb8d7209 Add compiled files generated as a result of #567 2014-10-22 09:53:37 -07:00
Matias Alejo Garcia 3c2add5f36 Merge pull request #567 from andrewfhart/master
Give automatic focus to the header search box on page load
2014-10-22 12:41:45 -03:00
Andrew Hart f7bec5285a Merge remote-tracking branch 'upstream/master'
Conflicts:
	public/views/includes/header.html
2014-10-22 07:52:22 -07:00
Matias Alejo Garcia 9945a0bdc9 Merge pull request #568 from cmgustavo/bug/03-layout
fix layout for small devices
2014-10-22 09:57:54 -03:00
Matias Alejo Garcia 253ea739d7 Merge pull request #563 from cmgustavo/feature/bits-support-storage
feature/bits support
2014-10-22 09:56:40 -03:00
Gustavo Maximiliano Cortez 793fc4216a fix layout for small devices 2014-10-22 09:23:59 -03:00
Gustavo Maximiliano Cortez 8ea1d1e9c4 bits support. using local storage to remember selected currency 2014-10-22 09:01:48 -03:00
Matias Alejo Garcia 56c0660c87 Merge pull request #562 from cmgustavo/feature/spanish-example-support
Feature/spanish example support
2014-10-22 07:50:36 -03:00
Andrew Hart 9e33a4abd8 Add focus directive to search box text input 2014-10-21 16:44:12 -07:00
Andrew Hart beee5a3003 Add focus directive to be used to give input elements focus 2014-10-21 16:42:40 -07:00
Gustavo Maximiliano Cortez 2341dcc12f Spanish timestamp format (using angular-moment) 2014-10-13 01:48:43 -03:00
Gustavo Maximiliano Cortez 4d8068301a Example support for spanish language 2014-10-13 01:35:59 -03:00
Manuel Aráoz b8f624f1e0 Merge pull request #556 from pierrerochard/patch-1
Small typo
2014-09-29 15:08:14 -03:00
Pierre Rochard a4465279f1 Small typo 2014-09-29 13:10:59 -04:00
Matias Alejo Garcia 26f24480fd 0.2.5 2014-09-22 18:16:05 -03:00
Matias Alejo Garcia 2a048cdd64 update api version 2014-09-22 18:16:03 -03:00
Matias Alejo Garcia bd51c9575a Merge pull request #551 from cmgustavo/bug/mobile-wrap
Bug/mobile wrap
2014-09-22 18:11:59 -03:00
Gustavo Maximiliano Cortez 33c9120991 wording fixes 2014-09-12 19:04:06 -03:00
Gustavo Maximiliano Cortez c788ef0c2f Fixes mobile version. Fix #550 2014-09-12 18:48:14 -03:00
Matias Alejo Garcia cab5dd438b Merge pull request #537 from cmgustavo/feature/multi-language-support
Feature/multi language support
2014-09-08 14:13:47 -03:00
Gustavo Maximiliano Cortez 5e058c2f6f Fix Conflicts:
public/js/angularjs-all.min.js
	public/js/main.min.js
2014-09-03 16:35:11 -03:00
Yemel Jardi bee6de08a4 Merge pull request #546 from maraoz/version/0.2.4
Version 0.2.4
2014-09-01 14:19:25 -03:00
Manuel Araoz 7681797b90 update version 2014-09-01 13:09:54 -03:00
Manuel Araoz f2b8fd3531 new insight version 2014-09-01 13:00:19 -03:00
Gustavo Maximiliano Cortez 72028e4314 update README 2014-08-24 03:10:29 -03:00
Gustavo Maximiliano Cortez c94765bca5 minified files with multi language support (used for easier starter) 2014-08-24 02:46:13 -03:00
Gustavo Maximiliano Cortez a8aebfe14a multi language support 2014-08-24 02:45:10 -03:00
Gustavo Maximiliano Cortez 48cdac80fb Required packages, gruntConfig updated and gitignore for pot files. 2014-08-24 02:44:28 -03:00
Gustavo Maximiliano Cortez d8712e7a83 Merge pull request #518 from matiu/feature/fix-link
Feature/fix link
2014-06-18 17:22:20 -03:00
Matias Alejo Garcia 45caf5a40a fix abs link 2014-06-18 17:18:06 -03:00
Matias Alejo Garcia 9f3f0bfd09 add logo svg 2014-06-18 17:16:16 -03:00
Matias Alejo Garcia d8936051aa Merge pull request #512 from drak/patch-2
Add a note about Nginx setup
2014-06-09 11:05:54 -03:00
Drak 4f9216969d Add a note about Nginx setup 2014-06-09 15:03:43 +01:00
Matias Alejo Garcia 22df1545e4 Merge pull request #510 from sandakersmann/patch-1
Updated README.md with correct link
2014-06-08 11:17:57 -03:00
sandakersmann 9c2a3b1981 Updated README.md with correct link
Updated README.md with correct insight's project homepage link
2014-06-08 04:45:42 +02:00
Matias Alejo Garcia c1e06dd5df Merge pull request #508 from drak/patch-1
Correct grammar.
2014-06-05 18:21:17 -03:00
Drak 8d54e087f0 Correct grammar. 2014-06-05 22:17:09 +01:00
Gustavo Maximiliano Cortez 7a0f62eeff Merge pull request #504 from matiu/feature/api-dep
Feature/api dep
2014-06-03 11:04:20 -03:00
Matias Alejo Garcia aa74f13a24 add more msg error 2014-06-03 10:41:31 -03:00
Matias Alejo Garcia 7cde324aac hide block in unconfirmed txs 2014-06-03 10:32:04 -03:00
Matias Alejo Garcia f18dc83cd6 Merge pull request #503 from colkito/fix/hide-loading-search
removed loading images in the search field
2014-06-02 13:23:17 -03:00
Mario Colque e5f7327d1f removed loading images in the search field 2014-06-02 13:12:41 -03:00
Matias Alejo Garcia e09d0643dc Merge pull request #502 from matiu/feature/api-dep
.
2014-06-02 10:37:46 -03:00
Matias Alejo Garcia 4b149c87bf . 2014-06-02 10:35:22 -03:00
Matias Alejo Garcia b27b01215f Merge pull request #501 from matiu/feature/v0.2.3
Feature/v0.2.3
2014-06-02 10:32:31 -03:00
Matias Alejo Garcia 9694e415d1 0.2.3 2014-06-02 10:30:01 -03:00
Matias Alejo Garcia 99afc7e187 add npm ignore 2014-06-02 10:29:48 -03:00
Matias Alejo Garcia c4a3b874d5 v0.2.3 2014-06-02 10:29:08 -03:00
Matias Alejo Garcia 1aa7dde498 Merge pull request #500 from matiu/v0.2.2
V0.2.2
2014-06-02 10:20:13 -03:00
Matias Alejo Garcia cc6c077678 0.2.2 2014-06-02 10:19:14 -03:00
Matias Alejo Garcia 19a907aed3 v0.2.2 2014-06-02 10:18:58 -03:00
Mario Colque fca0ccc0ec Merge pull request #498 from cmgustavo/bug/minor-details
Fixes: removed white spaces. Changed loader gif
2014-05-30 16:26:43 -03:00
Gustavo Cortez 58b7b67103 Fixes: removed white spaces. Changed loader gif 2014-05-30 16:12:19 -03:00
Mario Colque f55ece0642 Merge pull request #495 from cmgustavo/bug/currency-values
Bug/currency values
2014-05-30 13:25:34 -03:00
Gustavo Cortez f5c930adef Fix Conflicts:
public/js/main.min.js
2014-05-30 13:09:56 -03:00
Gustavo Maximiliano Cortez 6aa38d2046 Merge pull request #496 from matiu/feature/blockspager
add pager to blocks within certain date
2014-05-30 11:53:55 -03:00
Matias Alejo Garcia d28d83b90a add pager to blocks within certain date 2014-05-30 11:50:18 -03:00
Gustavo Cortez d82b0ecebd re-compile files dependences 2014-05-30 11:34:32 -03:00
Gustavo Cortez 3604ff8651 Fixes: currency values (output, input, fee) 2014-05-30 11:33:48 -03:00
Gustavo Maximiliano Cortez 36b183f26d Merge pull request #493 from colkito/fix/66-show-coinbase-info
showed coinbase info in the tx symmary
2014-05-27 11:36:28 -03:00
Mario Colque ae839a0fc8 showed coinbase info in the tx symmary 2014-05-27 10:39:28 -03:00
Mario Colque 91b00a0088 Merge pull request #491 from cmgustavo/bug/01-ui
Bug/01 ui
2014-05-27 10:17:22 -03:00
Gustavo Cortez fd23d9c722 Fixes: transaction list. Buttons with bootstrap styles 2014-05-26 17:57:13 -03:00
Gustavo Cortez 29c24884e5 Fix scroll position after changing view. 2014-05-26 17:32:15 -03:00
Gustavo Cortez e0e6c94ae7 Removed unnecessary ng-cloak 2014-05-26 17:30:00 -03:00
Gustavo Cortez 7b6986e46b Fix secondary navbar from tx page 2014-05-26 16:02:43 -03:00
Gustavo Cortez 8baf5dd691 Removed size column on last transactions (home) 2014-05-26 15:36:12 -03:00
Gustavo Maximiliano Cortez eefaf0ae6a Merge pull request #489 from matiu/feature/tx01
show blockhash in tx
2014-05-26 10:15:21 -03:00
Matias Alejo Garcia e273ec998c update deps 2014-05-25 23:55:13 -03:00
Matias Alejo Garcia a48a611de5 0.2.1 2014-05-25 23:54:28 -03:00
Matias Alejo Garcia bb4bf112d9 show blockhash in tx 2014-05-25 22:14:12 -03:00
63 changed files with 3180 additions and 533 deletions

2
.gitignore vendored
View File

@ -45,3 +45,5 @@ public/js/vendors.js
public/css/main.css
README.html
po/*
!po/*.po

39
.npmignore Normal file
View File

@ -0,0 +1,39 @@
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
*.swp
tags
pids
logs
results
build
node_modules
# extras
*.swp
*.swo
*~
.project
peerdb.json
npm-debug.log
.nodemonignore
.DS_Store
db/txs/*
db/txs
db/testnet/txs/*
db/testnet/txs
db/blocks/*
db/blocks
db/testnet/blocks/*
db/testnet/blocks
README.html
k*

View File

@ -9,6 +9,7 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-css');
grunt.loadNpmTasks('grunt-markdown');
grunt.loadNpmTasks('grunt-macreload');
grunt.loadNpmTasks('grunt-angular-gettext');
// Project Configuration
grunt.initConfig({
@ -25,19 +26,26 @@ module.exports = function(grunt) {
}
},
vendors: {
src: ['public/src/js/ios-imagefile-megapixel/megapix-image.js', 'public/lib/qrcode-generator/js/qrcode.js', 'public/src/js/jsqrcode/grid.js', 'public/src/js/jsqrcode/version.js', 'public/src/js/jsqrcode/detector.js', 'public/src/js/jsqrcode/formatinf.js', 'public/src/js/jsqrcode/errorlevel.js', 'public/src/js/jsqrcode/bitmat.js', 'public/src/js/jsqrcode/datablock.js', 'public/src/js/jsqrcode/bmparser.js', 'public/src/js/jsqrcode/datamask.js', 'public/src/js/jsqrcode/rsdecoder.js', 'public/src/js/jsqrcode/gf256poly.js', 'public/src/js/jsqrcode/gf256.js', 'public/src/js/jsqrcode/decoder.js', 'public/src/js/jsqrcode/qrcode.js', 'public/src/js/jsqrcode/findpat.js', 'public/src/js/jsqrcode/alignpat.js', 'public/src/js/jsqrcode/databr.js', 'public/lib/momentjs/min/moment.min.js', 'public/lib/zeroclipboard/ZeroClipboard.min.js'],
src: ['public/src/js/ios-imagefile-megapixel/megapix-image.js', 'public/lib/qrcode-generator/js/qrcode.js', 'public/src/js/jsqrcode/grid.js', 'public/src/js/jsqrcode/version.js', 'public/src/js/jsqrcode/detector.js', 'public/src/js/jsqrcode/formatinf.js', 'public/src/js/jsqrcode/errorlevel.js', 'public/src/js/jsqrcode/bitmat.js', 'public/src/js/jsqrcode/datablock.js', 'public/src/js/jsqrcode/bmparser.js', 'public/src/js/jsqrcode/datamask.js', 'public/src/js/jsqrcode/rsdecoder.js', 'public/src/js/jsqrcode/gf256poly.js', 'public/src/js/jsqrcode/gf256.js', 'public/src/js/jsqrcode/decoder.js', 'public/src/js/jsqrcode/qrcode.js', 'public/src/js/jsqrcode/findpat.js', 'public/src/js/jsqrcode/alignpat.js', 'public/src/js/jsqrcode/databr.js', 'public/lib/moment/min/moment.min.js', 'public/lib/moment/lang/es.js', 'public/lib/zeroclipboard/ZeroClipboard.min.js',
'public/lib/c3/c3.min.js',
'public/lib/d3/d3.min.js'
],
dest: 'public/js/vendors.js'
},
angular: {
src: ['public/lib/angular/angular.min.js', 'public/lib/angular-resource/angular-resource.min.js', 'public/lib/angular-route/angular-route.min.js', 'public/lib/angular-qrcode/qrcode.js', 'public/lib/angular-animate/angular-animate.min.js', 'public/lib/angular-bootstrap/ui-bootstrap.js', 'public/lib/angular-bootstrap/ui-bootstrap-tpls.js', 'public/lib/angular-ui-utils/ui-utils.min.js', 'public/lib/ngprogress/build/ngProgress.min.js'],
src: ['public/lib/angular/angular.min.js', 'public/lib/angular-resource/angular-resource.min.js', 'public/lib/angular-route/angular-route.min.js', 'public/lib/angular-qrcode/qrcode.js', 'public/lib/angular-animate/angular-animate.min.js', 'public/lib/angular-bootstrap/ui-bootstrap.js', 'public/lib/angular-bootstrap/ui-bootstrap-tpls.js', 'public/lib/angular-ui-utils/ui-utils.min.js', 'public/lib/ngprogress/build/ngProgress.min.js', 'public/lib/angular-gettext/dist/angular-gettext.min.js', 'public/lib/angular-moment/angular-moment.min.js'],
dest: 'public/js/angularjs-all.js'
},
main: {
src: ['public/src/js/app.js', 'public/src/js/controllers/*.js', 'public/src/js/services/*.js', 'public/src/js/directives.js', 'public/src/js/filters.js', 'public/src/js/config.js', 'public/src/js/init.js'],
src: ['public/src/js/app.js', 'public/src/js/controllers/*.js', 'public/src/js/services/*.js', 'public/src/js/directives.js', 'public/src/js/filters.js', 'public/src/js/config.js', 'public/src/js/init.js', 'public/src/js/translations.js'],
dest: 'public/js/main.js'
},
css: {
src: ['public/lib/bootstrap/dist/css/bootstrap.min.css', 'public/src/css/**/*.css'],
src: [
'public/lib/bootstrap/dist/css/bootstrap.min.css',
'public/lib/c3/c3.min.css',
'public/src/css/**/*.css'
],
dest: 'public/css/main.css'
}
},
@ -86,13 +94,30 @@ module.exports = function(grunt) {
watch: {
main: {
files: ['public/src/js/**/*.js'],
tasks: ['concat:main', 'uglify:main', 'macreload'],
tasks: ['concat:main', 'uglify:main'],
},
css: {
files: ['public/src/css/**/*.css'],
tasks: ['concat:css', 'cssmin', 'macreload'],
tasks: ['concat:css', 'cssmin'],
},
},
nggettext_extract: {
pot: {
files: {
'po/template.pot': ['public/views/*.html', 'public/views/**/*.html']
}
},
},
nggettext_compile: {
all: {
options: {
module: 'insight'
},
files: {
'public/src/js/translations.js': ['po/*.po']
}
},
}
});
//Making grunt default to force in order not to break the project.
@ -101,8 +126,11 @@ module.exports = function(grunt) {
//Default task(s).
grunt.registerTask('default', ['watch']);
//Update .pot file
grunt.registerTask('translate', ['nggettext_extract']);
//Compile task (concat + minify)
grunt.registerTask('compile', ['concat', 'uglify', 'cssmin', 'macreload']);
grunt.registerTask('compile', ['nggettext_compile', 'concat', 'uglify', 'cssmin']);
};

116
README.md
View File

@ -1,98 +1,80 @@
# *insight*
# Insight UI
*insight* is an open-source bitcoin blockchain explorer with complete REST
and websocket APIs. Insight runs in NodeJS, uses AngularJS for the
front-end and LevelDB for storage.
A Bitcoin blockchain explorer web application service for [Bitcore Node](https://github.com/bitpay/bitcore-node) using the [Insight API](https://github.com/zcash-hackworks/insight-api-zcash).
Check some screenshots and more details at [insight's project homepage](http://insight.bitcore.io).
## Quick Start
*Insight* project is now splitted in two repositories. One for the [API](https://github.com/bitpay/insight-api) and for the front-end. This repository is for the front-end, which will install the API as a NPM dependency.
Please see the guide at [https://bitcore.io/guides/full-node](https://bitcore.io/guides/full-node) for information about getting a block explorer running. This is only the front-end component of the block explorer, and is packaged together with all of the necessary components in [Bitcore](https://github.com/bitpay/bitcore).
## Prerequisites
## Getting Started
* **Node.js v0.10.x** - Download and Install [Node.js](http://www.nodejs.org/download/).
To manually install all of the necessary components, you can run these commands:
* **NPM** - Node.js package manager, should be automatically installed when you get node.js.
```bash
npm install -g bitcore-node
bitcore-node create mynode
cd mynode
bitcore-node install insight-api
bitcore-node install insight-ui
bitcore-node start
```
## Quick Install
Check the Prerequisites section above before installing.
To install Insight, clone the main repository:
$ git clone https://github.com/bitpay/insight.git && cd insight
Install dependencies:
$ npm install
Run the main application:
$ npm start
Then open a browser and go to:
http://localhost:3001
If *insight* reports problems connecting to **bitcoind** please check the CONFIGURATION section of
[insight-api README](https://github.com/bitpay/insight-api/blob/master/README.md). To set the
environment variables run something like:
$ INSIGHT_NETWORK=livenet BITCOIND_USER=user BITCOIND_PASS=pass INSIGHT_PUBLIC_PATH=public npm start
Please note that the app will need to sync its internal database
with the blockchain state, which may take some time. You can check
sync progress from within the web interface. More details about that process
on [insight-api README](https://github.com/bitpay/insight-api/blob/master/README.md).
Open a web browser to `http://localhost:3001/insight/`
## Development
To run insight locally for development mode:
To run Insight UI locally in development mode:
Install bower dependencies:
```$ bower install```
```
$ bower install
```
To compile and minify the web application's assets:
```$ grunt compile```
There is a convinent Gruntfile.js for automation during editing the code
```$ grunt```
In case you are developing *insight* and *insight-api* toghether, you can do the following:
* Install insight and insight-api on the same path ($IROOT)
```
$ cd $IROOT/insight
$ grunt
```
in other terminal:
```
$ cd $IROOT/insight-api
$ ln -s ../insight/public
$ INSIGHT_PUBLIC_PATH=public node insight.js
$ grunt compile
```
There is a convenient Gruntfile.js for automation during editing the code
```INSIGHT_PUBLIC_PATH=insight/public grunt```
at insight-api's home path (edit the path according your setup).
```
$ grunt
```
**also** in the insight-api path. (So you will have to grunt process running, one for insight and one for insight-api).
## Multilanguage support
Insight UI uses [angular-gettext](http://angular-gettext.rocketeer.be) for multilanguage support.
To enable a text to be translated, add the ***translate*** directive to html tags. See more details [here](http://angular-gettext.rocketeer.be/dev-guide/annotate/). Then, run:
```
grunt compile
```
This action will create a template.pot file in ***po/*** folder. You can open it with some PO editor ([Poedit](http://poedit.net)). Read this [guide](http://angular-gettext.rocketeer.be/dev-guide/translate/) to learn how to edit/update/import PO files from a generated POT file. PO file will be generated inside po/ folder.
If you make new changes, simply run **grunt compile** again to generate a new .pot template and the angular javascript ***js/translations.js***. Then (if use Poedit), open .po file and choose ***update from POT File*** from **Catalog** menu.
Finally changes your default language from ***public/src/js/config***
```
gettextCatalog.currentLanguage = 'es';
```
This line will take a look at any *.po files inside ***po/*** folder, e.g.
**po/es.po**, **po/nl.po**. After any change do not forget to run ***grunt
compile***.
## Note
For more details about the *insight API* configs and end-point, just go to [insight API github repository](https://github.com/bitpay/insight-api) or read the [documentation](https://github.com/bitpay/insight-api/blob/master/README.md)
For more details about the [Insight API](https://github.com/zcash-hackworks/insight-api-zcash) configuration and end-points, go to [Insight API GitHub repository](https://github.com/zcash-hackworks/insight-api-zcash).
## Contribute
Contributions and suggestions are welcomed at [insight github repository](https://github.com/bitpay/insight).
Contributions and suggestions are welcomed at the [Insight UI GitHub repository](https://github.com/zcash-hackworks/insight-ui-zcash).
## License

View File

@ -0,0 +1,60 @@
'use strict';
var BaseService = require('./service');
var inherits = require('util').inherits;
var fs = require('fs');
var InsightUI = function(options) {
BaseService.call(this, options);
if (typeof options.apiPrefix !== 'undefined') {
this.apiPrefix = options.apiPrefix;
} else {
this.apiPrefix = 'insight-api-zcash';
}
if (typeof options.routePrefix !== 'undefined') {
this.routePrefix = options.routePrefix;
} else {
this.routePrefix = 'insight';
}
};
InsightUI.dependencies = ['insight-api-zcash'];
inherits(InsightUI, BaseService);
InsightUI.prototype.start = function(callback) {
this.indexFile = this.filterIndexHTML(fs.readFileSync(__dirname + '/../public/index.html', {encoding: 'utf8'}));
setImmediate(callback);
};
InsightUI.prototype.getRoutePrefix = function() {
return this.routePrefix;
};
InsightUI.prototype.setupRoutes = function(app, express) {
var self = this;
app.use('/', function(req, res, next){
if (req.headers.accept && req.headers.accept.indexOf('text/html') !== -1 &&
req.headers["X-Requested-With"] !== 'XMLHttpRequest'
) {
res.setHeader('Content-Type', 'text/html');
res.send(self.indexFile);
} else {
express.static(__dirname + '/../public')(req, res, next);
}
});
};
InsightUI.prototype.filterIndexHTML = function(data) {
var transformed = data
.replace(/apiPrefix = '\/api'/, "apiPrefix = '/" + this.apiPrefix + "'");
if (this.routePrefix) {
transformed = transformed.replace(/<base href=\"\/\"/, '<base href="/' + this.routePrefix + '/"');
}
return transformed;
};
module.exports = InsightUI;

View File

@ -0,0 +1,91 @@
'use strict';
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var Service = function(options) {
EventEmitter.call(this);
this.node = options.node;
this.name = options.name;
};
util.inherits(Service, EventEmitter);
/**
* Describes the dependencies that should be loaded before this service.
*/
Service.dependencies = [];
/**
* blockHandler
* @param {Block} block - the block being added or removed from the chain
* @param {Boolean} add - whether the block is being added or removed
* @param {Function} callback - call with the leveldb database operations to perform
*/
Service.prototype.blockHandler = function(block, add, callback) {
// implement in the child class
setImmediate(function() {
callback(null, []);
});
};
/**
* the bus events available for subscription
* @return {Array} an array of event info
*/
Service.prototype.getPublishEvents = function() {
// Example:
// return [
// ['eventname', this, this.subscribeEvent, this.unsubscribeEvent],
// ];
return [];
};
/**
* the API methods to expose
* @return {Array} return array of methods
*/
Service.prototype.getAPIMethods = function() {
// Example:
// return [
// ['getData', this, this.getData, 1]
// ];
return [];
};
// Example:
// Service.prototype.getData = function(arg1, callback) {
//
// };
/**
* Function which is called when module is first initialized
*/
Service.prototype.start = function(done) {
setImmediate(done);
};
/**
* Function to be called when bitcore-node is stopped
*/
Service.prototype.stop = function(done) {
setImmediate(done);
};
/**
* Setup express routes
* @param {Express} app
*/
Service.prototype.setupRoutes = function(app) {
// Setup express routes here
};
Service.prototype.getRoutePrefix = function() {
return this.name;
};
module.exports = Service;

View File

@ -2,16 +2,19 @@
"name": "Insight",
"version": "0.0.1",
"dependencies": {
"angular": "~1.2.13",
"angular-resource": "~1.2.13",
"angular-route": "~1.2.13",
"angular": "~1.5.8",
"angular-resource": "~1.5.8",
"angular-route": "~1.5.8",
"bootstrap": "~3.1.1",
"angular-bootstrap": "~0.10.0",
"angular-qrcode": "~3.1.0",
"angular-animate": "~1.2.13",
"momentjs": "~2.5.1",
"angular-animate": "~1.5.8",
"moment": "~2.10.6",
"zeroclipboard": "~1.3.2",
"ngprogress": "~1.0.4",
"angular-ui-utils": "~0.1.1"
"angular-ui-utils": "~0.1.1",
"angular-gettext": "~1.1.0",
"angular-moment": "1.0.0-beta.6",
"c3": "~0.4.11"
}
}

View File

@ -1,12 +1,8 @@
{
"name": "insight-bitcore",
"description": "An open-source frontend for the Insight API. The Insight API provides you with a convenient, powerful and simple way to query and broadcast data on the bitcoin network and build your own services with it.",
"version": "0.1.12",
"author": {
"name": "Ryan X Charles",
"email": "ryan@bitpay.com"
},
"repository": "git://github.com/bitpay/insight.git",
"name": "insight-ui-zcash",
"description": "An open-source frontend for the Insight API. The Insight API provides you with a convenient, powerful and simple way to query and broadcast data on the zcash network and build your own services with it.",
"version": "0.4.0",
"repository": "git://github.com/zcash-hackworks/insight-ui-zcash.git",
"contributors": [
{
"name": "Matias Alejo Garcia",
@ -27,26 +23,31 @@
{
"name": "Juan Ignacio Sosa Lopez",
"email": "bechilandia@gmail.com"
},
{
"name": "Jack Grigg",
"email": "jack@z.cash"
},
{
"name": "Simon Liu",
"email": "simon@z.cash"
}
],
"bugs": {
"url": "https://github.com/bitpay/insight/issues"
"url": "https://github.com/zcash/zcash/issues"
},
"homepage": "https://github.com/bitpay/insight",
"homepage": "https://github.com/zcash-hackworks/insight-ui-zcash",
"license": "MIT",
"keywords": [
"insight",
"blockchain",
"blockexplorer",
"bitcoin",
"zcash",
"bitcore",
"front-end"
],
"scripts": {
"start": "INSIGHT_PUBLIC_PATH=public node node_modules/.bin/insight-bitcore-api"
},
"bitcoreNode": "bitcore-node-zcash",
"dependencies": {
"insight-bitcore-api": "=0.1.12"
},
"devDependencies": {
"bower": "~1.2.8",
@ -58,6 +59,7 @@
"grunt-contrib-watch": "*",
"grunt-macreload": "*",
"grunt-css": "~0.5.4",
"grunt-markdown": "~0.5.0"
"grunt-markdown": "~0.5.0",
"grunt-angular-gettext": "^0.2.15"
}
}

474
po/de_DE.po Normal file
View File

@ -0,0 +1,474 @@
msgid ""
msgstr ""
"Project-Id-Version: Insight\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Sascha Dückers <s.dueckers@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: de_DE\n"
#: public/views/transaction/tx.html
msgid "(Input unconfirmed)"
msgstr "(Eingabe unbestätigt)"
#: public/views/404.html
msgid "404 Page not found :("
msgstr "404 Seite nicht gefunden :("
#: public/views/index.html
msgid ""
"<strong>insight</strong> is an <a href=\"http://live.insight.is/\" target="
"\"_blank\">open-source Zcash blockchain explorer</a> with complete REST "
"and websocket APIs that can be used for writing web wallets and other apps "
"that need more advanced blockchain queries than provided by zcashd RPC. "
"Check out the <a href=\"https://github.com/zcash-hackworks/insight-ui-zcash\" target=\"_blank"
"\">source code</a>."
msgstr ""
"<strong>insight</strong> ist ein <a href=\"http://live.insight.is/\" target="
"\"_blank\">Open Source Zcash Blockchain Explorer</a> mit vollständigen "
"REST und Websocket APIs um eigene Wallets oder Applikationen zu "
"implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain "
"ermöglicht, bei denen die RPC des Zcashd nicht mehr ausreichen. Der "
"aktuelle <a href=\"https://github.com/zcash-hackworks/insight-ui-zcash\" target=\"_blank"
"\">Quellcode</a> ist auf Github zu finden."
#: public/views/index.html
msgid ""
"<strong>insight</strong> is still in development, so be sure to report any "
"bugs and provide feedback for improvement at our <a href=\"https://github."
"com/bitpay/insight/issues\" target=\"_blank\">github issue tracker</a>."
msgstr ""
"<strong>insight</strong> befindet sich aktuell noch in der Entwicklung. "
"Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren "
"Verbesserung an unseren <a href=\"https://github.com/zcash/zcash/issues"
"\" target=\"_blank\">Github Issue Tracker</a>."
#: public/views/index.html
msgid "About"
msgstr "Über insight"
#: public/views/address.html
msgid "Address"
msgstr "Adresse"
#: public/views/index.html
msgid "Age"
msgstr "Alter"
#: public/views/status.html
msgid "Application Status"
msgstr "Programmstatus"
#: public/views/status.html
msgid "Best Block"
msgstr "Bester Block"
#: public/views/status.html
msgid "Zcash node information"
msgstr "Zcash-Node Info"
#: public/views/block.html
msgid "Block"
msgstr "Block"
#: public/views/block.html
msgid "Block Reward"
msgstr "Belohnung"
#: public/views/block_list.html public/views/dummy-translations.html
#: public/views/status.html
msgid "Blocks"
msgstr "Blöcke"
#: public/views/status.html
msgid "Bytes Serialized"
msgstr "Serialisierte Bytes"
#: public/views/includes/connection.html
msgid ""
"Can't connect to zcashd to get live updates from the p2p network. (Tried "
"connecting to zcashd at {{host}}:{{port}} and failed.)"
msgstr ""
"Es ist nicht möglich mit Zcashd zu verbinden um live Aktualisierungen vom "
"P2P Netzwerk zu erhalten. (Verbindungsversuch zu zcashd an {{host}}:"
"{{port}} ist fehlgeschlagen.)"
#: public/views/includes/connection.html
msgid "Can't connect to insight server. Attempting to reconnect..."
msgstr ""
"Keine Verbindung zum insight-Server möglich. Es wird versucht die "
"Verbindung neu aufzubauen..."
#: public/views/includes/connection.html
msgid "Can't connect to internet. Please, check your connection."
msgstr "Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen."
#: public/views/status.html
msgid "Complete"
msgstr "Vollständig"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Confirmations"
msgstr "Bestätigungen"
#: public/views/includes/header.html
msgid "Conn"
msgstr "Verbindungen"
#: public/views/status.html
msgid "Connections to other nodes"
msgstr "Verbindungen zu Nodes"
#: public/views/status.html
msgid "Current Blockchain Tip (insight)"
msgstr "Aktueller Blockchain Tip (insight)"
#: public/views/status.html
msgid "Current Sync Status"
msgstr "Aktueller Status"
#: public/views/transaction.html
msgid "Details"
msgstr "Details"
#: public/views/block.html
msgid "Difficulty"
msgstr "Schwierigkeit"
#: public/views/transaction/tx.html
msgid "Double spent attempt detected. From tx:"
msgstr "Es wurde ein \"double Spend\" Versuch erkannt.Von tx:"
#: public/views/includes/connection.html
msgid "Error!"
msgstr "Fehler!"
#: public/views/transaction/tx.html
msgid "Fee"
msgstr "Gebühr"
#: public/views/address.html
msgid "Final Balance"
msgstr "Schlussbilanz"
#: public/views/status.html
msgid "Finish Date"
msgstr "Fertigstellung"
#: public/views/404.html
msgid "Go to home"
msgstr "Zur Startseite"
#: public/views/status.html
msgid "Hash Serialized"
msgstr "Hash Serialisiert"
#: public/views/block.html public/views/block_list.html
#: public/views/index.html public/views/status.html
#: public/views/includes/header.html
msgid "Height"
msgstr "Höhe"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Included in Block"
msgstr "Eingefügt in Block"
#: public/views/transaction/tx.html
msgid "Incoherence in levelDB detected:"
msgstr "Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:"
#: public/views/status.html
msgid "Info Errors"
msgstr "Fehlerbeschreibung"
#: public/views/status.html
msgid "Initial Block Chain Height"
msgstr "Ursprüngliche Blockchain Höhe"
#: public/views/transaction.html
msgid "Input"
msgstr "Eingänge"
#: public/views/status.html
msgid "Last Block"
msgstr "Letzter Block"
#: public/views/status.html
msgid "Last Block Hash (Zcashd)"
msgstr "Letzter Hash (Zcashd)"
#: public/views/index.html
msgid "Latest Blocks"
msgstr "Letzte Blöcke"
#: public/views/index.html
msgid "Latest Transactions"
msgstr "Letzte Transaktionen"
#: public/views/address.html
msgid "Loading Address Information"
msgstr "Lade Adressinformationen"
#: public/views/block.html
msgid "Loading Block Information"
msgstr "Lade Blockinformation"
#: public/views/block_list.html
msgid "Loading Selected Date..."
msgstr "Lade gewähltes Datum..."
#: public/views/transaction.html
msgid "Loading Transaction Details"
msgstr "Lade Transaktionsdetails"
#: public/views/transaction/list.html
msgid "Loading Transactions..."
msgstr "Lade Transaktionen..."
#: public/views/includes/infoStatus.html
msgid "Loading..."
msgstr "Lade..."
#: public/views/transaction.html
msgid "Mined Time"
msgstr "Block gefunden (Mining)"
#: public/views/block.html public/views/block_list.html
#: public/views/index.html
msgid "Mined by"
msgstr "Gefunden von"
#: public/views/status.html
msgid "Mining Difficulty"
msgstr "Schwierigkeitgrad"
#: public/views/block.html
msgid "Next Block"
msgstr "Nächster Block"
#: public/views/transaction/tx.html
msgid "No Inputs (Newly Generated Coins)"
msgstr "Keine Eingänge (Neu generierte Coins)"
#: public/views/block_list.html
msgid "No blocks yet."
msgstr "Keine Blöcke bisher."
#: public/views/includes/header.html public/views/includes/search.html
msgid "No matching records found!"
msgstr "Keine passenden Einträge gefunden!"
#: public/views/address.html
msgid "No. Transactions"
msgstr "Anzahl Transaktionen"
#: public/views/block.html
msgid "Number Of Transactions"
msgstr "Anzahl der Transaktionen"
#: public/views/transaction.html
msgid "Output"
msgstr "Ausgänge"
#: public/views/index.html
msgid "Powered by"
msgstr "Powered by"
#: public/views/block.html
msgid "Previous Block"
msgstr "Letzter Block"
#: public/views/status.html
msgid "Protocol version"
msgstr "Protokollversion"
#: public/views/status.html
msgid "Proxy setting"
msgstr "Proxyeinstellung"
#: public/views/transaction.html
msgid "Received Time"
msgstr "Eingangszeitpunkt"
#: public/views/redirect.html
msgid "Redirecting..."
msgstr "Umleitung..."
#: public/views/includes/header.html
msgid "Search for block, transaction or address"
msgstr "Suche Block, Transaktion oder Adresse"
#: public/views/index.html
msgid "See all blocks"
msgstr "Alle Blöcke anzeigen"
#: public/views/status.html
msgid "Show Transaction Output data"
msgstr "Zeige Abgänge"
#: public/views/transaction/tx.html
msgid "Show all"
msgstr "Zeige Alles"
#: public/views/transaction/tx.html
msgid "Show input"
msgstr "Zeige Eingänge"
#: public/views/transaction/tx.html
msgid "Show less"
msgstr "Weniger anzeigen"
#: public/views/transaction/tx.html
msgid "Show more"
msgstr "Mehr anzeigen"
#: public/views/block_list.html public/views/index.html
#: public/views/transaction.html
msgid "Size"
msgstr "Größe"
#: public/views/block.html
msgid "Size (bytes)"
msgstr "Größe (bytes)"
#: public/views/status.html
msgid "Skipped Blocks (previously synced)"
msgstr "Verworfene Blöcke (bereits syncronisiert)"
#: public/views/status.html
msgid "Start Date"
msgstr "Startdatum"
#: public/views/dummy-translations.html
msgid "Status"
msgstr "Status"
#: public/views/block.html public/views/transaction.html
msgid "Summary"
msgstr "Zusammenfassung"
#: public/views/address.html
msgid "Summary <small>confirmed</small>"
msgstr "Zusammenfassung <small>bestätigt</small>"
#: public/views/status.html
msgid "Sync Progress"
msgstr "Fortschritt"
#: public/views/status.html
msgid "Sync Status"
msgstr "Syncronisation"
#: public/views/status.html
msgid "Sync Type"
msgstr "Art der Syncronisation"
#: public/views/status.html
msgid "Synced Blocks"
msgstr "Syncronisierte Blöcke"
#: public/views/status.html
msgid "Testnet"
msgstr "Testnet aktiv"
#: public/views/transaction/list.html
msgid "There are no transactions involving this address."
msgstr "Es gibt keine Transaktionen zu dieser Adressse"
#: public/views/status.html
msgid "Time Offset"
msgstr "Zeitoffset zu UTC"
#: public/views/block.html
msgid "Timestamp"
msgstr "Zeitstempel"
#: public/views/block_list.html
msgid "Today"
msgstr "Heute"
#: public/views/status.html
msgid "Total Amount"
msgstr "Gesamtsumme"
#: public/views/address.html
msgid "Total Received"
msgstr "Insgesamt empfangen"
#: public/views/address.html
msgid "Total Sent"
msgstr "Insgesamt gesendet"
#: public/views/transaction.html
msgid "Transaction"
msgstr "Transaktion"
#: public/views/status.html
msgid "Transaction Output Set Information"
msgstr "Transaktions Abgänge"
#: public/views/status.html
msgid "Transaction Outputs"
msgstr "Abgänge"
#: public/views/address.html public/views/block.html
#: public/views/block_list.html public/views/index.html
#: public/views/status.html
msgid "Transactions"
msgstr "Transaktionen"
#: public/views/transaction/tx.html
msgid "Type"
msgstr "Typ"
#: public/views/address.html
msgid "Unconfirmed"
msgstr "Unbestätigt"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Unconfirmed Transaction!"
msgstr "Unbestätigte Transaktion!"
#: public/views/address.html
msgid "Unconfirmed Txs Balance"
msgstr "Unbestätigtes Guthaben"
#: public/views/index.html
msgid "Value Out"
msgstr "Wert"
#: public/views/block.html public/views/status.html
msgid "Version"
msgstr "Version"
#: public/views/block_list.html public/views/index.html
msgid "Waiting for blocks..."
msgstr "Warte auf Blöcke..."
#: public/views/index.html
msgid "Waiting for transactions..."
msgstr "Warte auf Transaktionen..."
#: public/views/block_list.html
msgid "by date."
msgstr "nach Datum."
#: public/views/transaction/tx.html
msgid "first seen at"
msgstr "zuerst gesehen am"
#: public/views/transaction/tx.html
msgid "mined"
msgstr "gefunden"
#: public/views/block_list.html
msgid "mined on:"
msgstr "vom:"
msgid "Waiting for blocks"
msgstr "Warte auf Blöcke"

470
po/es.po Normal file
View File

@ -0,0 +1,470 @@
msgid ""
msgstr ""
"Project-Id-Version: Insight\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: public/views/transaction/tx.html
msgid "(Input unconfirmed)"
msgstr "(Entrada sin confirmar)"
#: public/views/404.html
msgid "404 Page not found :("
msgstr "404 Página no encontrada :("
#: public/views/index.html
msgid ""
"<strong>insight</strong> is an <a href=\"http://live.insight.is/\" target="
"\"_blank\">open-source Zcash blockchain explorer</a> with complete REST "
"and websocket APIs that can be used for writing web wallets and other apps "
"that need more advanced blockchain queries than provided by zcashd RPC. "
"Check out the <a href=\"https://github.com/zcash-hackworks/insight-ui-zcash\" target=\"_blank"
"\">source code</a>."
msgstr ""
"<strong>insight</strong> es un <a href=\"http://live.insight.is/\" target="
"\"_blank\">explorador de bloques de Zcash open-source</a> con un completo "
"conjunto de REST y APIs de websockets que pueden ser usadas para escribir "
"monederos de Zcashs y otras aplicaciones que requieran consultar un "
"explorador de bloques. Obtén el código en <a href=\"http://github.com/"
"bitpay/insight\" target=\"_blank\">el repositorio abierto de Github</a>."
#: public/views/index.html
msgid ""
"<strong>insight</strong> is still in development, so be sure to report any "
"bugs and provide feedback for improvement at our <a href=\"https://github."
"com/bitpay/insight/issues\" target=\"_blank\">github issue tracker</a>."
msgstr ""
"<strong>insight</strong> esta en desarrollo aún, por ello agradecemos que "
"nos reporten errores o sugerencias para mejorar el software. <a href="
"\"https://github.com/zcash/zcash/issues\" target=\"_blank\">Github issue "
"tracker</a>."
#: public/views/index.html
msgid "About"
msgstr "Acerca de"
#: public/views/address.html
msgid "Address"
msgstr "Dirección"
#: public/views/index.html
msgid "Age"
msgstr "Edad"
#: public/views/status.html
msgid "Application Status"
msgstr "Estado de la Aplicación"
#: public/views/status.html
msgid "Best Block"
msgstr "Mejor Bloque"
#: public/views/status.html
msgid "Zcash node information"
msgstr "Información del nodo Zcash"
#: public/views/block.html
msgid "Block"
msgstr "Bloque"
#: public/views/block.html
msgid "Block Reward"
msgstr "Bloque Recompensa"
#: public/views/block_list.html public/views/dummy-translations.html
#: public/views/status.html
msgid "Blocks"
msgstr "Bloques"
#: public/views/status.html
msgid "Bytes Serialized"
msgstr "Bytes Serializados"
#: public/views/includes/connection.html
msgid ""
"Can't connect to zcashd to get live updates from the p2p network. (Tried "
"connecting to zcashd at {{host}}:{{port}} and failed.)"
msgstr ""
"No se pudo conectar a zcashd para obtener actualizaciones en vivo de la "
"red p2p. (Se intentó conectar a zcashd de {{host}}:{{port}} y falló.)"
#: public/views/includes/connection.html
msgid "Can't connect to insight server. Attempting to reconnect..."
msgstr "No se pudo conectar al servidor insight. Intentando re-conectar..."
#: public/views/includes/connection.html
msgid "Can't connect to internet. Please, check your connection."
msgstr "No se pudo conectar a Internet. Por favor, verifique su conexión."
#: public/views/status.html
msgid "Complete"
msgstr "Completado"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Confirmations"
msgstr "Confirmaciones"
#: public/views/includes/header.html
msgid "Conn"
msgstr "Con"
#: public/views/status.html
msgid "Connections to other nodes"
msgstr "Conexiones a otros nodos"
#: public/views/status.html
msgid "Current Blockchain Tip (insight)"
msgstr "Actual Blockchain Tip (insight)"
#: public/views/status.html
msgid "Current Sync Status"
msgstr "Actual Estado de Sincronización"
#: public/views/transaction.html
msgid "Details"
msgstr "Detalles"
#: public/views/block.html
msgid "Difficulty"
msgstr "Dificultad"
#: public/views/transaction/tx.html
msgid "Double spent attempt detected. From tx:"
msgstr "Intento de doble gasto detectado. De la transacción:"
#: public/views/includes/connection.html
msgid "Error!"
msgstr "¡Error!"
#: public/views/transaction/tx.html
msgid "Fee"
msgstr "Tasa"
#: public/views/address.html
msgid "Final Balance"
msgstr "Balance Final"
#: public/views/status.html
msgid "Finish Date"
msgstr "Fecha Final"
#: public/views/404.html
msgid "Go to home"
msgstr "Volver al Inicio"
#: public/views/status.html
msgid "Hash Serialized"
msgstr "Hash Serializado"
#: public/views/block.html public/views/block_list.html
#: public/views/index.html public/views/status.html
#: public/views/includes/header.html
msgid "Height"
msgstr "Altura"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Included in Block"
msgstr "Incluido en el Bloque"
#: public/views/transaction/tx.html
msgid "Incoherence in levelDB detected:"
msgstr "Detectada una incoherencia en levelDB:"
#: public/views/status.html
msgid "Info Errors"
msgstr "Errores de Información"
#: public/views/status.html
msgid "Initial Block Chain Height"
msgstr "Altura de la Cadena en Bloque Inicial"
#: public/views/transaction.html
msgid "Input"
msgstr "Entrada"
#: public/views/status.html
msgid "Last Block"
msgstr "Último Bloque"
#: public/views/status.html
msgid "Last Block Hash (Zcashd)"
msgstr "Último Bloque Hash (Zcashd)"
#: public/views/index.html
msgid "Latest Blocks"
msgstr "Últimos Bloques"
#: public/views/index.html
msgid "Latest Transactions"
msgstr "Últimas Transacciones"
#: public/views/address.html
msgid "Loading Address Information"
msgstr "Cargando Información de la Dirección"
#: public/views/block.html
msgid "Loading Block Information"
msgstr "Cargando Información del Bloque"
#: public/views/block_list.html
msgid "Loading Selected Date..."
msgstr "Cargando Fecha Seleccionada..."
#: public/views/transaction.html
msgid "Loading Transaction Details"
msgstr "Cargando Detalles de la Transacción"
#: public/views/transaction/list.html
msgid "Loading Transactions..."
msgstr "Cargando Transacciones..."
#: public/views/includes/infoStatus.html
msgid "Loading..."
msgstr "Cargando..."
#: public/views/transaction.html
msgid "Mined Time"
msgstr "Hora de Minado"
#: public/views/block.html public/views/block_list.html
#: public/views/index.html
msgid "Mined by"
msgstr "Minado por"
#: public/views/status.html
msgid "Mining Difficulty"
msgstr "Dificultad de Minado"
#: public/views/block.html
msgid "Next Block"
msgstr "Próximo Bloque"
#: public/views/transaction/tx.html
msgid "No Inputs (Newly Generated Coins)"
msgstr "Sin Entradas (Monedas Recién Generadas)"
#: public/views/block_list.html
msgid "No blocks yet."
msgstr "No hay bloques aún."
#: public/views/includes/header.html public/views/includes/search.html
msgid "No matching records found!"
msgstr "¡No se encontraron registros coincidentes!"
#: public/views/address.html
msgid "No. Transactions"
msgstr "Nro. de Transacciones"
#: public/views/block.html
msgid "Number Of Transactions"
msgstr "Número de Transacciones"
#: public/views/transaction.html
msgid "Output"
msgstr "Salida"
#: public/views/index.html
msgid "Powered by"
msgstr "Funciona con"
#: public/views/block.html
msgid "Previous Block"
msgstr "Bloque Anterior"
#: public/views/status.html
msgid "Protocol version"
msgstr "Versión del protocolo"
#: public/views/status.html
msgid "Proxy setting"
msgstr "Opción de proxy"
#: public/views/transaction.html
msgid "Received Time"
msgstr "Hora de Recibido"
#: public/views/redirect.html
msgid "Redirecting..."
msgstr "Redireccionando..."
#: public/views/includes/header.html
msgid "Search for block, transaction or address"
msgstr "Buscar bloques, transacciones o direcciones"
#: public/views/index.html
msgid "See all blocks"
msgstr "Ver todos los bloques"
#: public/views/status.html
msgid "Show Transaction Output data"
msgstr "Mostrar dato de Salida de la Transacción"
#: public/views/transaction/tx.html
msgid "Show all"
msgstr "Mostrar todos"
#: public/views/transaction/tx.html
msgid "Show input"
msgstr "Mostrar entrada"
#: public/views/transaction/tx.html
msgid "Show less"
msgstr "Ver menos"
#: public/views/transaction/tx.html
msgid "Show more"
msgstr "Ver más"
#: public/views/block_list.html public/views/index.html
#: public/views/transaction.html
msgid "Size"
msgstr "Tamaño"
#: public/views/block.html
msgid "Size (bytes)"
msgstr "Tamaño (bytes)"
#: public/views/status.html
msgid "Skipped Blocks (previously synced)"
msgstr "Bloques Saltados (previamente sincronizado)"
#: public/views/status.html
msgid "Start Date"
msgstr "Fecha de Inicio"
#: public/views/dummy-translations.html
msgid "Status"
msgstr "Estado"
#: public/views/block.html public/views/transaction.html
msgid "Summary"
msgstr "Resumen"
#: public/views/address.html
msgid "Summary <small>confirmed</small>"
msgstr "Resumen <small>confirmados</small>"
#: public/views/status.html
msgid "Sync Progress"
msgstr "Proceso de Sincronización"
#: public/views/status.html
msgid "Sync Status"
msgstr "Estado de Sincronización"
#: public/views/status.html
msgid "Sync Type"
msgstr "Tipo de Sincronización"
#: public/views/status.html
msgid "Synced Blocks"
msgstr "Bloques Sincornizados"
#: public/views/status.html
msgid "Testnet"
msgstr "Red de prueba"
#: public/views/transaction/list.html
msgid "There are no transactions involving this address."
msgstr "No hay transacciones para esta dirección"
#: public/views/status.html
msgid "Time Offset"
msgstr "Desplazamiento de hora"
#: public/views/block.html
msgid "Timestamp"
msgstr "Fecha y hora"
#: public/views/block_list.html
msgid "Today"
msgstr "Hoy"
#: public/views/status.html
msgid "Total Amount"
msgstr "Cantidad Total"
#: public/views/address.html
msgid "Total Received"
msgstr "Total Recibido"
#: public/views/address.html
msgid "Total Sent"
msgstr "Total Enviado"
#: public/views/transaction.html
msgid "Transaction"
msgstr "Transacción"
#: public/views/status.html
msgid "Transaction Output Set Information"
msgstr "Información del Conjunto de Salida de la Transacción"
#: public/views/status.html
msgid "Transaction Outputs"
msgstr "Salidas de la Transacción"
#: public/views/address.html public/views/block.html
#: public/views/block_list.html public/views/index.html
#: public/views/status.html
msgid "Transactions"
msgstr "Transacciones"
#: public/views/transaction/tx.html
msgid "Type"
msgstr "Tipo"
#: public/views/address.html
msgid "Unconfirmed"
msgstr "Sin confirmar"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Unconfirmed Transaction!"
msgstr "¡Transacción sin confirmar!"
#: public/views/address.html
msgid "Unconfirmed Txs Balance"
msgstr "Balance sin confirmar"
#: public/views/index.html
msgid "Value Out"
msgstr "Valor de Salida"
#: public/views/block.html public/views/status.html
msgid "Version"
msgstr "Versión"
#: public/views/block_list.html public/views/index.html
msgid "Waiting for blocks..."
msgstr "Esperando bloques..."
#: public/views/index.html
msgid "Waiting for transactions..."
msgstr "Esperando transacciones..."
#: public/views/block_list.html
msgid "by date."
msgstr "por fecha."
#: public/views/transaction/tx.html
msgid "first seen at"
msgstr "Visto a"
#: public/views/transaction/tx.html
msgid "mined"
msgstr "minado"
#: public/views/block_list.html
msgid "mined on:"
msgstr "minado el:"
#~ msgid "Waiting for blocks"
#~ msgstr "Esperando bloques"

617
po/ja.po Normal file
View File

@ -0,0 +1,617 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Vis Virial <visvirial@gmail.com>\n"
"Language-Team: \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"
#: public/views/transaction/tx.html
msgid "(Input unconfirmed)"
msgstr "(入力は未検証です)"
#: public/views/404.html
msgid "404 Page not found :("
msgstr "404 ページがみつかりません (´・ω・`)"
#: public/views/index.html
msgid ""
"<strong>insight</strong> is an <a href=\"http://live.insight.is/\" target="
"\"_blank\">open-source Zcash blockchain explorer</a> with complete REST "
"and websocket APIs that can be used for writing web wallets and other apps "
"that need more advanced blockchain queries than provided by zcashd RPC. "
"Check out the <a href=\"https://github.com/zcash-hackworks/insight-ui-zcash\" target=\"_blank"
"\">source code</a>."
msgstr ""
"<strong>insight</strong>は、zcashd RPCの提供するものよりも詳細なブロック"
"チェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに"
"使える、完全なRESTおよびwebsocket APIを備えた<a href=\"http://live.insight."
"is/\" target=\"_blank\">オープンソースのビットコインブロックエクスプローラ</"
"a>です。<a href=\"https://github.com/zcash-hackworks/insight-ui-zcash\" target=\"_blank\">ソース"
"コード</a>を確認"
#: public/views/index.html
msgid ""
"<strong>insight</strong> is still in development, so be sure to report any "
"bugs and provide feedback for improvement at our <a href=\"https://github."
"com/bitpay/insight/issues\" target=\"_blank\">github issue tracker</a>."
msgstr ""
"<strong>insight</strong>は現在開発中です。<a href=\"https://github.com/"
"bitpay/insight/issues\" target=\"_blank\">githubのissueトラッカ</a>にてバグの"
"報告や改善案の提案をお願いします。"
#: public/views/index.html
msgid "About"
msgstr "はじめに"
#: public/views/address.html public/views/messages_verify.html
msgid "Address"
msgstr "アドレス"
#: public/views/index.html
msgid "Age"
msgstr "生成後経過時間"
#: public/views/messages_verify.html
msgid "An error occured in the verification process."
msgstr "検証過程でエラーが発生しました。"
#: public/views/transaction_sendraw.html
msgid "An error occured:<br>{{error}}"
msgstr "エラーが発生しました:<br>{{error}}"
#: public/views/status.html
msgid "Application Status"
msgstr "アプリケーションの状態"
#: public/views/status.html
msgid "Best Block"
msgstr "最良ブロック"
#: public/views/messages_verify.html
msgid "Zcash comes with a way of signing arbitrary messages."
msgstr "Zcashには任意のメッセージを署名する昨日が備わっています。"
#: public/views/status.html
msgid "Zcash node information"
msgstr "Zcashード情報"
#: public/views/block.html
msgid "Block"
msgstr "ブロック"
#: public/views/block.html
msgid "Block Reward"
msgstr "ブロック報酬"
#: public/views/block_list.html public/views/dummy-translations.html
#: public/views/status.html
msgid "Blocks"
msgstr "ブロック"
#: public/views/transaction_sendraw.html
msgid "Broadcast Raw Transaction"
msgstr "生のトランザクションを配信"
#: public/views/status.html
msgid "Bytes Serialized"
msgstr "シリアライズ後の容量 (バイト)"
#: public/views/includes/connection.html
msgid ""
"Can't connect to zcashd to get live updates from the p2p network. (Tried "
"connecting to zcashd at {{host}}:{{port}} and failed.)"
msgstr ""
"P2Pネットワークからライブ情報を取得するためにzcashdへ接続することができませ"
"んでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)"
#: public/views/includes/connection.html
msgid "Can't connect to insight server. Attempting to reconnect..."
msgstr "insight サーバに接続できません。再接続しています..."
#: public/views/includes/connection.html
msgid "Can't connect to internet. Please, check your connection."
msgstr "インターネットに接続できません。コネクションを確認してください。"
#: public/views/status.html
msgid "Complete"
msgstr "完了"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Confirmations"
msgstr "検証数"
#: public/views/includes/header.html
msgid "Conn"
msgstr "接続数"
#: public/views/status.html
msgid "Connections to other nodes"
msgstr "他ノードへの接続"
#: public/views/status.html
msgid "Current Blockchain Tip (insight)"
msgstr "現在のブロックチェインのTip (insight)"
#: public/views/status.html
msgid "Current Sync Status"
msgstr "現在の同期状況"
#: public/views/transaction.html
msgid "Details"
msgstr "詳細"
#: public/views/block.html
msgid "Difficulty"
msgstr "難易度"
#: public/views/transaction/tx.html
msgid "Double spent attempt detected. From tx:"
msgstr "二重支払い攻撃をこのトランザクションから検知しました:"
#: public/views/messages_verify.html
msgid "Error message:"
msgstr "エラーメッセージ:"
#: public/views/includes/connection.html
msgid "Error!"
msgstr "エラー!"
#: public/views/transaction/tx.html
msgid "Fee"
msgstr "手数料"
#: public/views/address.html
msgid "Final Balance"
msgstr "最終残高"
#: public/views/status.html
msgid "Finish Date"
msgstr "終了日時"
#: public/views/404.html
msgid "Go to home"
msgstr "ホームへ"
#: public/views/status.html
msgid "Hash Serialized"
msgstr "シリアライズデータのハッシュ値"
#: public/views/block.html public/views/block_list.html
#: public/views/index.html public/views/status.html
#: public/views/includes/header.html
msgid "Height"
msgstr "ブロック高"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Included in Block"
msgstr "取り込まれたブロック"
#: public/views/transaction/tx.html
msgid "Incoherence in levelDB detected:"
msgstr "levelDBの破損を検知しました:"
#: public/views/status.html
msgid "Info Errors"
msgstr "エラー情報"
#: public/views/status.html
msgid "Initial Block Chain Height"
msgstr "起動時のブロック高"
#: public/views/transaction.html
msgid "Input"
msgstr "入力"
#: public/views/status.html
msgid "Last Block"
msgstr "直前のブロック"
#: public/views/status.html
msgid "Last Block Hash (Zcashd)"
msgstr "直前のブロックのハッシュ値 (Zcashd)"
#: public/views/index.html
msgid "Latest Blocks"
msgstr "最新のブロック"
#: public/views/index.html
msgid "Latest Transactions"
msgstr "最新のトランザクション"
#: public/views/address.html
msgid "Loading Address Information"
msgstr "アドレス情報を読み込んでいます"
#: public/views/block.html
msgid "Loading Block Information"
msgstr "ブロック情報を読み込んでいます"
#: public/views/block_list.html
msgid "Loading Selected Date..."
msgstr "選択されたデータを読み込んでいます..."
#: public/views/transaction.html
msgid "Loading Transaction Details"
msgstr "トランザクションの詳細を読み込んでいます"
#: public/views/transaction/list.html
msgid "Loading Transactions..."
msgstr "トランザクションを読み込んでいます..."
#: public/views/messages_verify.html public/views/transaction_sendraw.html
#: public/views/includes/infoStatus.html
msgid "Loading..."
msgstr "ロード中..."
#: public/views/messages_verify.html
msgid "Message"
msgstr "メッセージ"
#: public/views/transaction.html
msgid "Mined Time"
msgstr "採掘時刻"
#: public/views/block.html public/views/block_list.html
#: public/views/index.html
msgid "Mined by"
msgstr "採掘者"
#: public/views/status.html
msgid "Mining Difficulty"
msgstr "採掘難易度"
#: public/views/block.html
msgid "Next Block"
msgstr "次のブロック"
#: public/views/transaction/tx.html
msgid "No Inputs (Newly Generated Coins)"
msgstr "入力なし (新しく生成されたコイン)"
#: public/views/block_list.html
msgid "No blocks yet."
msgstr "ブロックはありません。"
#: public/views/includes/search.html
msgid "No matching records found!"
msgstr "一致するレコードはありません!"
#: public/views/address.html
msgid "No. Transactions"
msgstr "トランザクション数"
#: public/views/block.html
msgid "Number Of Transactions"
msgstr "トランザクション数"
#: public/views/transaction.html
msgid "Output"
msgstr "出力"
#: public/views/index.html
msgid "Powered by"
msgstr "Powered by"
#: public/views/block.html
msgid "Previous Block"
msgstr "前のブロック"
#: public/views/status.html
msgid "Protocol version"
msgstr "プロトコルバージョン"
#: public/views/status.html
msgid "Proxy setting"
msgstr "プロキシ設定"
#: public/views/transaction_sendraw.html
msgid "Raw transaction data"
msgstr "トランザクションの生データ"
#: public/views/transaction_sendraw.html
msgid "Raw transaction data must be a valid hexadecimal string."
msgstr "生のトランザクションデータは有効な16進数でなければいけません。"
#: public/views/transaction.html
msgid "Received Time"
msgstr "受信時刻"
#: public/views/redirect.html
msgid "Redirecting..."
msgstr "リダイレクトしています..."
#: public/views/includes/search.html
msgid "Search for block, transaction or address"
msgstr "ブロック、トランザクション、アドレスを検索"
#: public/views/index.html
msgid "See all blocks"
msgstr "すべてのブロックをみる"
#: public/views/transaction_sendraw.html
msgid "Send transaction"
msgstr "トランザクションを送信"
#: public/views/status.html
msgid "Show Transaction Output data"
msgstr "トランザクションの出力データをみる"
#: public/views/transaction/tx.html
msgid "Show all"
msgstr "すべて表示"
#: public/views/transaction/tx.html
msgid "Show input"
msgstr "入力を表示"
#: public/views/transaction/tx.html
msgid "Show less"
msgstr "隠す"
#: public/views/transaction/tx.html
msgid "Show more"
msgstr "表示する"
#: public/views/messages_verify.html
msgid "Signature"
msgstr "署名"
#: public/views/block_list.html public/views/index.html
#: public/views/transaction.html
msgid "Size"
msgstr "サイズ"
#: public/views/block.html
msgid "Size (bytes)"
msgstr "サイズ (バイト)"
#: public/views/status.html
msgid "Skipped Blocks (previously synced)"
msgstr "スキップされたブロック (同期済み)"
#: public/views/status.html
msgid "Start Date"
msgstr "開始日時"
#: public/views/dummy-translations.html
msgid "Status"
msgstr "ステータス"
#: public/views/block.html public/views/transaction.html
msgid "Summary"
msgstr "概要"
#: public/views/address.html
msgid "Summary <small>confirmed</small>"
msgstr "サマリ <small>検証済み</small>"
#: public/views/status.html
msgid "Sync Progress"
msgstr "同期の進捗状況"
#: public/views/status.html
msgid "Sync Status"
msgstr "同期ステータス"
#: public/views/status.html
msgid "Sync Type"
msgstr "同期タイプ"
#: public/views/status.html
msgid "Synced Blocks"
msgstr "同期されたブロック数"
#: public/views/status.html
msgid "Testnet"
msgstr "テストネット"
#: public/views/messages_verify.html
msgid "The message failed to verify."
msgstr "メッセージの検証に失敗しました。"
#: public/views/messages_verify.html
msgid "The message is verifiably from {{verification.address}}."
msgstr "メッセージは{{verification.address}}により検証されました。"
#: public/views/transaction/list.html
msgid "There are no transactions involving this address."
msgstr "このアドレスに対するトランザクションはありません。"
#: public/views/transaction_sendraw.html
msgid ""
"This form can be used to broadcast a raw transaction in hex format over\n"
" the Zcash network."
msgstr ""
"このフォームでは、16進数フォーマットの生のトランザクションをZcashネットワー"
"ク上に配信することができます。"
#: public/views/messages_verify.html
msgid ""
"This form can be used to verify that a message comes from\n"
" a specific Zcash address."
msgstr ""
"このフォームでは、メッセージが特定のZcashアドレスから来たかどうかを検証する"
"ことができます。"
#: public/views/status.html
msgid "Time Offset"
msgstr "時間オフセット"
#: public/views/block.html public/views/block_list.html
msgid "Timestamp"
msgstr "タイムスタンプ"
#: public/views/block_list.html
msgid "Today"
msgstr "今日"
#: public/views/status.html
msgid "Total Amount"
msgstr "Zcash総量"
#: public/views/address.html
msgid "Total Received"
msgstr "総入金額"
#: public/views/address.html
msgid "Total Sent"
msgstr "総送金額"
#: public/views/transaction.html
msgid "Transaction"
msgstr "トランザクション"
#: public/views/status.html
msgid "Transaction Output Set Information"
msgstr "トランザクションの出力セット情報"
#: public/views/status.html
msgid "Transaction Outputs"
msgstr "トランザクションの出力"
#: public/views/transaction_sendraw.html
msgid "Transaction succesfully broadcast.<br>Transaction id: {{txid}}"
msgstr "トランザクションの配信に成功しました。<br>トランザクションID: {{txid}}"
#: public/views/address.html public/views/block.html
#: public/views/block_list.html public/views/index.html
#: public/views/status.html
msgid "Transactions"
msgstr "トランザクション"
#: public/views/transaction/tx.html
msgid "Type"
msgstr "タイプ"
#: public/views/address.html
msgid "Unconfirmed"
msgstr "未検証"
#: public/views/transaction.html public/views/transaction/tx.html
msgid "Unconfirmed Transaction!"
msgstr "未検証のトランザクションです!"
#: public/views/address.html
msgid "Unconfirmed Txs Balance"
msgstr "未検証トランザクションの残高"
#: public/views/index.html
msgid "Value Out"
msgstr "出力値"
#: public/views/messages_verify.html
msgid "Verify"
msgstr "検証"
#: public/views/messages_verify.html
msgid "Verify signed message"
msgstr "署名済みメッセージを検証"
#: public/views/block.html public/views/status.html
msgid "Version"
msgstr "バージョン"
#: public/views/block_list.html public/views/index.html
msgid "Waiting for blocks..."
msgstr "ブロックを待っています..."
#: public/views/index.html
msgid "Waiting for transactions..."
msgstr "トランザクションを待っています..."
#: public/views/block_list.html
msgid "by date."
msgstr "日毎。"
#: public/views/transaction/tx.html
msgid "first seen at"
msgstr "最初に発見された日時"
#: public/views/transaction/tx.html
msgid "mined"
msgstr "採掘された"
#: public/views/block_list.html
msgid "mined on:"
msgstr "採掘日時:"
#~ msgid "(Mainchain)"
#~ msgstr "(メインチェーン)"
#~ msgid "(Orphaned)"
#~ msgstr "(孤立したブロック)"
#~ msgid "Bits"
#~ msgstr "Bits"
#~ msgid "Block #{{block.height}}"
#~ msgstr "ブロック #{{block.height}}"
#~ msgid "BlockHash"
#~ msgstr "ブロックのハッシュ値"
#~ msgid "Blocks <br> mined on:"
#~ msgstr "ブロック <br> 採掘日"
#~ msgid "Coinbase"
#~ msgstr "コインベース"
#~ msgid "Hash"
#~ msgstr "ハッシュ値"
#~ msgid "LockTime"
#~ msgstr "ロック時間"
#~ msgid "Merkle Root"
#~ msgstr "Merkleルート"
#~ msgid "Nonce"
#~ msgstr "Nonce"
#~ msgid "Ooops!"
#~ msgstr "おぉっと!"
#~ msgid "Output is spent"
#~ msgstr "出力は使用済みです"
#~ msgid "Output is unspent"
#~ msgstr "出力は未使用です"
#~ msgid "Scan"
#~ msgstr "スキャン"
#~ msgid "Show/Hide items details"
#~ msgstr "アイテムの詳細を表示または隠す"
#~ msgid "Waiting for blocks"
#~ msgstr "ブロックを待っています"
#~ msgid "by date. {{detail}} {{before}}"
#~ msgstr "日時順 {{detail}} {{before}}"
#~ msgid "scriptSig"
#~ msgstr "scriptSig"
#~ msgid "{{tx.confirmations}} Confirmations"
#~ msgstr "{{tx.confirmations}} 検証"
#~ msgid "<span class=\"glyphicon glyphicon-warning-sign\"></span> (Orphaned)"
#~ msgstr ""
#~ "<span class=\"glyphicon glyphicon-warning-sign\"></span> (孤立したブロッ"
#~ "ク)"
#~ msgid ""
#~ "<span class=\"glyphicon glyphicon-warning-sign\"></span> Incoherence in "
#~ "levelDB detected: {{vin.dbError}}"
#~ msgstr ""
#~ "<span class=\"glyphicon glyphicon-warning-sign\"></span> Incoherence in "
#~ "levelDB detected: {{vin.dbError}}"
#~ msgid "Waiting for blocks <span class=\"loader-gif\"></span>"
#~ msgstr "ブロックを待っています <span class=\"loader-gif\"></span>"

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 723 B

29
public/img/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,18 +1,21 @@
<!doctype html>
<html lang="en" data-ng-app="insight" data-ng-csp>
<head>
<base href="/" />
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="fragment" content="!">
<title data-ng-bind="$root.title + $root.titleDetail + ' | Insight'">Insight</title>
<meta name="keywords" content="bitcoins, transactions, blocks, address, block chain, best block, mining difficulty, hash serialized">
<meta name="description" content="Bitcoin Insight. View detailed information on all bitcoin transactions and block. {{ $root.title + $root.titleDetail }}">
<link rel="shortcut icon" href="/img/icons/favicon.ico" type="image/x-icon">
<title data-ng-if="currency.testnet" data-ng-bind="$root.title + $root.titleDetail + ' | Testnet Insight'">Testnet Insight</title>
<title data-ng-if="!currency.testnet" data-ng-bind="$root.title + $root.titleDetail + ' | Insight'">Insight</title>
<meta name="keywords" content="zcash, transactions, blocks, address, block chain, best block, mining difficulty, hash serialized">
<meta data-ng-if="currency.testnet" name="description" content="Zcash Insight. View detailed information on all testnet zcash transactions and block. {{ $root.title + $root.titleDetail }}">
<meta data-ng-if="!currency.testnet" name="description" content="Zcash Insight. View detailed information on all zcash transactions and block. {{ $root.title + $root.titleDetail }}">
<link rel="shortcut icon" href="img/icons/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700,400italic">
<link rel="stylesheet" href="/css/main.min.css">
<link rel="stylesheet" href="css/main.min.css">
</head>
<body>
<body ng-cloak class="ng-cloak">
<div>
<script type="text/ng-template" id="scannerModal.html">
<div class="modal-header">
@ -39,17 +42,36 @@
</script>
</div>
<div id="wrap">
<div class="navbar navbar-default navbar-fixed-top" data-ng-include="'/views/includes/header.html'" role='navigation'></div>
<div class="navbar navbar-default navbar-fixed-top" data-ng-include="'views/includes/header.html'" role='navigation'></div>
<section class="container" data-ng-view></section>
</div>
<div id="footer" role="navigation">
<div class="container" data-ng-controller="FooterController">
<a class="insight m10v pull-right" href="/">insight <small>API v{{version}}</small></a>
<div class="links m20t pull-left">
<span class="languages" ng-show="availableLanguages.length > 0">
[
<a href="#"
ng-click="setLanguage(l.isoCode)"
ng-class="{'selected': defaultLanguage == l.isoCode}"
ng-repeat="l in availableLanguages">
<span ng-show="!$first"> &middot; </span> {{l.name}}
</a>
]
</span>
&nbsp;
[
<a href="messages/verify" translate>verify message</a>
<span> &middot; </span>
<a href="tx/send" translate>broadcast transaction</a>
]
</div>
<a class="insight m10v pull-right" target="_blank" href="http://insight.is">insight <small>API v{{version}}</small></a>
</div>
</div>
<script language="javascript">window.apiPrefix = '/api';</script>
<script src="/socket.io/socket.io.js"></script>
<script src="/js/vendors.min.js"></script>
<script src="/js/angularjs-all.min.js"></script>
<script src="/js/main.min.js"></script>
<script src="js/vendors.min.js"></script>
<script src="js/angularjs-all.min.js"></script>
<script src="js/main.min.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
public/robots.txt Normal file
View File

@ -0,0 +1,4 @@
User-agent: *
Disallow: /address
Disallow: /api
Disallow: /transaction

View File

@ -89,6 +89,7 @@ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
.m50v { margin: 50px 0; }
.m10b { margin-bottom: 10px; }
.m10l { margin-left: 10px; }
.m20t { margin-top: 20px; }
.vm { vertical-align: middle; }
.pa {position: absolute;}
.pr {position: relative;}
@ -122,8 +123,8 @@ margin-left: 0;
.navbar-default .navbar-nav>li>a {
color: #F4FBE8;
font-family: 'Ubuntu', sans-serif;
padding-left: 25px;
padding-right: 25px;
padding-left: 20px;
padding-right: 20px;
}
.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus {
@ -140,25 +141,9 @@ margin-left: 0;
}
.navbar-form {
/*width: 35%;*/
margin-top: 15px;
}
@media (max-width: 991px) {
.status {
display: none;
}
}
@media (max-width: 767px) {
.navbar-form {
width: auto;
}
.status {
display: none;
}
}
.nav-tabs.nav-justified>li>a:hover {
cursor: pointer;
}
@ -198,19 +183,26 @@ margin-left: 0;
#search-form { color: #fff; }
#search { font-family: 'Ubuntu', sans-serif; }
#search.loading {
background-image: url('/img/loading.gif');
background-image: url('../img/loading.gif');
background-position: 5px center;
background-repeat: no-repeat;
padding-left: 25px;
}
.loader-gif {
display: inline-block;
width: 16px;
height: 11px;
background: transparent url(../img/loading.gif) no-repeat;
margin-left: 5px;
}
#search { color: #fff; }
#search::-webkit-input-placeholder {
color: #BCDF7E;
font-family: 'Ubuntu', sans-serif;
font-size: 14px;
font-style: italic;
font-weight: 100;
}
@ -218,7 +210,6 @@ margin-left: 0;
#search::-moz-placeholder {
color: #BCDF7E;
font-family: 'Ubuntu', sans-serif;
font-size: 14px;
font-weight: 100;
}
@ -260,25 +251,6 @@ margin-left: 0;
z-index: 1;
}
@media (max-width: 768px) {
.col-gray-fixed {
width:100%;
}
}
@media (max-width: 995px) {
.col-gray-fixed {
position:static;
width: 100%;
}
}
@media (min-width: 1200px) {
.col-gray-fixed {
width: 280px;
}
}
.ellipsis {
display: block;
overflow: hidden;
@ -390,13 +362,6 @@ margin-left: 0;
border-radius: .25em;
}
@media (max-width: 768px) {
.txvalues {
display: block;
margin: 5px;
}
}
.txvalues-primary {
background-color: #8DC429;
}
@ -444,6 +409,25 @@ margin-left: 0;
#footer a.insight small { font-size: 11px; }
.line-footer { border-top: 2px dashed #ccc; }
#footer .links {
color: #ddd;
font-size: 10px;
}
#footer .links a {
color: #ddd;
}
#footer .links a.selected {
color: #eee;
font-weight: bold;
}
#footer .links a:hover {
text-decoration: none;
color: #fffffe;
}
.line-bot {
border-bottom: 2px solid #EAEAEA;
padding: 0 0 10px 0;
@ -564,7 +548,7 @@ margin-left: 0;
}
.btn-copy {
background: transparent url('/img/icons/copy.png') center center no-repeat;
background: transparent url('../img/icons/copy.png') center center no-repeat;
}
.btn-copy .tooltip {
@ -576,16 +560,6 @@ margin-left: 0;
.btn-copy.zeroclipboard-is-hover { color: #2a6496; }
.btn-copy.zeroclipboard-is-active .tooltip { opacity: 1; }
@media (max-width: 991px) {
.btn-copy {
display: none;
}
}
.txid {
line-height: 26px;
}
.tx-id {
background-color: #373D42;
border: 3px solid #FFFFFF;
@ -603,7 +577,10 @@ margin-left: 0;
.page-header { margin-top: 0; }
.panel { margin-bottom: 1em;}
.panel-body {padding: 0.7em;}
.panel-body {
padding: 0.7em;
word-wrap: break-word;
}
/* Index */
#home .btn-more {
@ -637,22 +614,22 @@ margin-left: 0;
height: 45px;
}
#powered a.bitcore {
background-image: url('http://bitcore.io/images/logo.svg');
background-image: url('../img/logo.svg');
background-size: 80px;
width: 30%;
}
#powered a.nodejs {
background-image: url('/img/nodejs.png');
background-image: url('../img/nodejs.png');
background-size: 80px;
width: 30%;
}
#powered a.angularjs {
background-image: url('/img/angularjs.png');
background-image: url('../img/angularjs.png');
background-size: 50px;
width: 20%;
}
#powered a.leveldb {
background-image: url('/img/leveldb.png');
background-image: url('../img/leveldb.png');
background-size: 50px;
width: 20%;
}
@ -737,3 +714,139 @@ a.v_highlight_more {
margin-top: 15px;
}
@media (max-width: 991px) {
.status {
display: none;
}
.navbar-form {
width: auto;
}
.btn-copy {
display: none;
}
.col-gray-fixed {
position:static;
width: 100%;
margin-top: 0;
padding: 0;
}
.m50v {
margin: 15px 0;
}
.block-id span {
font-size: 24px;
margin: 10px 0;
}
.icon-block {
font-size: initial;
margin: 10px 0;
}
body {
font-size: 12px;
}
h1 {
font-size: 26px;
}
h2 {
font-size: 22px;
}
h3 {
font-size: 18px;
}
.insight {
font-size: 30px;
}
.navbar-default .navbar-nav>li>a {
padding-left: 15px;
padding-right: 15px;
}
}
@media (max-width: 767px) {
.navbar-form {
width: auto;
}
.status {
display: none;
}
#wrap>.container {
padding: 50px 15px 0;
}
#ngProgress-container {
top: 50px;
}
body {
font-size: 11px;
}
h1 {
font-size: 24px;
}
h2 {
font-size: 20px;
}
.navbar-default .navbar-brand {
padding: 15px;
}
.insight {
font-size: 26px;
}
.navbar-nav>li>a {
padding-top: 15px;
padding-bottom: 15px;
}
.container {
padding-left: 0;
padding-right: 0;
}
.navbar-default .navbar-toggle {
margin-top: 7px;
}
.navbar {
min-height: 50px;
}
#search { color: #000; }
.txvalues {
display: block;
margin: 5px;
padding: 0.5em 2em;
font-size: 11px;
}
.navbar-default .navbar-nav .open .dropdown-menu>li>a {
color: #fff;
}
.txvalues {
display: inline;
margin: 0;
padding: 0;
font-weight: bold;
}
.txvalues-success {
background: none;
color: #2FA4D7;
}
.txvalues-primary {
background: none;
color: #8DC429;
}
.txvalues-default {
background: none;
color: #A09E9E;
}
.txvalues-danger {
background: none;
color: #AC0015;
}
.btn-expand {
font-size: 18px;
}
}
@media (min-width: 1200px) {
.col-gray-fixed {
width: 280px;
}
.navbar-form .form-control {
width: 350px;
}
}

View File

@ -1,5 +1,11 @@
'use strict';
var testnet = false;
var netSymbol = testnet ? 'TAZ' : 'ZEC';
var defaultLanguage = localStorage.getItem('insight-language') || 'en';
var defaultCurrency = localStorage.getItem('insight-currency') || netSymbol;
angular.module('insight',[
'ngAnimate',
'ngResource',
@ -8,15 +14,19 @@ angular.module('insight',[
'ui.bootstrap',
'ui.route',
'monospaced.qrcode',
'gettext',
'angularMoment',
'insight.system',
'insight.socket',
'insight.blocks',
'insight.transactions',
'insight.address',
'insight.search',
'insight.charts',
'insight.status',
'insight.connection',
'insight.currency'
'insight.currency',
'insight.messages'
]);
angular.module('insight.system', []);
@ -25,6 +35,8 @@ angular.module('insight.blocks', []);
angular.module('insight.transactions', []);
angular.module('insight.address', []);
angular.module('insight.search', []);
angular.module('insight.charts', []);
angular.module('insight.status', []);
angular.module('insight.connection', []);
angular.module('insight.currency', []);
angular.module('insight.messages', []);

View File

@ -4,39 +4,51 @@
angular.module('insight').config(function($routeProvider) {
$routeProvider.
when('/block/:blockHash', {
templateUrl: '/views/block.html',
title: 'Bitcoin Block '
templateUrl: 'views/block.html',
title: 'Zcash Block '
}).
when('/block-index/:blockHeight', {
controller: 'BlocksController',
templateUrl: '/views/redirect.html'
templateUrl: 'views/redirect.html'
}).
when('/tx/send', {
templateUrl: 'views/transaction_sendraw.html',
title: 'Broadcast Raw Transaction'
}).
when('/tx/:txId/:v_type?/:v_index?', {
templateUrl: '/views/transaction.html',
title: 'Bitcoin Transaction '
templateUrl: 'views/transaction.html',
title: 'Zcash Transaction '
}).
when('/', {
templateUrl: '/views/index.html',
templateUrl: 'views/index.html',
title: 'Home'
}).
when('/blocks', {
templateUrl: '/views/block_list.html',
title: 'Bitcoin Blocks solved Today'
templateUrl: 'views/block_list.html',
title: 'Zcash Blocks solved Today'
}).
when('/blocks-date/:blockDate', {
templateUrl: '/views/block_list.html',
title: 'Bitcoin Blocks solved '
when('/blocks-date/:blockDate/:startTimestamp?', {
templateUrl: 'views/block_list.html',
title: 'Zcash Blocks solved '
}).
when('/address/:addrStr', {
templateUrl: '/views/address.html',
title: 'Bitcoin Address '
templateUrl: 'views/address.html',
title: 'Zcash Address '
}).
when('/charts/:chartType?', {
templateUrl: 'views/charts.html',
title: 'Charts'
}).
when('/status', {
templateUrl: '/views/status.html',
templateUrl: 'views/status.html',
title: 'Status'
}).
when('/messages/verify', {
templateUrl: 'views/messages_verify.html',
title: 'Verify Message'
})
.otherwise({
templateUrl: '/views/404.html',
templateUrl: 'views/404.html',
title: 'Error'
});
});
@ -47,7 +59,9 @@ angular.module('insight')
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('!');
})
.run(function($rootScope, $route, ngProgress) {
.run(function($rootScope, $route, $location, $routeParams, $anchorScroll, ngProgress, gettextCatalog, amMoment) {
gettextCatalog.currentLanguage = defaultLanguage;
amMoment.changeLocale(defaultLanguage);
$rootScope.$on('$routeChangeStart', function() {
ngProgress.start();
});
@ -60,5 +74,8 @@ angular.module('insight')
$rootScope.title = $route.current.title;
$rootScope.isCollapsed = true;
$rootScope.currentAddr = null;
$location.hash($routeParams.scrollTo);
$anchorScroll();
});
});

View File

@ -4,24 +4,34 @@ angular.module('insight.address').controller('AddressController',
function($scope, $rootScope, $routeParams, $location, Global, Address, getSocket) {
$scope.global = Global;
var socket = getSocket($scope);
var addrStr = $routeParams.addrStr;
var _startSocket = function () {
socket.emit('subscribe', $routeParams.addrStr);
socket.on($routeParams.addrStr, function(tx) {
$rootScope.$broadcast('tx', tx);
var beep = new Audio('/sound/transaction.mp3');
beep.play();
var _startSocket = function() {
socket.on('bitcoind/addresstxid', function(data) {
if (data.address === addrStr) {
$rootScope.$broadcast('tx', data.txid);
var base = document.querySelector('base');
var beep = new Audio(base.href + '/sound/transaction.mp3');
beep.play();
}
});
socket.emit('subscribe', 'bitcoind/addresstxid', [addrStr]);
};
var _stopSocket = function () {
socket.emit('unsubscribe', 'bitcoind/addresstxid', [addrStr]);
};
socket.on('connect', function() {
_startSocket();
});
$scope.params = $routeParams;
$scope.$on('$destroy', function(){
_stopSocket();
});
$scope.params = $routeParams;
$scope.findOne = function() {
$rootScope.currentAddr = $routeParams.addrStr;

View File

@ -41,7 +41,7 @@ angular.module('insight.blocks').controller('BlocksController',
$scope.humanSince = function(time) {
var m = moment.unix(time).startOf('day');
var b = moment().startOf('day');
return m.max().from(b);
return moment.min(m).from(b);
};
@ -49,11 +49,21 @@ angular.module('insight.blocks').controller('BlocksController',
$scope.loading = true;
if ($routeParams.blockDate) {
$rootScope.titleDetail = 'on ' + $routeParams.blockDate;
$scope.detail = 'On ' + $routeParams.blockDate;
}
if ($routeParams.startTimestamp) {
var d=new Date($routeParams.startTimestamp*1000);
var m=d.getMinutes();
if (m<10) m = '0' + m;
$scope.before = ' before ' + d.getHours() + ':' + m;
}
$rootScope.titleDetail = $scope.detail;
Blocks.get({
blockDate: $routeParams.blockDate
blockDate: $routeParams.blockDate,
startTimestamp: $routeParams.startTimestamp
}, function(res) {
$scope.loading = false;
$scope.blocks = res.blocks;

View File

@ -0,0 +1,44 @@
'use strict';
angular.module('insight.charts').controller('ChartsController',
function($scope, $rootScope, $routeParams, $location, Chart, Charts) {
$scope.loading = false;
$scope.list = function() {
Charts.get({
}, function(res) {
$scope.charts = res.charts;
});
if ($routeParams.chartType) {
$scope.chart();
}
};
$scope.chart = function() {
$scope.loading = true;
Chart.get({
chartType: $routeParams.chartType
}, function(chart) {
$scope.loading = false;
$scope.chartType = $routeParams.chartType;
$scope.chartName = chart.name;
$scope.chart = c3.generate(chart);
}, function(e) {
if (e.status === 400) {
$rootScope.flashMessage = 'Invalid chart: ' + $routeParams.chartType;
}
else if (e.status === 503) {
$rootScope.flashMessage = 'Backend Error. ' + e.data;
}
else {
$rootScope.flashMessage = 'Chart Not Found';
}
$location.path('/');
});
};
$scope.params = $routeParams;
});

View File

@ -2,6 +2,7 @@
angular.module('insight.currency').controller('CurrencyController',
function($scope, $rootScope, Currency) {
$rootScope.currency.symbol = defaultCurrency;
var _roundFloat = function(x, n) {
if(!parseInt(n, 10) || !parseFloat(x)) n = 0;
@ -10,14 +11,21 @@ angular.module('insight.currency').controller('CurrencyController',
};
$rootScope.currency.getConvertion = function(value) {
if (typeof value !== 'undefined' && value !== null) {
value = value * 1; // Convert to number
if (!isNaN(value) && typeof value !== 'undefined' && value !== null) {
if (value === 0.00000000) return '0 ' + this.symbol; // fix value to show
var response;
if (this.symbol === 'USD') {
response = _roundFloat((value * this.factor), 2);
} else if (this.symbol === 'mBTC') {
} else if (this.symbol === 'm'+netSymbol) {
this.factor = 1000;
response = _roundFloat((value * this.factor), 5);
} else if (this.symbol === 'bits') {
this.factor = 1000000;
response = _roundFloat((value * this.factor), 2);
} else {
this.factor = 1;
response = value;
@ -33,13 +41,16 @@ angular.module('insight.currency').controller('CurrencyController',
$scope.setCurrency = function(currency) {
$rootScope.currency.symbol = currency;
localStorage.setItem('insight-currency', currency);
if (currency === 'USD') {
Currency.get({}, function(res) {
$rootScope.currency.factor = $rootScope.currency.bitstamp = res.data.bitstamp;
});
} else if (currency === 'mBTC') {
} else if (currency === 'm'+netSymbol) {
$rootScope.currency.factor = 1000;
} else if (currency === 'bits') {
$rootScope.currency.factor = 1000000;
} else {
$rootScope.currency.factor = 1;
}
@ -47,7 +58,7 @@ angular.module('insight.currency').controller('CurrencyController',
// Get initial value
Currency.get({}, function(res) {
$rootScope.currency.bitstamp = res.data.bitstamp;
$rootScope.currency.factor = $rootScope.currency.bitstamp = res.data.bitstamp;
});
});

View File

@ -1,15 +1,40 @@
'use strict';
angular.module('insight.system').controller('FooterController',
function($scope, Version) {
function($scope, $route, $templateCache, gettextCatalog, amMoment, Version) {
$scope.defaultLanguage = defaultLanguage;
var _getVersion = function() {
Version.get({},
function(res) {
$scope.version = res.version;
});
function(res) {
$scope.version = res.version;
});
};
$scope.version = _getVersion();
});
$scope.availableLanguages = [{
name: 'Deutsch',
isoCode: 'de_DE',
}, {
name: 'English',
isoCode: 'en',
}, {
name: 'Spanish',
isoCode: 'es',
}, {
name: 'Japanese',
isoCode: 'ja',
}];
$scope.setLanguage = function(isoCode) {
gettextCatalog.currentLanguage = $scope.defaultLanguage = defaultLanguage = isoCode;
amMoment.changeLocale(isoCode);
localStorage.setItem('insight-language', isoCode);
var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$route.reload();
};
});

View File

@ -7,12 +7,17 @@ angular.module('insight.system').controller('HeaderController',
$rootScope.currency = {
factor: 1,
bitstamp: 0,
symbol: 'BTC'
testnet: testnet,
netSymbol: netSymbol,
symbol: netSymbol
};
$scope.menu = [{
'title': 'Blocks',
'link': 'blocks'
}, {
'title': 'Charts',
'link': 'charts'
}, {
'title': 'Status',
'link': 'status'

View File

@ -12,7 +12,7 @@ angular.module('insight.system').controller('IndexController',
limit: BLOCKS_DISPLAYED
}, function(res) {
$scope.blocks = res.blocks;
$scope.blocksLength = res.lenght;
$scope.blocksLength = res.length;
});
};
@ -40,7 +40,7 @@ angular.module('insight.system').controller('IndexController',
$scope.humanSince = function(time) {
var m = moment.unix(time);
return m.max().fromNow();
return moment.min(m).fromNow();
};
$scope.index = function() {

View File

@ -0,0 +1,50 @@
'use strict';
angular.module('insight.messages').controller('VerifyMessageController',
function($scope, $http) {
$scope.message = {
address: '',
signature: '',
message: ''
};
$scope.verification = {
status: 'unverified', // ready|loading|verified|error
result: null,
error: null,
address: ''
};
$scope.verifiable = function() {
return ($scope.message.address
&& $scope.message.signature
&& $scope.message.message);
};
$scope.verify = function() {
$scope.verification.status = 'loading';
$scope.verification.address = $scope.message.address;
$http.post(window.apiPrefix + '/messages/verify', $scope.message)
.success(function(data, status, headers, config) {
if(typeof(data.result) != 'boolean') {
// API returned 200 but result was not true or false
$scope.verification.status = 'error';
$scope.verification.error = null;
return;
}
$scope.verification.status = 'verified';
$scope.verification.result = data.result;
})
.error(function(data, status, headers, config) {
$scope.verification.status = 'error';
$scope.verification.error = data;
});
};
// Hide the verify status message on form change
var unverify = function() {
$scope.verification.status = 'unverified';
};
$scope.$watch('message.address', unverify);
$scope.$watch('message.signature', unverify);
$scope.$watch('message.message', unverify);
});

View File

@ -112,7 +112,7 @@ angular.module('insight.system').controller('ScannerController',
qrcode.callback = function(data) {
_scanStop();
var str = (data.indexOf('bitcoin:') === 0) ? data.substring(8) : data;
var str = (data.indexOf('zcash:') === 0) ? data.substring(8) : data;
console.log('QR code detected: ' + str);
$searchInput
.val(str)

View File

@ -48,6 +48,7 @@ angular.module('insight.search').controller('SearchController',
_resetSearch();
$location.path('/block/' + hash.blockHash);
}, function() { //not found, fail :(
$scope.loading = false;
_badQuery();
});
}

View File

@ -19,7 +19,7 @@ angular.module('insight.status').controller('StatusController',
$scope.humanSince = function(time) {
var m = moment.unix(time / 1000);
return m.max().fromNow();
return moment.min(m).fromNow();
};
var _onSyncUpdate = function(sync) {

View File

@ -56,11 +56,14 @@ function($scope, $rootScope, $routeParams, $location, Global, Transaction, Trans
tmp[addr].doubleSpentTxID = tmp[addr].doubleSpentTxID || items[i].doubleSpentTxID;
tmp[addr].doubleSpentIndex = tmp[addr].doubleSpentIndex || items[i].doubleSpentIndex;
tmp[addr].unconfirmedInput += items[i].unconfirmedInput;
tmp[addr].dbError = tmp[addr].dbError || items[i].dbError;
tmp[addr].valueSat += Math.round(items[i].value * COIN);
tmp[addr].items.push(items[i]);
tmp[addr].notAddr = notAddr;
if (items[i].unconfirmedInput)
tmp[addr].unconfirmedInput = true;
tmp[addr].count++;
}
@ -170,3 +173,41 @@ function($scope, $rootScope, $routeParams, $location, Global, Transaction, Trans
});
});
angular.module('insight.transactions').controller('SendRawTransactionController',
function($scope, $http) {
$scope.transaction = '';
$scope.status = 'ready'; // ready|loading|sent|error
$scope.txid = '';
$scope.error = null;
$scope.formValid = function() {
return !!$scope.transaction;
};
$scope.send = function() {
var postData = {
rawtx: $scope.transaction
};
$scope.status = 'loading';
$http.post(window.apiPrefix + '/tx/send', postData)
.success(function(data, status, headers, config) {
if(typeof(data.txid) != 'string') {
// API returned 200 but the format is not known
$scope.status = 'error';
$scope.error = 'The transaction was sent but no transaction id was got back';
return;
}
$scope.status = 'sent';
$scope.txid = data.txid;
})
.error(function(data, status, headers, config) {
$scope.status = 'error';
if(data) {
$scope.error = data;
} else {
$scope.error = "No error message given (connection error?)"
}
});
};
});

View File

@ -72,4 +72,20 @@ angular.module('insight')
});
}
};
})
.directive('focus', function ($timeout) {
return {
scope: {
trigger: '@focus'
},
link: function (scope, element) {
scope.$watch('trigger', function (value) {
if (value === "true") {
$timeout(function () {
element[0].focus();
});
}
});
}
};
});

View File

@ -2,7 +2,7 @@
angular.module('insight.address').factory('Address',
function($resource) {
return $resource('/api/addr/:addrStr/?noTxList=1', {
return $resource(window.apiPrefix + '/addr/:addrStr/?noTxList=1', {
addrStr: '@addStr'
}, {
get: {
@ -21,3 +21,4 @@ angular.module('insight.address').factory('Address',
});
});

View File

@ -3,7 +3,7 @@
angular.module('insight.blocks')
.factory('Block',
function($resource) {
return $resource('/api/block/:blockHash', {
return $resource(window.apiPrefix + '/block/:blockHash', {
blockHash: '@blockHash'
}, {
get: {
@ -23,9 +23,9 @@ angular.module('insight.blocks')
})
.factory('Blocks',
function($resource) {
return $resource('/api/blocks');
return $resource(window.apiPrefix + '/blocks');
})
.factory('BlockByHeight',
function($resource) {
return $resource('/api/block-index/:blockHeight');
return $resource(window.apiPrefix + '/block-index/:blockHeight');
});

View File

@ -0,0 +1,27 @@
'use strict';
angular.module('insight.charts')
.factory('Chart',
function($resource) {
return $resource(window.apiPrefix + '/chart/:chartType', {
chartType: '@chartType'
}, {
get: {
method: 'GET',
interceptor: {
response: function (res) {
return res.data;
},
responseError: function (res) {
if (res.status === 404) {
return res;
}
}
}
}
});
})
.factory('Charts',
function($resource) {
return $resource(window.apiPrefix + '/charts');
});

View File

@ -2,5 +2,5 @@
angular.module('insight.currency').factory('Currency',
function($resource) {
return $resource('/api/currency');
return $resource(window.apiPrefix + '/currency');
});

View File

@ -4,9 +4,10 @@
angular.module('insight.system')
.factory('Global',[
function() {
return {};
}
])
.factory('Version',
function($resource) {
return $resource('/api/version');
return $resource(window.apiPrefix + '/version');
});

View File

@ -39,8 +39,9 @@ ScopedSocket.prototype.on = function(event, callback) {
ScopedSocket.prototype.emit = function(event, data, callback) {
var socket = this.socket;
var $rootScope = this.$rootScope;
var args = Array.prototype.slice.call(arguments);
socket.emit(event, data, function() {
args.push(function() {
var args = arguments;
$rootScope.$apply(function() {
if (callback) {
@ -48,6 +49,8 @@ ScopedSocket.prototype.emit = function(event, data, callback) {
}
});
});
socket.emit.apply(socket, args);
};
angular.module('insight.socket').factory('getSocket',

View File

@ -3,15 +3,15 @@
angular.module('insight.status')
.factory('Status',
function($resource) {
return $resource('/api/status', {
return $resource(window.apiPrefix + '/status', {
q: '@q'
});
})
.factory('Sync',
function($resource) {
return $resource('/api/sync');
return $resource(window.apiPrefix + '/sync');
})
.factory('PeerSync',
function($resource) {
return $resource('/api/peer');
return $resource(window.apiPrefix + '/peer');
});

View File

@ -3,7 +3,7 @@
angular.module('insight.transactions')
.factory('Transaction',
function($resource) {
return $resource('/api/tx/:txId', {
return $resource(window.apiPrefix + '/tx/:txId', {
txId: '@txId'
}, {
get: {
@ -23,17 +23,17 @@ angular.module('insight.transactions')
})
.factory('TransactionsByBlock',
function($resource) {
return $resource('/api/txs', {
return $resource(window.apiPrefix + '/txs', {
block: '@block'
});
})
.factory('TransactionsByAddress',
function($resource) {
return $resource('/api/txs', {
return $resource(window.apiPrefix + '/txs', {
address: '@address'
});
})
.factory('Transactions',
function($resource) {
return $resource('/api/txs');
return $resource(window.apiPrefix + '/txs');
});

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<div class="jumbotron">
<h1>Ooops!</h1>
<h2 class="text-muted">404 Page not found :(</h2>
<p><a href="/" class="pull-right">Go to home</a></p>
<h2 translate class="text-muted">404 Page not found :(</h2>
<p><a translate href="/" class="pull-right">Go to home</a></p>
</div>

View File

@ -1,13 +1,13 @@
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<section data-ng-controller="AddressController" data-ng-init="findOne()">
<div class="secondary_navbar hidden-xs hidden-sm" scroll data-ng-class="{'hidden': !secondaryNavbar}" data-ng-show="address.addrStr" data-ng-init="hideSNavbar=0">
<div class="container" data-ng-if="!hideSNavbar">
<div class="col-md-8 text-left">
<h3>Address</h3> {{address.addrStr}}
<h3 translate>Address</h3> {{address.addrStr}}
<span class="btn-copy" clip-copy="address.addrStr"></span>
</div>
<div class="col-md-4">
<span class="txvalues txvalues-primary"><strong>Final Balance</strong> {{$root.currency.getConvertion(address.balance) || address.balance + ' BTC' }}</span>
<span class="txvalues txvalues-primary"><strong translate>Final Balance</strong> {{$root.currency.getConvertion(address.balance)}}</span>
</div>
</div>
<div class="hide_snavbar">
@ -17,35 +17,35 @@
</a>
</div>
</div>
<h1>Address <small data-ng-show="address.addrStr">{{$root.currency.getConvertion(address.balance) || address.balance + ' BTC'}}</small></h1>
<h1><span translate>Address</span> <small data-ng-show="address.addrStr">{{$root.currency.getConvertion(address.balance)}}</small></h1>
<div class="text-muted" data-ng-if="!address.addrStr">
<span>Loading Address Information...</span>
<span translate>Loading Address Information</span> <span class="loader-gif"></span>
</div>
<div data-ng-if="address.addrStr">
<div class="well well-sm ellipsis">
<strong>Address</strong>
<strong translate>Address</strong>
<span class="text-muted">{{address.addrStr}}</span>
<span class="btn-copy" clip-copy="address.addrStr"></span>
</div>
<h2>Summary <small>confirmed</small></h2>
<div class="ng-cloak row" data-ng-hide="!address.addrStr" data-ng-cloak>
<h2 translate>Summary <small>confirmed</small></h2>
<div class="row" data-ng-hide="!address.addrStr">
<div class="col-md-10">
<table class="table">
<tbody>
<tr>
<td><strong>Total Received</strong></td>
<td class="ellipsis text-right">{{$root.currency.getConvertion(address.totalReceived) || address.totalReceived + ' BTC'}}</td>
<td><strong translate>Total Received</strong></td>
<td class="ellipsis text-right">{{$root.currency.getConvertion(address.totalReceived)}}</td>
</tr>
<tr>
<td><strong>Total Sent</strong></td>
<td class="ellipsis text-right">{{$root.currency.getConvertion(address.totalSent) || address.totalSent + ' BTC'}}</td>
<td><strong translate>Total Sent</strong></td>
<td class="ellipsis text-right">{{$root.currency.getConvertion(address.totalSent)}}</td>
</tr>
<tr>
<td><strong>Final Balance</strong></td>
<td class="ellipsis text-right">{{$root.currency.getConvertion(address.balance) || address.balance + ' BTC'}}</td>
<td><strong translate>Final Balance</strong></td>
<td class="ellipsis text-right">{{$root.currency.getConvertion(address.balance)}}</td>
</tr>
<tr>
<td><strong>No. Transactions</strong></td>
<td><strong translate>No. Transactions</strong></td>
<td class="ellipsis text-right">{{address.txApperances}}</td>
</tr>
</tbody>
@ -56,15 +56,15 @@
</div>
</div>
<div data-ng-show="address.unconfirmedTxApperances">
<h3>Unconfirmed</h3>
<h3 translate>Unconfirmed</h3>
<table class="table">
<tbody>
<tr>
<td class="small">Unconfirmed Txs Balance</td>
<td class="small" translate>Unconfirmed Txs Balance</td>
<td class="address ellipsis text-right">{{$root.currency.getConvertion(address.unconfirmedBalance)}}</td>
</tr>
<tr>
<td class="small">No. Transactions</td>
<td class="small" translate>No. Transactions</td>
<td class="address ellipsis text-right">{{address.unconfirmedTxApperances}}</td>
</tr>
@ -73,8 +73,8 @@
</div>
</div>
<div data-ng-if="address.addrStr" data-ng-controller="transactionsController" data-ng-init="load('address')">
<h2>Transactions</h2>
<div data-ng-include src="'/views/transaction/list.html'" when-scrolled="loadMore()"></div>
<h2 translate>Transactions</h2>
<div data-ng-include src="'views/transaction/list.html'" when-scrolled="loadMore()"></div>
</div>
</section>

View File

@ -1,15 +1,15 @@
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<section data-ng-controller="BlocksController" data-ng-init="findOne()">
<div class="secondary_navbar hidden-xs hidden-sm" scroll data-ng-class="{'hidden': !secondaryNavbar}" data-ng-show="block.hash" data-ng-init="hideSNavbar=0">
<div class="container" data-ng-if="!hideSNavbar">
<div class="row">
<div class="col-md-1">
<a href="/block/{{block.previousblockhash}}"><span class="lead glyphicon glyphicon-chevron-left"></span></a>
<a href="block/{{block.previousblockhash}}"><span class="lead glyphicon glyphicon-chevron-left"></span></a>
</div>
<div class="col-md-10">
<div class="row">
<div class="col-md-5">
<h3 class="text-left">Block #{{block.height}}</h3>
<h3 class="text-left"><span translate>Block</span> #{{block.height}}</h3>
</div>
<p class="col-md-6 ellipsis text-left">
<strong>Hash</strong> {{block.hash}}
@ -20,7 +20,7 @@
</div>
</div>
<div class="col-md-1">
<a data-ng-show="block.nextblockhash" href="/block/{{block.nextblockhash}}"><span class="lead glyphicon glyphicon-chevron-right"></span></a>
<a data-ng-show="block.nextblockhash" href="block/{{block.nextblockhash}}"><span class="lead glyphicon glyphicon-chevron-right"></span></a>
</div>
</div>
</div> <!-- END OF CONTAINER -->
@ -33,40 +33,40 @@
</div>
<h1>Block #{{block.height}}</h1>
<div class="text-muted" data-ng-if="!block.hash">
<span>Loading Block Information...</span>
<span translate>Loading Block Information</span> <span class="loader-gif"></span>
</div>
<div class="ng-cloak" data-ng-cloak data-ng-if="block.hash">
<div data-ng-if="block.hash">
<div class="well well-sm ellipsis">
<strong>BlockHash</strong>
<span class="txid text-muted">{{block.hash}}</span>
<span class="btn-copy" clip-copy="block.hash"></span>
</div>
<h2>Summary</h2>
<h2 translate>Summary</h2>
<div class="row">
<div class="col-md-6">
<table class="table" style="table-layout: fixed">
<tbody>
<tr>
<td><strong>Number Of Transactions</strong></td>
<td><strong translate>Number Of Transactions</strong></td>
<td class="text-right text-muted">{{block.tx.length}}</td>
</tr>
<tr>
<td><strong>Height</strong></td>
<td><strong translate>Height</strong></td>
<td class="text-right text-muted">{{block.height}}
<span data-ng-show="block.isMainChain" class="text-success">(Mainchain)</span>
<span data-ng-show="!block.isMainChain" class="text-danger"> <span class="glyphicon glyphicon-warning-sign"></span> (Orphaned)</span>
</td>
</tr>
<tr>
<td><strong>Block Reward</strong></td>
<td class="text-right text-muted">{{$root.currency.getConvertion(block.reward) || block.reward + ' BTC'}}</td>
<td><strong translate>Block Reward</strong></td>
<td class="text-right text-muted">{{$root.currency.getConvertion(block.reward)}}</td>
</tr>
<tr>
<td><strong>Timestamp</strong></td>
<td><strong translate>Timestamp</strong></td>
<td class="text-right text-muted">{{block.time * 1000 | date:'medium'}}</td>
</tr>
<tr data-ng-show="block.poolInfo">
<td><strong>Mined by</strong></td>
<td><strong translate>Mined by</strong></td>
<td class="text-right text-muted">
<a href="{{block.poolInfo.url}}" target="_blank" title="{{block.poolInfo.poolName}}">{{block.poolInfo.poolName}}</a>
</td>
@ -81,38 +81,52 @@
</td>
</tr>
<tr data-ng-show="block.previousblockhash">
<td><strong>Previous Block</strong></td>
<td class="text-right"><a href="/block/{{block.previousblockhash}}">{{block.height-1}}</a></td>
<td><strong translate>Previous Block</strong></td>
<td class="text-right"><a href="block/{{block.previousblockhash}}">{{block.height-1}}</a></td>
</tr>
</tbody>
</table>
</div>
<div class="col-md-6">
<table class="table">
<table class="table" style="table-layout: fixed">
<tbody>
<tr>
<td> <strong> Difficulty </strong></td>
<td> <strong translate>Difficulty</strong></td>
<td class="text-right text-muted">{{block.difficulty}}</td>
</tr>
<tr>
<td> <strong> Bits </strong></td>
<td> <strong>Bits</strong></td>
<td class="text-right text-muted">{{block.bits}}</td>
</tr>
<tr>
<td> <strong> Size (bytes) </strong></td>
<td> <strong translate>Size (bytes)</strong></td>
<td class="text-right text-muted">{{block.size}}</td>
</tr>
<tr>
<td> <strong> Version </strong></td>
<td> <strong translate>Version</strong></td>
<td class="text-right text-muted">{{block.version}}</td>
</tr>
<tr>
<td> <strong> Nonce </strong></td>
<td class="text-right text-muted">{{block.nonce}}</td>
<td> <strong>Nonce</strong></td>
<td class="text-right text-muted">
<div class="ellipsis">
<span class="btn-copy" clip-copy="block.nonce"></span>
<span>{{block.nonce}}</span>
</div>
</td>
</tr>
<tr>
<td><strong>Solution</strong></td>
<td class="text-right text-muted">
<div class="ellipsis">
<span class="btn-copy" clip-copy="block.solution"></span>
<span>{{block.solution}}</span>
</div>
</td>
</tr>
<tr data-ng-show="block.nextblockhash">
<td><strong>Next Block</strong></td>
<td class="text-right"><a href="/block/{{block.nextblockhash}}">{{block.height+1}}</a></td>
<td><strong translate>Next Block</strong></td>
<td class="text-right"><a href="block/{{block.nextblockhash}}">{{block.height+1}}</a></td>
</tr>
</tbody>
</table>
@ -120,8 +134,8 @@
</div>
</div>
<div data-ng-if="block.hash" data-ng-controller="transactionsController" data-ng-init="load('block')">
<h3>Transactions</h3>
<div data-ng-include src="'/views/transaction/list.html'" when-scrolled="loadMore()"></div>
<h3 translate>Transactions</h3>
<div data-ng-include src="'views/transaction/list.html'" when-scrolled="loadMore()"></div>
</div>
</section>

View File

@ -1,11 +1,12 @@
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<section data-ng-controller="BlocksController" data-ng-init="list()">
<div class="row">
<div class="col-xs-12 col-gray col-gray-fixed">
<div class="block-id">
<div class="icon-block text-center">
<span class="glyphicon glyphicon-list"></span>
<h3>Blocks <br> mined on:</h3>
<h3><span translate>Blocks</span> <br>
<span translate>mined on:</span></h3>
</div>
</div>
<p class="lead text-center m20v">
@ -13,51 +14,56 @@
<a href="#" class="btn btn-primary btn-xs" datepicker-popup show-button-bar="false" data-ng-click="openCalendar($event)" data-ng-model="dt" is-open="opened" data-ng-required="true"><span class="glyphicon glyphicon-calendar"></span></a>
</p>
<div class="m20v text-center text-muted" data-ng-if="!pagination.current">
<span>Loading Selected Date...</span>
<span translate>Loading Selected Date...</span>
</div>
<div class="ng-cloak" data-ng-cloak data-ng-if="pagination.current">
<div data-ng-if="pagination.current">
<p class="lead text-center m20v" data-ng-show="loading">&nbsp;</p>
<p class="text-center m20v" data-ng-show="pagination.isToday && !loading">Today</p>
<p class="text-center m20v" data-ng-show="pagination.isToday && !loading" translate>Today</p>
<p class="text-center m20v" data-ng-show="!pagination.isToday && !loading">{{humanSince(pagination.currentTs)}}
<p class="text-center m20v" data-ng-show="loading">&nbsp;</p>
<div class="m50v text-center">
<a class="btn btn-primary" href="/blocks-date/{{pagination.prev}}"><small>&larr; {{pagination.prev}}</small></a>
<a class="btn btn-primary" href="/blocks-date/{{pagination.next}}" data-ng-show="!pagination.isToday"><small>{{pagination.next}} &rarr;</small></a>
<a class="btn btn-primary" href="blocks-date/{{pagination.prev}}"><small>&larr; {{pagination.prev}}</small></a>
<a class="btn btn-primary" href="blocks-date/{{pagination.next}}" data-ng-show="!pagination.isToday"><small>{{pagination.next}} &rarr;</small></a>
</div>
</div>
</div>
<div class="col-xs-12 col-md-9 col-md-offset-3">
<div class="page-header">
<h1>
Blocks
<small>by date</small>
<span translate>Blocks</span>
<small><span translate>by date.</span> {{detail}} {{before}}</small>
</h1>
</div>
<table class="table table-hover table-striped">
<thead>
<tr>
<th>Height</th>
<th>Timestamp</th>
<th class="text-right">Transactions</th>
<th class="text-right">Mined by</th>
<th class="text-right">Size</th>
<th translate>Height</th>
<th translate>Timestamp</th>
<th class="text-right" translate>Transactions</th>
<th class="text-right hidden-xs" translate>Mined by</th>
<th class="text-right" translate>Size</th>
</tr>
</thead>
<tbody>
<tr data-ng-show="loading">
<td colspan="4">Waiting for blocks...</td>
<td colspan="5"><span translate>Waiting for blocks...</span> <span class="loader-gif"></span></td>
</tr>
<tr class="fader" data-ng-repeat='b in blocks'>
<td><a href="/block/{{b.hash}}">{{b.height}}</a></td>
<td><a href="block/{{b.hash}}">{{b.height}}</a></td>
<td>{{b.time * 1000 | date:'medium'}}</td>
<td class="text-right">{{b.txlength}}</td>
<td class="text-right"><a href="{{b.poolInfo.url}}" title="{{b.poolInfo.poolName}}" target="_blank" data-ng-show="b.poolInfo">{{b.poolInfo.poolName}}</a></td>
<td class="text-right hidden-xs"><a href="{{b.poolInfo.url}}" title="{{b.poolInfo.poolName}}" target="_blank" data-ng-show="b.poolInfo">{{b.poolInfo.poolName}}</a></td>
<td class="text-right">{{b.size}}</td>
</tr>
</tbody>
</table>
<div data-ng-if="pagination.more">
<a class="btn btn-primary" href="blocks-date/{{pagination.current}}" data-ng-show="{{before}}">Lastest block from date</a>
<a class="btn btn-primary" href="blocks-date/{{pagination.current}}/{{pagination.moreTs}}">Older blocks from this date</a>
</div>
</div>
</div>
<h2 class="text-center text-muted" data-ng-show="!blocks.length && !loading">No blocks yet.</h2>
<h2 class="text-center text-muted" data-ng-show="!blocks.length && !loading"
translate>No blocks yet.</h2>
</section>

32
public/views/charts.html Normal file
View File

@ -0,0 +1,32 @@
<div data-ng-include src="'views/includes/connection.html'"></div>
<section data-ng-controller="ChartsController" data-ng-init="list()">
<div class="row">
<div class="col-xs-12 col-gray col-gray-fixed">
<div class="block-id">
<div class="icon-block text-center">
<span class="glyphicon glyphicon-stats"></span>
<h3><span translate>Charts</span></h3>
</div>
</div>
<div class="m20v text-center">
<span class="fader" data-ng-repeat='(type, c) in charts'>
<a class="btn btn-primary" style="margin-bottom: 3px" href="charts/{{type}}">{{c.name}}<a>
</span>
</div>
</div>
<div class="col-xs-12 col-md-9 col-md-offset-3">
<div class="page-header">
<h1>
<span>{{chartName}}</span>
</h1>
</div>
<div data-ng-show="loading">
<span translate>Loading chart...</span> <span class="loader-gif"></span>
</div>
<div data-ng-show="!loading">
<div id="chart"></div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,2 @@
{{'Blocks'|translate}}
{{'Status'|translate}}

View File

@ -4,18 +4,17 @@
data-ng-show="!serverOnline || !clienteOnline || !apiOnline"
data-ng-init="getConnStatus()">
<strong>Error!</strong>
<strong translate>Error!</strong>
<p data-ng-show="!apiOnline">
Can't connect to bitcoind to get live updates from the p2p network.
(Tried connecting to bitcoind at {{host}}:{{port}} and failed.)
<p data-ng-show="!apiOnline" translate>
Can't connect to zcashd to get live updates from the p2p network. (Tried connecting to zcashd at {{host}}:{{port}} and failed.)
</p>
<p data-ng-show="!serverOnline">
<p data-ng-show="!serverOnline" translate>
Can't connect to insight server. Attempting to reconnect...
</p>
<p data-ng-show="!clienteOnline">
<p data-ng-show="!clienteOnline" translate>
Can't connect to internet. Please, check your connection.
</p>

View File

@ -3,13 +3,16 @@
</a>
<ul class="dropdown-menu">
<li>
<a href="#" data-ng-click="setCurrency('USD')" data-ng-class="{active: currency.symbol == 'USD'}">USD</a>
<a data-ng-click="setCurrency('USD')" data-ng-class="{active: currency.symbol == 'USD'}">USD</a>
</li>
<li>
<a href="#" data-ng-click="setCurrency('BTC')" data-ng-class="{active: currency.symbol == 'BTC'}">BTC</a>
<a data-ng-click="setCurrency(currency.netSymbol)" data-ng-class="{active: currency.symbol == currency.netSymbol}">{{currency.netSymbol}}</a>
</li>
<li>
<a href="#" data-ng-click="setCurrency('mBTC')" data-ng-class="{active: currency.symbol == 'mBTC'}">mBTC</a>
<a data-ng-click="setCurrency('m'+currency.netSymbol)" data-ng-class="{active: currency.symbol == ('m'+currency.netSymbol)}">m{{currency.netSymbol}}</a>
</li>
<li>
<a data-ng-click="setCurrency('bits')" data-ng-class="{active: currency.symbol == 'bits'}">bits</a>
</li>
</ul>

View File

@ -7,20 +7,15 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="insight navbar-brand" href="/">insight</a>
<a class="insight navbar-brand" href=".">insight</a>
</div>
<div class="navbar-collapse collapse" collapse="$root.isCollapsed">
<ul class="nav navbar-nav">
<li data-ng-repeat="item in menu" ui-route="/{{item.link}}" data-ng-class="{active: $uiRoute}">
<a href="/{{item.link}}">{{item.title}}</a>
<li data-ng-repeat="item in menu" ui-route="{{item.link}}" data-ng-class="{active: $uiRoute}">
<a href="{{item.link}}">{{item.title|translate}}</a>
</li>
</ul>
<form id="search-form" data-ng-controller="SearchController" class="navbar-form navbar-left hidden-xs" role="search" data-ng-submit="search()">
<div class="form-group" data-ng-class="{'has-error': badQuery}">
<input id="search" type="text" class="form-control" data-ng-model="q" data-ng-class="{'loading': loading}" placeholder="Search for block, transaction or address" data-ng-submit="search()">
</div>
<div class="no_matching text-danger" data-ng-show="badQuery">No matching records found!</div>
</form>
<span class="hidden-xs navbar-form navbar-left" data-ng-include src="'views/includes/search.html'"></span>
<ul class="nav navbar-nav navbar-right">
<li>
<div class="status" data-ng-controller="StatusController">
@ -37,15 +32,16 @@
</div>
&nbsp; &middot;
<span data-ng-init="getStatus('Info')">
<strong>Conn</strong> {{info.connections}}
<strong>{{'Conn'|translate}}</strong> {{info.connections}}
</span> &middot;
<strong>Height</strong> {{totalBlocks || info.blocks}}
<strong>{{'Height'|translate}}</strong> {{totalBlocks || info.blocks}}
</div>
</li>
<li>
<a href="#" data-ng-click="openScannerModal()"><span class="glyphicon glyphicon-qrcode"></span> Scan</a>
<a data-ng-click="openScannerModal()"><span class="glyphicon
glyphicon-qrcode"></span> Scan</a>
</li>
<li class="dropdown" data-ng-controller="CurrencyController" data-ng-include="'/views/includes/currency.html'"></li>
<li class="dropdown" data-ng-controller="CurrencyController" data-ng-include="'views/includes/currency.html'"></li>
</ul>
</div>
</div>

View File

@ -1,4 +1,4 @@
<span class="text-warning" data-ng-show="!loaded && !error">Loading...</span>
<span class="text-warning" data-ng-show="!loaded && !error" translate>Loading...</span>
<span class="text-danger" data-ng-show="error">{{error}}</span>

View File

@ -1,6 +1,6 @@
<form id="search-form-mobile" data-ng-controller="SearchController" class="visible-xs" role="search" data-ng-submit="search()">
<form id="search-form" data-ng-controller="SearchController" role="search" data-ng-submit="search()">
<div class="form-group" data-ng-class="{'has-error': badQuery}">
<input id="search" type="text" class="form-control" data-ng-model="q" data-ng-class="{'loading': loading}" placeholder="Search for block, transaction or address" data-ng-submit="search()">
<input id="search" type="text" class="form-control" data-ng-model="q" data-ng-class="{'loading': loading}" placeholder="{{'Search for block, transaction or address'|translate}}" data-ng-submit="search()" focus="true">
</div>
<div class="no_matching text-danger" data-ng-show="badQuery">No matching records found!</div>
<div class="no_matching text-danger" data-ng-show="badQuery" translate>No matching records found!</div>
</form>

View File

@ -1,60 +1,58 @@
<div class="alert alert-danger" data-ng-show="flashMessage">
{{$root.flashMessage}}
</div>
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<section data-ng-controller="IndexController" data-ng-init="index()">
<div class="container">
<div id="home" class="row">
<div class="col-xs-12 col-md-8">
<div data-ng-include src="'/views/includes/search.html'"></div>
<div id="search-form-mobile" class="visible-xs" data-ng-include src="'views/includes/search.html'"></div>
<h1>Latest Blocks</h1>
<h1 translate>Latest Blocks</h1>
<table class="table table-hover table-striped" style="table-layout: fixed">
<thead>
<tr>
<th>Height</th>
<th>Age</th>
<th class="text-right"><span class="ellipsis">Transactions</span></th>
<th class="text-right"><span class="ellipsis">Mined by</span></th>
<th class="text-right">Size</th>
<th translate>Height</th>
<th translate>Age</th>
<th class="text-right"><span class="ellipsis" translate>Transactions</span></th>
<th class="text-right hidden-xs"><span class="ellipsis" translate>Mined by</span></th>
<th class="text-right" translate>Size</th>
</tr>
</thead>
<tbody>
<tr data-ng-show="!blocks.length"><td colspan="4">Waiting for blocks...</td></tr>
<tr data-ng-show="!blocks.length"><td colspan="4" translate>Waiting for blocks...</td></tr>
<tr class="fader" data-ng-repeat='b in blocks'>
<td>
<a href="/block/{{b.hash}}">{{b.height}}</a>
<a href="block/{{b.hash}}">{{b.height}}</a>
</td>
<td><span class="ellipsis">{{humanSince(b.time)}}</span></td>
<td class="text-right">{{b.txlength}}</td>
<td class="text-right"><a href="{{b.poolInfo.url}}" title="{{b.poolInfo.poolName}}" target="_blank" data-ng-show="b.poolInfo">{{b.poolInfo.poolName}}</a></td>
<td class="text-right">{{b.size}} bytes</td>
<td class="text-right hidden-xs"><a href="{{b.poolInfo.url}}" title="{{b.poolInfo.poolName}}" target="_blank" data-ng-show="b.poolInfo">{{b.poolInfo.poolName}}</a></td>
<td class="text-right">{{b.size}}</td>
</tr>
</tbody>
</table>
<div class="btn-more">
<a href="/blocks" class="btn btn-default">See all blocks</a>
<a href="blocks" class="btn btn-default" translate>See all blocks</a>
</div>
<h2>Latest Transactions</h2>
<h2 translate>Latest Transactions</h2>
<table class="table table-hover table-striped" style="table-layout: fixed;">
<thead>
<tr>
<th>Hash</th>
<th class="text-right">Size</th>
<th class="text-right">Value Out</th>
<th class="text-right" translate>Value Out</th>
</tr>
</thead>
<tbody>
<tr data-ng-show="!txs.length"><td colspan="3">Waiting for transactions...</td></tr>
<tr data-ng-show="!txs.length"><td colspan="3" translate>Waiting for transactions...</td></tr>
<tr class="fader" data-ng-repeat='tx in txs'>
<td>
<a class="ellipsis" href="/tx/{{tx.txid}}">{{tx.txid}}</a>
<a class="ellipsis" href="tx/{{tx.txid}}">{{tx.txid}}</a>
</td>
<td class="text-right"><span class="ellipsis">{{tx.size}} bytes</span></td>
<td class="text-right"><span class="ellipsis">{{tx.valueOut}} BTC</span></td>
<td class="text-right"><span class="ellipsis">{{$root.currency.getConvertion(tx.valueOut)}}</span></td>
</tr>
</tbody>
</table>
@ -62,15 +60,14 @@
</div>
<div class="col-xs-12 col-md-4 col-gray">
<h2> About </h2>
<p><strong>insight</strong> is an <a href="http://live.insight.is/" target="_blank">open-source Bitcoin blockchain explorer</a> with complete REST
and websocket APIs that can be used for writing web wallets and other apps
that need more advanced blockchain queries than provided by bitcoind RPC.
Check out the <a href="http://github.com/bitpay/insight" target="_blank">source code</a>.</p>
<p><strong>insight</strong> is still in development, so be sure to report any bugs and provide feedback for improvement at our <a href="https://github.com/bitpay/insight/issues" target="_blank">github issue tracker</a>.</p>
<h2 translate>About</h2>
<p translate><strong>insight</strong> is an <a href="https://insight.is/"
target="_blank">open-source Zcash blockchain explorer</a> with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by zcashd RPC. Check out the <a href="https://github.com/zcash-hackworks/insight-ui-zcash" target="_blank">source code</a>.</p>
<p translate><strong>insight</strong> is still in development, so be sure to report any bugs and provide feedback for improvement at our <a href="https://github.com/zcash/zcash/issues" target="_blank">github issue tracker</a>.</p>
<p data-ng-if='currency.testnet'><strong>This explorer is currently showing testnet Zcash!</strong></p>
<div id="powered" class="row">
<div class="powered-text">
<small class="text-muted">Powered by</small>
<small class="text-muted" translate>Powered by</small>
</div>
<a href="http://bitcore.io" target="_blank" class="bitcore" title="Bitcore"></a>
<a href="http://angularjs.org" target="_blank" class="angularjs" title="AngularJS"></a>

View File

@ -0,0 +1,81 @@
<section data-ng-controller="VerifyMessageController">
<div class="page-header">
<h1>
<span translate>Verify signed message</span>
</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<form class="form-horizontal" role="form">
<div class="form-group">
<label for="verify-message-address" class="col-sm-2 control-label" translate>
Address
</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="verify-message-address"
data-ng-model="message.address">
</div>
</div>
<div class="form-group">
<label for="verify-message-signature" class="col-sm-2 control-label" translate>
Signature
</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="verify-message-signature"
data-ng-model="message.signature">
</div>
</div>
<div class="form-group">
<label for="verify-message-message" class="col-sm-2 control-label" translate>
Message
</label>
<div class="col-sm-10">
<textarea class="form-control" id="verify-message-message"
data-ng-model="message.message" rows="5"></textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-default" translate
data-ng-click="verify()" data-ng-disabled="!verifiable()">
Verify
</button>
</div>
</div>
</form>
<div class="row">
<div data-ng-hide="verification.status == 'unverified'"
class="col-sm-offset-2 col-sm-10">
<div ng-show="verification.status == 'loading'" translate>
Loading...
</div>
<div ng-show="verification.status == 'verified' && verification.result"
class="alert alert-success" translate>
The message is verifiably from {{verification.address}}.
</div>
<div ng-show="verification.status == 'verified' && !verification.result"
class="alert alert-danger" translate>
The message failed to verify.
</div>
<div ng-show="verification.status == 'error'"
class="alert alert-warning">
<p translate>An error occured in the verification process.</p>
<p ng-show="error">
<strong translate>Error message:</strong>
{{verification.error}}
</p>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-4 col-gray">
<p translate>
Zcash comes with a way of signing arbitrary messages.
</p>
<p translate>
This form can be used to verify that a message comes from
a specific Zcash address.
</p>
</div>
</div>
</section>

View File

@ -1 +1 @@
<div class="text-center">Redirecting...</div>
<div class="text-center" translate>Redirecting...</div>

View File

@ -1,28 +1,28 @@
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<section>
<div class="page-header">
<h1>
Application Status
</h1>
<h1 translate>Application Status</h1>
</div>
<div id="status" class="row">
<div class="col-xs-12 col-md-8">
<h2>Sync Status</h2>
<h2 translate>Sync Status</h2>
<table class="table" data-ng-controller="StatusController" data-ng-init="getSync()">
<tbody>
<tr>
<td>Sync Progress</td>
<td translate>Sync Progress</td>
<td>
<div class="progress">
<div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: {{ sync.syncPercentage}}%">
<span data-ng-show="sync.syncPercentage>0">{{sync.syncPercentage}}% Complete</span>
<span data-ng-show="sync.syncPercentage>0">{{sync.syncPercentage}}%
<span translate>Complete</span>
</span>
</div>
</div>
</td>
</tr>
<tr>
<td>Current Sync Status</td>
<td translate>Current Sync Status</td>
<td class="text-right">
<span data-ng-show="!sync.error">{{sync.status}}</span>
<span class="text-danger" data-ng-show="sync.error">
@ -32,129 +32,88 @@
</td>
</tr>
<tr>
<td>Start Date</td>
<td translate>Start Date</td>
<td class="text-right"><time title="{{sync.startTs | date:'medium'}}">{{humanSince(sync.startTs)}}</time></td>
</tr>
<tr data-ng-show="sync.endTs">
<td>Finish Date</td>
<td translate>Finish Date</td>
<td class="text-right"><time title="{{sync.startTs | date:'medium'}}" >{{humanSince(sync.endTs)}}</time></td>
</tr>
<tr>
<td>Initial Block Chain Height</td>
<td translate>Initial Block Chain Height</td>
<td class="text-right">{{sync.blockChainHeight}}</td>
</tr>
<tr>
<td>Synced Blocks</td>
<td translate>Synced Blocks</td>
<td class="text-right">{{sync.syncedBlocks}}</td>
</tr>
<tr>
<td>Skipped Blocks (previously synced)</td>
<td translate>Skipped Blocks (previously synced)</td>
<td class="text-right">{{sync.skippedBlocks}}</td>
</tr>
<tr>
<td>Sync Type</td>
<td translate>Sync Type</td>
<td class="text-right">{{sync.type}}</td>
</tr>
</tbody>
</table>
<h2>Last Block</h2>
<h2 translate>Last Block</h2>
<table class="table" style="table-layout: fixed" data-ng-controller="StatusController" data-ng-init="getStatus('LastBlockHash')">
<thead data-ng-include src="'/views/includes/infoStatus.html'"></thead>
<thead data-ng-include src="'views/includes/infoStatus.html'"></thead>
<tbody>
<tr>
<td>Last Block Hash (Bitcoind)</td>
<td class="text-right ellipsis"><a href="/block/{{lastblockhash}}">{{lastblockhash}}</a></td>
<td translate>Last Block Hash (Zcashd)</td>
<td class="text-right ellipsis"><a href="block/{{lastblockhash}}">{{lastblockhash}}</a></td>
</tr>
<tr>
<td>Current Blockchain Tip (insight)</td>
<td class="text-right ellipsis"><a href="/block/{{syncTipHash}}">{{syncTipHash}}</a></td>
<td translate>Current Blockchain Tip (insight)</td>
<td class="text-right ellipsis"><a href="block/{{syncTipHash}}">{{syncTipHash}}</a></td>
</tr>
</tbody>
</table>
<h2>Transaction Output Set Information</h2>
<div data-ng-controller="StatusController">
<button data-ng-click="txoutLoading=1;getStatus('TxOutSetInfo')" class="btn btn-default" data-ng-show="!txoutsetinfo.height">
Show Transaction Output data
<span data-ng-show="txoutLoading" class="glyphicon glyphicon-refresh icon-rotate"></span>
</button >
<table class="table" data-ng-show="txoutsetinfo.height" style="table-layout: fixed" >
<thead data-ng-include src="'/views/includes/infoStatus.html'"></thead>
<tbody>
<tr>
<td>Height</td>
<td class="text-right"><a href="/block-index/{{txoutsetinfo.height}}">{{txoutsetinfo.height}}</a></td>
</tr>
<tr>
<td>Best Block</td>
<td class="text-right ellipsis"><a href="/block/{{txoutsetinfo.bestblock}}">{{txoutsetinfo.bestblock}}</a></td>
</tr>
<tr>
<td>Transactions</td>
<td class="text-right"> {{txoutsetinfo.transactions}}</td>
</tr>
<tr>
<td>Transaction Outputs</td>
<td class="text-right">{{txoutsetinfo.txouts}}</td>
</tr>
<tr>
<td>Bytes Serialized</td>
<td class="text-right">{{txoutsetinfo.bytes_serialized}}</td>
</tr>
<tr>
<td>Hash Serialized</td>
<td class="text-right ellipsis">{{txoutsetinfo.hash_serialized}}</td>
</tr>
<tr>
<td>Total Amount</td>
<td class="text-right">{{txoutsetinfo.total_amount}}</td>
</tr>
</tbody>
</table>
</div>
</div> <!-- END OF COL-8 -->
<div class="col-xs-12 col-md-4 col-gray">
<h2>Bitcoin node information</h2>
<h2 translate>Zcash node information</h2>
<table class="table" data-ng-controller="StatusController" data-ng-init="getStatus('Info')">
<thead data-ng-include src="'/views/includes/infoStatus.html'"></thead>
<thead data-ng-include src="'views/includes/infoStatus.html'"></thead>
<tbody>
<tr>
<td>Version</td>
<td translate>Version</td>
<td class="text-right">{{info.version}}</td>
</tr>
<tr>
<td>Protocol version</td>
<td translate>Protocol version</td>
<td class="text-right">{{info.protocolversion}}</td>
</tr>
<tr>
<td>Blocks</td>
<td class="text-right"><a href="/block-index/{{info.blocks}}">{{info.blocks}}</a></td>
<td translate>Blocks</td>
<td class="text-right"><a href="block-index/{{info.blocks}}">{{info.blocks}}</a></td>
</tr>
<tr>
<td>Time Offset</td>
<td translate>Time Offset</td>
<td class="text-right">{{info.timeoffset}}</td>
</tr>
<tr>
<td>Connections to other nodes</td>
<td translate>Connections to other nodes</td>
<td class="text-right">{{info.connections}}</td>
</tr>
<tr>
<td>Mining Difficulty</td>
<td translate>Mining Difficulty</td>
<td class="text-right">{{info.difficulty}}</td>
</tr>
<tr>
<td>Testnet</td>
<td class="text-right">{{info.testnet}}</td>
<td translate>Network</td>
<td class="text-right">{{info.network}}</td>
</tr>
<tr>
<td>Proxy setting</td>
<td translate>Proxy setting</td>
<td class="text-right">{{info.proxy}}</td>
</tr>
<tr>
<td>Info Errors</td>
<td translate>Info Errors</td>
<td class="text-right">{{info.infoErrors}}</td>
</tr>
</tbody>

View File

@ -1,15 +1,22 @@
<div data-ng-include src="'/views/includes/connection.html'"></div>
<div data-ng-include src="'views/includes/connection.html'"></div>
<section data-ng-controller="transactionsController" data-ng-init="findThis()">
<div class="secondary_navbar hidden-xs hidden-sm" scroll data-ng-class="{'hidden': !secondaryNavbar}" data-ng-show="tx.txid" data-ng-init="hideSNavbar=0">
<div class="container" data-ng-if="!hideSNavbar">
<div class="col-md-8 text-left">
<h3>Transaction</h3> {{tx.txid}}
<span class="btn-copy" clip-copy="tx.txid"></span>
<div class="col-md-6 col-lg-7 text-left">
<h3 translate>Transaction</h3>
<div class="ellipsis">
<small>{{tx.txid}}</small>
<span class="btn-copy" clip-copy="tx.txid"></span>
</div>
</div>
<div class="col-md-4">
<span data-ng-show="tx.confirmations" class="txvalues txvalues-success">{{tx.confirmations}} Confirmations</span>
<span data-ng-show="!tx.confirmations" class="txvalues txvalues-danger">Unconfirmed Transaction!</span>
<span class="txvalues txvalues-primary">{{$root.currency.getConvertion(tx.valueOut) || tx.valueOut + ' BTC' }}</span>
<div class="col-md-6 col-lg-5 text-right">
<span data-ng-show="tx.confirmations" class="txvalues
txvalues-success">{{tx.confirmations}}
<span translate>Confirmations</span>
</span>
<span data-ng-show="!tx.confirmations"
class="txvalues txvalues-danger" translate>Unconfirmed Transaction!</span>
<span class="txvalues txvalues-primary">{{$root.currency.getConvertion(tx.valueOut)}}</span>
</div>
</div>
<div class="hide_snavbar">
@ -19,53 +26,96 @@
</a>
</div>
</div>
<div class="ng-cloak" data-ng-cloak data-ng-if="tx.txid">
<h1>Transaction
<div data-ng-if="tx.txid">
<h1><span translate>Transaction</span>
<small data-ng-show="from_vin || from_vout">
<span data-ng-show="from_vin">Input</span>
<span data-ng-show="from_vout">Output</span>
<span data-ng-show="from_vin" translate>Input</span>
<span data-ng-show="from_vout" translate>Output</span>
<span>{{v_index}}</span>
</small>
</h1>
<div class="progress progress-striped active" data-ng-if="!tx.txid">
<div class="progress-bar progress-bar-info" style="width: 100%">
<span>Loading Transaction Details...</span>
<span translate>Loading Transaction Details</span> <span class="loader-gif"></span>
</div>
</div>
<div data-ng-if="tx.txid">
<div class="well well-sm ellipsis">
<strong>Transaction</strong>
<strong translate>Transaction</strong>
<span class="txid text-muted">{{tx.txid}}</span>
<span class="btn-copy" clip-copy="tx.txid"></span>
</div>
<h2>Summary</h2>
<h2 translate>Summary</h2>
<table class="table" style="table-layout: fixed">
<tbody>
<tr>
<td><strong> Size </strong></td>
<td><strong translate>Size</strong></td>
<td class="text-muted text-right">{{tx.size}} (bytes)</td>
</tr>
<tr>
<td><strong>Received Time </strong></td>
<td data-ng-show="tx.firstSeenTs" class="text-muted text-right">{{tx.firstSeenTs * 1000|date:'medium'}}</td>
<td data-ng-show="!tx.firstSeenTs" class="text-muted text-right">N/A</td>
<tr data-ng-show="tx.fees">
<td><strong translate>Fee Rate</strong></td>
<td class="text-muted text-right">{{$root.currency.getConvertion((tx.fees * 1000) / tx.size) + ' per kB'}}</td>
</tr>
<tr>
<td><strong>Mined Time </strong></td>
<td><strong translate>Received Time</strong></td>
<td data-ng-show="tx.time" class="text-muted text-right">{{tx.time * 1000|date:'medium'}}</td>
<td data-ng-show="!tx.time" class="text-muted text-right">N/A</td>
</tr>
<tr>
<td><strong translate>Mined Time</strong></td>
<td data-ng-show="tx.blocktime" class="text-muted text-right">{{tx.blocktime * 1000|date:'medium'}}</td>
<td data-ng-show="!tx.blocktime" class="text-muted text-right">N/A</td>
</tr>
<tr>
<td><strong translate>Included in Block</strong></td>
<td data-ng-show="tx.blockhash" class="text-muted text-right">
<div class="ellipsis">
<a href="block/{{tx.blockhash}}">{{tx.blockhash}}</a>
</div>
<td data-ng-show="!tx.blockhash" class="text-muted text-right">Unconfirmed</td>
</tr>
<tr data-ng-show="tx.locktime">
<td><strong>LockTime </strong></td>
<td><strong>LockTime</strong></td>
<td class="text-muted text-right">{{tx.locktime}}</td>
</tr>
<!-- Overwinter START-->
<tr data-ng-show="tx.version">
<td><strong>Version</strong></td>
<td class="text-muted text-right">{{tx.version}}</td>
</tr>
<tr data-ng-show="tx.fOverwintered">
<td><strong>Overwintered</strong></td>
<td class="text-muted text-right">{{tx.fOverwintered}}</td>
</tr>
<tr data-ng-show="tx.fOverwintered">
<td><strong>VersionGroupId</strong></td>
<td data-ng-show="tx.fOverwintered==true" class="text-muted text-right">
0x{{tx.nVersionGroupId.toString(16).padStart(8, "0")}}
</td>
<td data-ng-show="tx.fOverwintered==false" class="text-muted text-right">N/A</td>
</tr>
<tr data-ng-show="tx.fOverwintered">
<td><strong>Expiry Height</strong></td>
<td class="text-muted text-right">{{tx.nExpiryHeight}}</td>
</tr>
<!-- Overwinter END -->
<tr data-ng-show="tx.isCoinBase">
<td><strong>Coinbase</strong></td>
<td class="text-muted text-right">
<div class="ellipsis">
<span class="btn-copy ng-isolate-scope" clip-copy="tx.vin[0].coinbase"></span>
<span class="ng-binding">{{tx.vin[0].coinbase}}</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h2>Details</h2>
<div class="block-tx ng-cloak" data-ng-cloak data-ng-if="tx.txid">
<div data-ng-include src="'/views/transaction/tx.html'"></div>
<h2 translate>Details</h2>
<div class="block-tx" data-ng-if="tx.txid">
<div data-ng-include src="'views/transaction/tx.html'"></div>
</div>
</div>
</section>

View File

@ -1,9 +1,11 @@
<div class="alert alert-warning" data-ng-show="!txs[0].txid && !loading">There are not transactions involving this address.</div>
<div class="alert alert-warning"
data-ng-show="!txs[0].txid && !loading"
translate>There are no transactions involving this address.</div>
<div class="block-tx" data-ng-show="txs && txs[0].txid" data-ng-repeat="tx in txs">
<div data-ng-include src="'/views/transaction/tx.html'"></div>
<div data-ng-include src="'views/transaction/tx.html'"></div>
</div>
<div class="progress progress-striped active" data-ng-show="loading">
<div class="progress-bar progress-bar-info" style="width: 100%">
<span>Loading Transactions...</span>
<span translate>Loading Transactions...</span>
</div>
</div>

View File

@ -1,57 +1,260 @@
<div class="line-bot row ng-cloak" data-ng-hide="!tx" data-ng-cloak>
<div class="col-xs-12 col-md-8">
<div class="h5 ellipsis">
<a class="btn-expand m10h" href="#" title="Show/Hide items details" data-ng-click="itemsExpanded = !itemsExpanded">
<div class="line-bot row" data-ng-hide="!tx">
<div class="col-xs-7 col-md-8">
<div class="ellipsis">
<a class="btn-expand" title="Show/Hide items details" data-ng-click="itemsExpanded = !itemsExpanded">
<span class="glyphicon glyphicon-plus-sign" data-ng-class="{'glyphicon-minus-sign': itemsExpanded}"></span>
</a>
<a class="txid" href="/tx/{{tx.txid}}">{{tx.txid}}</a>
<a href="tx/{{tx.txid}}">{{tx.txid}}</a>
<span class="btn-copy" clip-copy="tx.txid"></span>
</div>
</div>
<div class="col-xs-12 col-md-4 text-right">
<div class="col-xs-5 col-md-4 text-right text-muted">
<div data-ng-show="tx.firstSeenTs">
first seen at
<span translate>first seen at</span>
<time>{{tx.firstSeenTs * 1000 | date:'medium'}}</time>
</div>
<div data-ng-show="tx.time && !tx.firstSeenTs">
mined at
<div data-ng-show="tx.blocktime && !tx.firstSeenTs">
<span translate>mined</span>
<time>{{tx.time * 1000 | date:'medium'}}</time>
</div>
</div>
</div>
<div class="row line-mid">
<div class="col-md-5">
<div class="row" data-ng-if="tx.isCoinBase">
<div class="col-md-12 transaction-vin-vout" data-ng-repeat="vin in tx.vin">
<div class="col-md-12">
<div class="row" data-ng-if="!tx.bindingSig && (!tx.vjoinsplit || tx.vjoinsplit.length==0)">
<div class="col-md-12 transaction-vin-vout">
<div class="ellipsis">
<span>No Inputs (Newly Generated Coins)</span>
<span translate>No Shielded Spends and Outputs</span>
</div>
</div>
</div>
<div class="row" data-ng-if="!tx.isCoinBase">
<div class="row" data-ng-if="(tx.spendDescs && tx.spendDescs.length > 0) || (tx.outputDescs && tx.outputDescs.length > 0)">
<div class="panel panel-default">
<div class="panel-body transaction-vin-vout">
<div class="col-md-3 col-xs-12">
<div data-ng-if="tx.valueBalance < 0">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(-tx.valueBalance)}}
</div>
<div class="ellipsis">
<span>Public input</span>
</div>
</div>
</div>
<div class="col-md-1 col-xs-12">
<div class="hidden-xs hidden-sm text-center">
<span class="glyphicon glyphicon-chevron-right text-muted"></span>
</div>
<div class="hidden-md hidden-lg text-center">
<span class="glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
<div class="col-md-4 col-xs-12">
<div class="ellipsis text-center">
<span>Shielded Spends ({{tx.spendDescs.length}}) --> Shielded Outputs ({{tx.outputDescs.length}})</span>
</div>
</div>
<div class="col-md-1 col-xs-12">
<div class="hidden-xs hidden-sm text-center">
<span class="glyphicon glyphicon-chevron-right text-muted"></span>
</div>
<div class="hidden-md hidden-lg text-center">
<span class="glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
<div class="col-md-3 col-xs-12">
<div data-ng-if="tx.valueBalance > 0">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(tx.valueBalance)}}
</div>
<div class="ellipsis">
<span>Public output</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row" data-ng-if="(!tx.vjoinsplit || tx.vjoinsplit.length == 0) && !tx.bindingSig">
<div class="col-md-12 transaction-vin-vout">
<div class="ellipsis">
<span translate>No JoinSplits</span>
</div>
</div>
</div>
<div class="row" data-ng-if="tx.vjoinsplit && tx.vjoinsplit.length != 0">
<!-- <<< Simple view -->
<div data-ng-if="!itemsExpanded" data-ng-init="currentJSNoExpanded=0; sizeJSNoExpanded=5">
<div class="panel panel-default" data-ng-repeat="vjs in tx.vjoinsplit| startFrom:currentJSNoExpanded*sizeJSNoExpanded | limitTo:sizeJSNoExpanded">
<div class="panel-body transaction-vin-vout">
<div class="col-md-3 col-xs-12">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(vjs.vpub_old)}}
</div>
<div class="ellipsis">
<span>Public input</span>
</div>
</div>
<div class="col-md-1 col-xs-12">
<div class="hidden-xs hidden-sm text-center">
<span class="glyphicon glyphicon-chevron-right text-muted"></span>
</div>
<div class="hidden-md hidden-lg text-center">
<span class="glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
<div class="col-md-4 col-xs-12">
<div class="ellipsis text-center">
<span>JoinSplit [{{vjs.n}}]</span>
</div>
</div>
<div class="col-md-1 col-xs-12">
<div class="hidden-xs hidden-sm text-center">
<span class="glyphicon glyphicon-chevron-right text-muted"></span>
</div>
<div class="hidden-md hidden-lg text-center">
<span class="glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
<div class="col-md-3 col-xs-12">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(vjs.vpub_new)}}
</div>
<div class="ellipsis">
<span>Public output</span>
</div>
</div>
</div>
</div>
<div class="showmore_collapse text-left" data-ng-show="tx.vjoinsplit.length > 5" data-ng-class="{ 'hidden': itemsExpanded}">
<button type="button" class="btn btn-info btn-sm" ng-hide="sizeJSNoExpanded != tx.vjoinsplit.length" ng-click="currentJSNoExpanded=0; sizeJSNoExpanded=5"><i class="glyphicon glyphicon-chevron-up"></i>
<span translate>Show less</span></button>
<button type="button" class="btn btn-info btn-sm" ng-hide="currentJSNoExpanded >= tx.vjoinsplit.length/sizeJSNoExpanded - 1" ng-click="currentJSNoExpanded=0; sizeJSNoExpanded=tx.vjoinsplit.length"><i class="glyphicon glyphicon-chevron-down"></i>
<span translate>Show more</span></button>
</div>
</div>
<!-- <<< Full view -->
<div data-ng-if="itemsExpanded" data-ng-init="currentJSExpanded=0; sizeJSExpanded=(from_vjs) ? tx.vjoinsplit.length : 5; fromVjsCollapsed=(from_vjs)">
<div data-ng-repeat="vjs in tx.vjoinsplit| startFrom:currentJSExpanded*sizeJSExpanded | limitTo:sizeJSExpanded" data-ng-if="fromVjsCollapsed ? v_index == vjs.n : 1">
<div class="panel panel-default transaction-vin-vout">
<div class="panel-body">
<div class="col-md-3 col-xs-12">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(vjs.vpub_old)}}
</div>
<div class="ellipsis">
<span translate>Public input</span>
</div>
</div>
<div class="col-md-1 col-xs-12">
<div class="hidden-xs hidden-sm text-center">
<span class="glyphicon glyphicon-chevron-right text-muted"></span>
</div>
<div class="hidden-md hidden-lg text-center">
<span class="glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
<div class="col-md-4 col-xs-12">
<div class="ellipsis text-center">
<span>JoinSplit [{{vjs.n}}]</span>
</div>
</div>
<div class="col-md-1 col-xs-12">
<div class="hidden-xs hidden-sm text-center">
<span class="glyphicon glyphicon-chevron-right text-muted"></span>
</div>
<div class="hidden-md hidden-lg text-center">
<span class="glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
<div class="col-md-3 col-xs-12">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(vjs.vpub_new)}}
</div>
<div class="ellipsis">
<span translate>Public output</span>
</div>
</div>
</div> <!-- END OF PANEL BODY -->
</div> <!-- END OF PANEL-DEFAULT -->
</div>
<div class="text-left">
<button type="button" class="btn btn-default btn-sm" data-ng-show="(from_vjs) && tx.vjoinsplit.length > 1" data-ng-disabled="fromVjsCollapsed" data-ng-click="currentJSExpanded=0; sizeJSExpanded=tx.vjoinsplit.length;fromVjsCollapsed=1">
<span translate>Show input</span> #{{ v_index }}</button>
<button type="button" class="btn btn-default btn-sm" data-ng-show="(from_vjs) && tx.vjoinsplit.length > 1" data-ng-disabled="!fromVinCollapsed" data-ng-click="currentJSExpanded=0; sizeJSExpanded=tx.vjoinsplit.length;fromVjsCollapsed=0">
<span translate>Show all</span></button>
</div>
<div class="showmore_collapse text-left" data-ng-show="tx.vjoinsplit.length > 5 && !fromVjsCollapsed" data-ng-class="{ 'hidden': !itemsExpanded}">
<button type="button" class="btn btn-info btn-sm" ng-hide="sizeJSExpanded != tx.vjoinsplit.length" ng-click="currentJSExpanded=0; sizeJSExpanded=5"><i class="glyphicon glyphicon-chevron-up"></i>
<span translate>Show less</span></button>
<button type="button" class="btn btn-info btn-sm" ng-hide="currentJSExpanded >= tx.vjoinsplit.length/sizeJSExpanded - 1" ng-click="currentJSExpanded=0; sizeJSExpanded=tx.vjoinsplit.length"><i class="glyphicon glyphicon-chevron-down"></i>
<span translate>Show more</span></button>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="hidden-xs hidden-sm text-center">
<span class="lead glyphicon glyphicon-chevron-up text-muted"></span>
</div>
</div>
<div class="col-md-6">
<div class="hidden-xs hidden-sm text-center">
<span class="lead glyphicon glyphicon-chevron-down text-muted"></span>
</div>
</div>
</div>
<div class="row line-mid">
<div class="col-md-5">
<div class="row" data-ng-if="tx.vin.length == 0">
<div class="col-md-12 transaction-vin-vout">
<div class="ellipsis">
<span translate>No Inputs</span>
</div>
</div>
</div>
<div class="row" data-ng-if="tx.vin.length != 0 && tx.isCoinBase">
<div class="col-md-12 transaction-vin-vout" data-ng-repeat="vin in tx.vin">
<div class="ellipsis">
<span translate>No Inputs (Newly Generated Coins)</span>
</div>
</div>
</div>
<div class="row" data-ng-if="tx.vin.length != 0 && !tx.isCoinBase">
<!-- <<< Simple view -->
<div data-ng-if="!itemsExpanded" data-ng-init="currentInNoExpanded=0; sizeInNoExpanded=5">
<div class="panel panel-default" data-ng-repeat="vin in tx.vinSimple| startFrom:currentInNoExpanded*sizeInNoExpanded | limitTo:sizeInNoExpanded">
<div class="panel-body transaction-vin-vout">
<div class="pull-right btc-value" data-ng-class="{'text-danger': $root.currentAddr == vin.addr}">
{{$root.currency.getConvertion(vin.value) || vin.value + ' BTC'}}
{{$root.currency.getConvertion(vin.value)}}
</div>
<div class="ellipsis">
<span data-ng-show="vin.notAddr">{{vin.addr}}</span>
<span class="text-muted" title="Current Bitcoin Address" data-ng-show="vin.addr == $root.currentAddr">{{vin.addr}}</span>
<a href="/address/{{vin.addr}}" data-ng-show="!vin.notAddr && vin.addr != $root.currentAddr">{{vin.addr}}</a>
<span class="text-muted" title="Current Zcash Address" data-ng-show="vin.addr == $root.currentAddr">{{vin.addr}}</span>
<a href="address/{{vin.addr}}" data-ng-show="!vin.notAddr && vin.addr != $root.currentAddr">{{vin.addr}}</a>
</div>
<div data-ng-show="vin.unconfirmedInput" class="text-danger"> <span class="glyphicon glyphicon-warning-sign"></span> (Input unconfirmed)</div>
<div data-ng-show="vin.dbError" class="text-danger"> <span class="glyphicon glyphicon-warning-sign"></span> Incoherence in levelDB detected, please resync</div>
<div data-ng-show="vin.doubleSpentTxID" class="text-danger"> <span class="glyphicon glyphicon-warning-sign"></span> Double spent attempt detected. From tx:
<a href="/tx/{{vin.doubleSpentTxID}}">{{vin.doubleSpentTxID}},{{vin.doubleSpentIndex}}</a>
<div data-ng-show="vin.dbError" class="text-danger">
<span class="glyphicon glyphicon-warning-sign"></span>
<span translate>Incoherence in levelDB detected:</span> {{vin.dbError}}
</div>
<div data-ng-show="vin.doubleSpentTxID" class="text-danger">
<span class="glyphicon glyphicon-warning-sign"></span>
<span translate>Double spent attempt detected. From tx:</span>
<a href="tx/{{vin.doubleSpentTxID}}">{{vin.doubleSpentTxID}},{{vin.doubleSpentIndex}}</a>
</div>
</div>
</div>
<div class="showmore_collapse text-right" data-ng-show="tx.vinSimple.length > 5" data-ng-class="{ 'hidden': itemsExpanded}">
<a href="#" ng-hide="sizeInNoExpanded != tx.vinSimple.length" ng-click="currentInNoExpanded=0; sizeInNoExpanded=5"><small>...less</small></a>
<a href="#" ng-hide="currentInNoExpanded >= tx.vinSimple.length/sizeInNoExpanded - 1" ng-click="currentInNoExpanded=0; sizeInNoExpanded=tx.vinSimple.length"><small>more...</small></a>
<div class="showmore_collapse text-left" data-ng-show="tx.vinSimple.length > 5" data-ng-class="{ 'hidden': itemsExpanded}">
<button type="button" class="btn btn-info btn-sm" ng-hide="sizeInNoExpanded != tx.vinSimple.length" ng-click="currentInNoExpanded=0; sizeInNoExpanded=5"><i class="glyphicon glyphicon-chevron-up"></i>
<span translate>Show less</span></button>
<button type="button" class="btn btn-info btn-sm" ng-hide="currentInNoExpanded >= tx.vinSimple.length/sizeInNoExpanded - 1" ng-click="currentInNoExpanded=0; sizeInNoExpanded=tx.vinSimple.length"><i class="glyphicon glyphicon-chevron-down"></i>
<span translate>Show more</span></button>
</div>
</div>
@ -61,28 +264,30 @@
<div class="panel panel-default transaction-vin-vout">
<div class="panel-body">
<div class="pull-right btc-value">
{{$root.currency.getConvertion(vin.value) || vin.value + ' BTC'}}
{{$root.currency.getConvertion(vin.value)}}
</div>
<div class="ellipsis">
<a class="glyphicon glyphicon-chevron-right" href="/tx/{{vin.txid}}/>/{{vin.vout}}" title="Outpoint: {{vin.txid}},{{vin.vout}}"></a>&nbsp;&nbsp;
<a class="glyphicon glyphicon-chevron-right" href="tx/{{vin.txid}}/>/{{vin.vout}}" title="Outpoint: {{vin.txid}},{{vin.vout}}"></a>
<span data-ng-show="vin.notAddr">{{vin.addr}}</span>
<a href="/address/{{vin.addr}}" data-ng-show="!vin.notAddr">{{vin.addr}}</a>
<a href="address/{{vin.addr}}" data-ng-show="!vin.notAddr">{{vin.addr}}</a>
</div>
<div data-ng-show="vin.unconfirmedInput" class="text-danger">
<span class="glyphicon glyphicon-warning-sign"></span> (Input unconfirmed)
<span class="glyphicon glyphicon-warning-sign"></span>
<span translate>(Input unconfirmed)</span>
</div>
<div data-ng-show="vin.dbError" class="text-danger">
<span class="glyphicon glyphicon-warning-sign"></span>
Incoherence in levelDB detected, please resync
<span translate>Incoherence in levelDB detected:</span> {{vin.dbError}}
</div>
<div data-ng-show="vin.doubleSpentTxID" class="text-danger">
<span class="glyphicon glyphicon-warning-sign"></span>
Double spent attempt detected. From tx:
<a href="/tx/{{<vin class=""></vin>doubleSpentTxID}}">{{vin.doubleSpentTxID}},{{vin.doubleSpentIndex}}</a>
<span translate>Double spent attempt detected. From tx:</span>
<a href="tx/{{<vin class=""></vin>doubleSpentTxID}}">{{vin.doubleSpentTxID}},{{vin.doubleSpentIndex}}</a>
</div>
</div> <!-- END OF PANEL BODY -->
</div> <!-- END OF PANEL-DEFAULT -->
<div class="small" style="margin-left:0.7em; word-wrap:break-word;" data-ng-class="{true: 'v_highlight', false: ''}[from_vin == true && v_index == vin.n]" >
<p><strong>Confirmations:</strong> {{vin.confirmations}}</p>
<p><strong>scriptSig</strong></p>
<div data-ng-repeat="item in vin.scriptSig.asm | split:' '" class="">
<p class="col-md-11 ellipsis text-muted">{{item}}</p>
@ -91,12 +296,16 @@
</div>
</div>
<div class="text-left">
<a href="#" data-ng-show="(from_vin) && tx.vin.length > 1" data-ng-class="{'text-muted': fromVinCollapsed}" data-ng-click="currentInExpanded=0; sizeInExpanded=tx.vin.length;fromVinCollapsed=1"><small>show input {{ v_index }}</small></a>
<a href="#" data-ng-show="(from_vin) && tx.vin.length > 1" data-ng-class="{'text-muted': !fromVinCollapsed}" data-ng-click="currentInExpanded=0; sizeInExpanded=tx.vin.length;fromVinCollapsed=0"><small>show all</small></a>
<button type="button" class="btn btn-default btn-sm" data-ng-show="(from_vin) && tx.vin.length > 1" data-ng-disabled="fromVinCollapsed" data-ng-click="currentInExpanded=0; sizeInExpanded=tx.vin.length;fromVinCollapsed=1">
<span translate>Show input</span> #{{ v_index }}</button>
<button type="button" class="btn btn-default btn-sm" data-ng-show="(from_vin) && tx.vin.length > 1" data-ng-disabled="!fromVinCollapsed" data-ng-click="currentInExpanded=0; sizeInExpanded=tx.vin.length;fromVinCollapsed=0">
<span translate>Show all</span></button>
</div>
<div class="showmore_collapse text-right" data-ng-show="tx.vin.length > 5 && !fromVinCollapsed" data-ng-class="{ 'hidden': !itemsExpanded}">
<a href="#" ng-hide="sizeInExpanded != tx.vin.length" ng-click="currentInExpanded=0; sizeInExpanded=5"><small>...less</small></a>
<a href="#" data-ng-class="{true: 'v_highlight_more', false: ''}[from_vin == true && v_index > 5]" ng-hide="currentInExpanded >= tx.vin.length/sizeInExpanded - 1" ng-click="currentInExpanded=0; sizeInExpanded=tx.vin.length"><small>more...</small></a>
<div class="showmore_collapse text-left" data-ng-show="tx.vin.length > 5 && !fromVinCollapsed" data-ng-class="{ 'hidden': !itemsExpanded}">
<button type="button" class="btn btn-info btn-sm" ng-hide="sizeInExpanded != tx.vin.length" ng-click="currentInExpanded=0; sizeInExpanded=5"><i class="glyphicon glyphicon-chevron-up"></i>
<span translate>Show less</span></button>
<button type="button" class="btn btn-info btn-sm" ng-hide="currentInExpanded >= tx.vin.length/sizeInExpanded - 1" ng-click="currentInExpanded=0; sizeInExpanded=tx.vin.length"><i class="glyphicon glyphicon-chevron-down"></i>
<span translate>Show more</span></button>
</div>
</div>
</div>
@ -110,29 +319,38 @@
</div>
</div>
<div class="col-md-6">
<div class="row">
<div class="row" data-ng-if="tx.vout.length == 0">
<div class="col-md-12 transaction-vin-vout">
<div class="ellipsis">
<span translate>No Outputs</span>
</div>
</div>
</div>
<div class="row" data-ng-if="tx.vout.length != 0">
<!-- Simple view >>> -->
<div data-ng-if="!itemsExpanded" data-ng-init="currentOutNoExpanded=0; sizeOutNoExpanded=5">
<div data-ng-repeat="vout in tx.voutSimple| startFrom:currentOutNoExpanded*sizeOutNoExpanded | limitTo:sizeOutNoExpanded">
<div class="transaction-vin-vout panel panel-default">
<div class="panel-body">
<div class="pull-right btc-value" data-ng-class="{'text-success': $root.currentAddr == vout.addr}">
{{$root.currency.getConvertion(vout.value) || vout.value + ' BTC' }}
{{$root.currency.getConvertion(vout.value)}}
<span class="text-danger" data-ng-show="vout.isSpent" tooltip="Output is spent" tooltip-placement="left">(S)</span>
<span class="text-success" data-ng-show="!vout.isSpent" tooltip="Output is unspent" tooltip-placement="left">(U)</span>
</div>
<div class="ellipsis">
<span data-ng-show="vout.notAddr">{{vout.addr}}</span>
<span class="text-muted" title="Current Bitcoin Address" data-ng-show="address == $root.currentAddr" data-ng-repeat="address in vout.addr.split(',')">{{vout.addr}}</span>
<a href="/address/{{address}}" data-ng-show="!vout.notAddr && address != $root.currentAddr" data-ng-repeat="address in vout.addr.split(',')">{{address}}</a>
<span class="text-muted" title="Current Zcash Address" data-ng-show="address == $root.currentAddr" data-ng-repeat="address in vout.addr.split(',')">{{vout.addr}}</span>
<a href="address/{{address}}" data-ng-show="!vout.notAddr && address != $root.currentAddr" data-ng-repeat="address in vout.addr.split(',')">{{address}}</a>
</div>
</div>
</div>
</div>
<div class="showmore_collapse text-right" data-ng-show="tx.voutSimple.length > 5" data-ng-class="{ 'hidden': itemsExpanded}">
<a href="#" ng-hide="sizeOutNoExpanded != tx.voutSimple.length" ng-click="currentOutNoExpanded=0; sizeOutNoExpanded=5"><small>...less</small></a>
<a href="#" ng-hide="currentOutNoExpanded >= tx.voutSimple.length/sizeOutNoExpanded - 1" ng-click="currentOutNoExpanded=0; sizeOutNoExpanded=tx.voutSimple.length"><small>more...</small></a>
<div class="showmore_collapse text-left" data-ng-show="tx.voutSimple.length > 5" data-ng-class="{ 'hidden': itemsExpanded}">
<button type="button" class="btn btn-info btn-sm" ng-hide="sizeOutNoExpanded != tx.voutSimple.length" ng-click="currentOutNoExpanded=0; sizeOutNoExpanded=5"><i class="glyphicon glyphicon-chevron-up"></i>
<span translate>Show less</span></button>
<button type="button" class="btn btn-info btn-sm" ng-hide="currentOutNoExpanded >= tx.voutSimple.length/sizeOutNoExpanded - 1" ng-click="currentOutNoExpanded=0; sizeOutNoExpanded=tx.voutSimple.length"><i class="glyphicon glyphicon-chevron-down"></i>
<span translate>Show more</span></button>
</div>
</div>
@ -142,19 +360,19 @@
<div class="panel panel-default transaction-vin-vout">
<div class="panel-body">
<div class="pull-right btc-value">
<spam>{{$root.currency.getConvertion(vout.value) || vout.value + ' BTC'}}
<span>{{$root.currency.getConvertion(vout.value)}}
<span class="text-success" data-ng-show="!vout.spentTxId" tooltip="Output is unspent" tooltip-placement="left">(U)</span>
<a class="glyphicon glyphicon-chevron-right" data-ng-show="vout.spentTxId" href="/tx/{{vout.spentTxId}}/</{{vout.spentIndex}}" title="Spent at: {{vout.spentTxId}},{{vout.spentIndex}}"></a>&nbsp;&nbsp;
</spam>
<a class="glyphicon glyphicon-chevron-right" data-ng-show="vout.spentTxId" href="tx/{{vout.spentTxId}}/</{{vout.spentIndex}}" title="Spent at: {{vout.spentTxId}},{{vout.spentIndex}}"></a>
</span>
</div>
<div class="ellipsis">
<a href="/address/{{address}}" data-ng-repeat="address in vout.scriptPubKey.addresses">{{address}}</a>
<a href="address/{{address}}" data-ng-repeat="address in vout.scriptPubKey.addresses">{{address}}</a>
</div>
</div>
</div>
<div style="padding-left: 0.7em; padding-bottom: 2em; word-wrap:break-word" data-ng-class="{true: 'v_highlight', false: ''}[from_vout == true && v_index == vout.n]">
<p class="small">
<strong>Type</strong>
<strong translate>Type</strong>
<span class="text-muted">{{vout.scriptPubKey.type}}</span>
</p>
<div class="small">
@ -165,30 +383,32 @@
</div>
</div>
<div class="text-right">
<a href="#" class="text-right" data-ng-show="(from_vout) && tx.vout.length > 1" data-ng-class="{'text-muted': fromVoutCollapsed}" data-ng-click="currentOutExpanded=0; sizeOutExpanded=tx.vout.length;fromVoutCollapsed=1"><small>show output {{ v_index }}</small></a>
<a href="#" class="text-right" data-ng-show="(from_vout) && tx.vout.length > 1" data-ng-class="{'text-muted': !fromVoutCollapsed}" data-ng-click="currentOutExpanded=0; sizeOutExpanded=tx.vout.length;fromVoutCollapsed=0"><small>show all</small></a>
<button type="button" class="btn btn-default btn-sm" data-ng-show="(from_vout) && tx.vout.length > 1" data-ng-disabled="fromVoutCollapsed" data-ng-click="currentOutExpanded=0; sizeOutExpanded=tx.vout.length;fromVoutCollapsed=1">Show output #{{ v_index }}</button>
<button type="button" class="btn btn-default btn-sm" data-ng-show="(from_vout) && tx.vout.length > 1" data-ng-disabled="!fromVoutCollapsed" data-ng-click="currentOutExpanded=0; sizeOutExpanded=tx.vout.length;fromVoutCollapsed=0">Show all</button>
</div>
<div class="showmore_collapse text-right" data-ng-show="tx.vout.length > 5 && !fromVoutCollapsed" data-ng-class="{ 'hidden': !itemsExpanded}">
<a href="#" ng-hide="sizeOutExpanded != tx.vout.length" ng-click="currentOutExpanded=0; sizeOutExpanded=5"><small>...less</small></a>
<a href="#" data-ng-class="{true: 'v_highlight_more', false: ''}[from_vout == true && v_index > 5]" ng-hide="currentOutExpanded >= tx.vout.length/sizeOutExpanded - 1" ng-click="currentOutExpanded=0; sizeOutExpanded=tx.vout.length"><small>more...</small></a>
<div class="showmore_collapse text-left" data-ng-show="tx.vout.length > 5 && !fromVoutCollapsed" data-ng-class="{ 'hidden': !itemsExpanded}">
<button type="button" class="btn btn-info btn-sm" ng-hide="sizeOutExpanded != tx.vout.length" ng-click="currentOutExpanded=0; sizeOutExpanded=5"><i class="glyphicon glyphicon-chevron-up"></i>Show less</button>
<button type="button" class="btn btn-info btn-sm" ng-hide="currentOutExpanded >= tx.vout.length/sizeOutExpanded - 1" ng-click="currentOutExpanded=0; sizeOutExpanded=tx.vout.length"><i class="glyphicon glyphicon-chevron-down"></i> Show more</button>
</div>
</div>
</div>
</div>
</div>
<div class="well well-sm bgwhite ellipsis" data-ng-if="itemsExpanded && !block.hash">
<strong>BlockHash</strong> <a class="text-muted" href="/block/{{tx.blockhash}}">{{tx.blockhash}}</a>
<div class="well well-sm bgwhite ellipsis" data-ng-if="itemsExpanded && !block.hash && tx.blockhash">
<strong translate>Included in Block</strong> <a class="text-muted" href="block/{{tx.blockhash}}">{{tx.blockhash}}</a>
<span class="btn-copy" clip-copy="tx.blockhash"></span>
</div>
<div class="line-top row ng-cloak" data-ng-hide="!tx" data-ng-cloak>
<div class="col-xs-12 col-sm-4 col-md-4">
<span data-ng-show="!tx.isCoinBase && !isNaN(parseFloat(tx.fees))" class="txvalues txvalues-default">Fees: {{$root.currency.getConvertion(tx.fees) || tx.fees + 'BTC'}} </span>
<div class="line-top row" data-ng-hide="!tx">
<div class="col-xs-6 col-sm-4 col-md-4">
<span data-ng-show="!tx.isCoinBase && !isNaN(parseFloat(tx.fees))"
class="txvalues txvalues-default"><span translate>Fee</span>: {{$root.currency.getConvertion(tx.fees)}} </span>
</div>
<div class="col-xs-12 col-sm-8 col-md-8 text-right">
<span data-ng-show="tx.confirmations" class="txvalues txvalues-success">{{tx.confirmations}} Confirmations</span>
<span data-ng-show="!tx.confirmations" class="txvalues txvalues-danger">Unconfirmed Transaction!</span>
<span class="txvalues txvalues-primary">{{$root.currency.getConvertion(tx.valueOut) || tx.valueOut + ' BTC' }}</span>
<div class="col-xs-6 col-sm-8 col-md-8 text-right">
<span data-ng-show="tx.confirmations" class="txvalues
txvalues-success">{{tx.confirmations}} <span translate>Confirmations</span></span>
<span data-ng-show="!tx.confirmations" class="txvalues txvalues-danger" translate>Unconfirmed Transaction!</span>
<span class="txvalues txvalues-primary">{{$root.currency.getConvertion(tx.valueOut)}}</span>
</div>
</div>

View File

@ -0,0 +1,55 @@
<section data-ng-controller="SendRawTransactionController">
<div class="page-header">
<h1>
<span translate>Broadcast Raw Transaction</span>
</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<form name="txForm" class="form-horizontal" role="form" novalidate>
<div class="form-group"
ng-class="{ 'has-error': txForm.rawData.$error.pattern }">
<label for="transaction-rawdata" class="col-sm-2 control-label" translate>
Raw transaction data
</label>
<div class="col-sm-10">
<textarea class="form-control" id="transaction-rawdata" name="rawData"
data-ng-model="transaction" data-ng-pattern="/^[0-9A-Fa-f]+$/"
rows="10" required></textarea>
<span class="help-block" ng-show="txForm.rawData.$error.pattern" translate>
Raw transaction data must be a valid hexadecimal string.
</span>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-default" translate
data-ng-click="send()" data-ng-disabled="!txForm.$valid">
Send transaction
</button>
</div>
</div>
</form>
<div class="row">
<div data-ng-hide="status == 'ready'"
class="col-sm-offset-2 col-sm-10">
<div ng-show="status == 'loading'" translate>
Loading...
</div>
<div ng-show="status == 'sent'" class="alert alert-success" translate>
Transaction succesfully broadcast.<br>Transaction id: {{txid}}
</div>
<div ng-show="status == 'error'" class="alert alert-warning" translate>
An error occured:<br>{{error}}
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-4 col-gray">
<p translate>
This form can be used to broadcast a raw transaction in hex format over
the Zcash network.
</p>
</div>
</div>
</section>