├── .env.example ├── public ├── dist │ └── .gitignore ├── favicon.ico ├── img │ ├── bch-logo.png │ ├── coinex.png │ ├── coinflex.png │ ├── social.png │ ├── honkfaucet.png │ ├── screenshot.jpg │ ├── language-icon.png │ ├── sideshift-ai.png │ ├── verified-empty.png │ ├── bg-header-infobox.png │ ├── screenshot_large.jpg │ ├── verified-checkmark.png │ ├── simple-ledger-protocol-logo.png │ ├── copy.svg │ ├── hamburger_icon.svg │ ├── cashaccount-avatars │ │ ├── emoji_u2666.svg │ │ ├── emoji_u1f95a.svg │ │ ├── emoji_u2709.svg │ │ ├── emoji_u2665.svg │ │ ├── emoji_u2b50.svg │ │ ├── emoji_u1f512.svg │ │ ├── emoji_u1f3b5.svg │ │ ├── emoji_u2660.svg │ │ ├── emoji_u1f511.svg │ │ ├── emoji_u1f388.svg │ │ ├── emoji_u262f.svg │ │ ├── emoji_u2663.svg │ │ ├── emoji_u1f4cb.svg │ │ ├── emoji_u1f4e6.svg │ │ ├── emoji_u1f36d.svg │ │ ├── emoji_u1f514.svg │ │ ├── emoji_u231a.svg │ │ ├── emoji_u1f4bc.svg │ │ ├── emoji_u26f5.svg │ │ ├── emoji_u26bd.svg │ │ ├── emoji_u2600.svg │ │ ├── emoji_u26bd (1).svg │ │ ├── emoji_u26bd (2).svg │ │ ├── emoji_u26bd (3).svg │ │ ├── emoji_u1f3a9.svg │ │ ├── emoji_u1f308_2.svg │ │ ├── emoji_u1f336.svg │ │ ├── emoji_u1f349.svg │ │ ├── emoji_u1f697.svg │ │ ├── emoji_u2708.svg │ │ ├── emoji_u1f334.svg │ │ ├── emoji_u270f.svg │ │ ├── emoji_u1f34b.svg │ │ ├── emoji_u1f50d.svg │ │ ├── emoji_u2602.svg │ │ ├── emoji_u1f6a9.svg │ │ ├── emoji_u1f308.svg │ │ ├── emoji_u1f344.svg │ │ ├── emoji_u1f56f.svg │ │ ├── emoji_u1f332.svg │ │ ├── emoji_u1f9c0.svg │ │ ├── emoji_u1f3a7.svg │ │ ├── emoji_u1f577.svg │ │ └── emoji_u1f380.svg │ ├── search_icon.svg │ ├── loading_blue.svg │ ├── loading_green.svg │ ├── top.svg │ ├── bottom.svg │ ├── slp-logo-white.svg │ └── slp-logo.svg ├── favicon-16x16.png ├── favicon-32x32.png ├── mstile-150x150.png ├── apple-touch-icon.png ├── android-chrome-48x48.png ├── browserconfig.xml ├── site.webmanifest └── safari-pinned-tab.svg ├── .gitignore ├── .DS_Store ├── views ├── address_cashaccount.ejs ├── search_cashaccount_result.ejs ├── error_404_page.ejs ├── token_address.ejs ├── search_token_result.ejs ├── error_notx_page.ejs ├── error_badaddress_page.ejs ├── error_processing_tx_page.ejs ├── token_burn_tx.ejs ├── token_mint_tx.ejs ├── token_tx.ejs ├── address_token.ejs ├── all_tokens_page.ejs ├── all_tokens_token.ejs ├── block_tx.ejs ├── address_burn_tx.ejs ├── index_token.ejs ├── token_child_nft.ejs ├── index_burn_tx.ejs ├── dividend_page.ejs ├── latest_transactions_tx.ejs ├── block_page.ejs └── address_transactions_tx.ejs ├── .eslintrc.js ├── package.json ├── babel.config.json ├── TRANSLATIONS.md ├── README.md ├── src ├── lib │ └── jquery.nice-select.min.js └── css │ └── nice-select.css ├── Makefile └── lang └── zh.json /.env.example: -------------------------------------------------------------------------------- 1 | port=8000 2 | host="localhost" 3 | -------------------------------------------------------------------------------- /public/dist/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | archive 2 | node_modules 3 | tmp 4 | .env 5 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/.DS_Store -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/img/bch-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/bch-logo.png -------------------------------------------------------------------------------- /public/img/coinex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/coinex.png -------------------------------------------------------------------------------- /public/img/coinflex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/coinflex.png -------------------------------------------------------------------------------- /public/img/social.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/social.png -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/img/honkfaucet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/honkfaucet.png -------------------------------------------------------------------------------- /public/img/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/screenshot.jpg -------------------------------------------------------------------------------- /public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/mstile-150x150.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/img/language-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/language-icon.png -------------------------------------------------------------------------------- /public/img/sideshift-ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/sideshift-ai.png -------------------------------------------------------------------------------- /public/img/verified-empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/verified-empty.png -------------------------------------------------------------------------------- /public/android-chrome-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/android-chrome-48x48.png -------------------------------------------------------------------------------- /public/img/bg-header-infobox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/bg-header-infobox.png -------------------------------------------------------------------------------- /public/img/screenshot_large.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/screenshot_large.jpg -------------------------------------------------------------------------------- /public/img/verified-checkmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/verified-checkmark.png -------------------------------------------------------------------------------- /public/img/simple-ledger-protocol-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blockparty-sh/slp-explorer/HEAD/public/img/simple-ledger-protocol-logo.png -------------------------------------------------------------------------------- /views/address_cashaccount.ejs: -------------------------------------------------------------------------------- 1 | <%= name %>#<%= blockheight %>.<%= bits %> 2 | -------------------------------------------------------------------------------- /views/search_cashaccount_result.ejs: -------------------------------------------------------------------------------- 1 |
2 | <%= name %>#<%= blockheight %>.<%= bits %> 3 |
4 | -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2b5797 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /views/error_404_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |

3 |

4 |
5 |

6 |

7 | 8 |

9 |
10 | -------------------------------------------------------------------------------- /views/token_address.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= address.address %> 4 | 5 | 6 | <%= app.util.format_bignum_str(address.token_balance, decimals) %> 7 | 8 | -------------------------------------------------------------------------------- /public/img/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /views/search_token_result.ejs: -------------------------------------------------------------------------------- 1 |
2 | <% if (verified) { %> 3 | 4 | <% } else { %> 5 | 6 | <% } %> 7 |   8 | 9 | <%= token.tokenDetails.name %> $<%= token.tokenDetails.symbol %> 10 |
11 | -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Simpleledger.info Token Explorer", 3 | "short_name": "SLP Explorer", 4 | "description": "Browse and explore tokens built on top of Bitcoin Cash", 5 | "start_url": "/?homescreen=1", 6 | "icons": [ 7 | { 8 | "src": "/img/slp-logo.svg", 9 | "sizes": "257x257" 10 | } 11 | ], 12 | "theme_color": "#60bd6c", 13 | "background_color": "#07212b", 14 | "display": "standalone" 15 | } 16 | -------------------------------------------------------------------------------- /views/error_notx_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |

3 |
<%= txid %>
4 |

5 |
6 |

7 | 8 | 9 | 10 | 11 |

12 |
13 | -------------------------------------------------------------------------------- /views/error_badaddress_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |

3 |
<%= address %>
4 |

5 |
6 |

7 | 8 | 9 | 10 | 11 |

12 |
13 | -------------------------------------------------------------------------------- /views/error_processing_tx_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |

3 |
<%= tx.tx.h %>
4 |

5 |
6 |

7 | 8 | 9 | 10 | 11 |

12 |
13 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'env': { 3 | 'browser': true, 4 | 'es6': true, 5 | }, 6 | 'extends': [ 7 | 'google', 8 | ], 9 | 'globals': { 10 | 'Atomics': 'readonly', 11 | 'SharedArrayBuffer': 'readonly', 12 | }, 13 | 'parserOptions': { 14 | 'ecmaVersion': 2018, 15 | }, 16 | 'rules': { 17 | 'indent': 'off', 18 | 'camelcase': 'off', 19 | 'max-len': 'off', 20 | 'no-invalid-this': 'off', 21 | 'key-spacing': 'off', 22 | 'no-multi-spaces': 'off', 23 | 'object-curly-spacing': 'off', 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /public/img/hamburger_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/token_burn_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_txid(tx.graphTxn.txid) %> 4 | 5 | 6 | 7 | <%= app.util.format_bignum_str(total_burnt) %> 8 | 9 | 10 | <% if (tx.tx && tx.tx.blk) { %> 11 | <%= tx.tx.blk.i %> 12 | <% } else { %> 13 | 14 | <% } %> 15 | 16 | 17 | <% if (tx.tx && tx.tx.blk) { %> 18 | <%= new Date(tx.tx.blk.t*1000).toLocaleString() %> 19 | <% } else { %> 20 | 21 | <% } %> 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /views/token_mint_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_txid(tx.tx.h) %> 4 | 5 | 6 | <%= tx.slp.detail.transactionType %> 7 | <%= app.util.format_bignum_str(tx.slp.detail.outputs[0].amount, tx.slp.detail.decimals) %> 8 | 9 | <% if (tx.blk) { %> 10 | <%= tx.blk.i %> 11 | <% } else { %> 12 | 13 | <% } %> 14 | 15 | 16 | <% if (tx.blk) { %> 17 | <%= new Date(tx.blk.t*1000).toLocaleString() %> 18 | <% } else { %> 19 | 20 | <% } %> 21 | 22 | 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "start": "node server.js" 5 | }, 6 | "dependencies": { 7 | "@babel/cli": "^7.8.4", 8 | "@babel/core": "^7.9.0", 9 | "@babel/plugin-transform-arrow-functions": "^7.8.3", 10 | "@babel/plugin-transform-block-scoping": "^7.8.3", 11 | "@babel/plugin-transform-destructuring": "^7.9.5", 12 | "@babel/plugin-transform-exponentiation-operator": "^7.8.3", 13 | "@babel/polyfill": "^7.8.7", 14 | "@babel/preset-env": "^7.9.5", 15 | "babel-plugin-inline-import": "^3.0.0", 16 | "btoa": "^1.2.1", 17 | "dotenv": "^8.2.0", 18 | "eslint": "^6.8.0", 19 | "eslint-config-google": "^0.14.0", 20 | "express": "^4.17.1", 21 | "isbot": "^2.5.7", 22 | "node-fetch": "^2.6.1", 23 | "puppeteer": "^5.0.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /views/token_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_txid(tx.tx.h) %> 4 | 5 | 6 | <%= app.util.transaction_type_trans(tx.slp.detail.transactionType) %> 7 | 8 | <%= app.extract_sent_amount_from_tx(tx); %> 9 | 10 | 11 | <% if (tx.blk) { %> 12 | <%= tx.blk.i %> 13 | <% } else { %> 14 | 15 | <% } %> 16 | 17 | 18 | <% if (tx.blk) { %> 19 | <%= new Date(tx.blk.t*1000).toLocaleString() %> 20 | <% } else { %> 21 | 22 | <% } %> 23 | 24 | 25 | -------------------------------------------------------------------------------- /babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/env", { 5 | "targets": { 6 | "edge": "17", 7 | "firefox": "60", 8 | "chrome": "67", 9 | "safari": "11.1" 10 | } 11 | } 12 | ] 13 | ], 14 | "plugins": [ 15 | "@babel/plugin-transform-arrow-functions", 16 | "@babel/plugin-transform-block-scoped-functions", 17 | "@babel/plugin-transform-for-of", 18 | "@babel/plugin-transform-spread", 19 | "@babel/plugin-transform-destructuring", 20 | ["@babel/plugin-transform-block-scoping", { 21 | "throwIfClosureRequired": false 22 | }], 23 | "@babel/plugin-transform-exponentiation-operator", 24 | ["babel-plugin-inline-import", { 25 | "extensions": [ 26 | ".json", 27 | ".ejs" 28 | ] 29 | }] 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /views/address_token.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | <%= app.util.compress_tokenid(token.token[0].tokenDetails.tokenIdHex) %> 6 | 7 | 8 |
9 | 10 | 11 |
12 | 13 | <%= token.token[0].tokenDetails.name %> 14 |
15 | 16 | <%= token.token[0].tokenDetails.symbol %> 17 | <%= app.util.format_bignum_str(token.slpAmount, token.token[0].tokenDetails.decimals) %> 18 | 19 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2666.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /TRANSLATIONS.md: -------------------------------------------------------------------------------- 1 | # Translations 2 | 3 | It is very important people can learn about SLP in their native language. We have used i18next to be able to provide translations on the site for users. 4 | 5 | 6 | ## Translating Site 7 | 8 | If you would like to contribute to translating this site: 9 | 10 | * Copy `lang/en.json` to a new file. 11 | * Translate the values in the file after the ":" symbol 12 | * Open a PR or issue here, or contact `@Blockparty_Sh` on Telegram 13 | 14 | ## Fixing Error 15 | 16 | If you noticed something that could be worded better: 17 | 18 | * Look inside the `lang` folder for the corresponding [language code](https://www.andiamo.co.uk/resources/iso-language-codes/) 19 | * Search for the phrase that has error 20 | * Open a PR or issue here, or contact `@Blockparty_Sh` on Telegram with the fixed line. 21 | 22 | 23 | # Thank you to translators 24 | 25 | * Bangla -- @NajmusSakib 26 | * Filipino -- @Sjbch 27 | * Hindi -- NajmusSakib 28 | * Spanish -- @kriker007 29 | * Yoruba -- @Osunbiyi 30 | * Portuguese -- @criptoph 31 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f95a.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/all_tokens_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 |
7 |
8 |
9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
    25 |
26 |
27 |
28 |
29 |
30 | -------------------------------------------------------------------------------- /public/img/search_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/all_tokens_token.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_tokenid(token.tokenDetails.tokenIdHex) %> 4 | 5 | 6 | 7 |
8 | 9 | <%= token.tokenDetails.symbol %> 10 |
11 | 12 | <%= app.util.compress_string(token.tokenDetails.name) %> 13 | <%= Number(token.tokenStats.approx_txns_since_genesis).toLocaleString() %> 14 | 15 | <% if (token.tokenDetails.documentUri) { %> 16 | <% const url = app.util.document_link(token.tokenDetails.documentUri); %> 17 | <% if (url.length) { %> 18 | <%= app.util.compress_string(token.tokenDetails.documentUri) %> 19 | <% } else { %> 20 | <%= app.util.compress_string(token.tokenDetails.documentUri) %> 21 | <% } %> 22 | <% } %> 23 | 24 | 25 | -------------------------------------------------------------------------------- /views/block_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_txid(tx.tx.h) %> 4 | 5 | 6 | <%= app.util.transaction_type_trans(tx.slp.detail.transactionType) %> 7 | 8 | <% if (tx.slp.detail.transactionType === 'SEND') { %> 9 | <%= app.extract_sent_amount_from_tx(tx); %> 10 | <% } %> 11 | <% if (tx.slp.detail.transactionType === 'GENESIS' 12 | || tx.slp.detail.transactionType === 'MINT') { %> 13 | <%= tx.slp.detail.outputs[0].amount %> 14 | <% } %> 15 | 16 | 17 |
18 | 19 | <% if (tx.token[0].tokenDetails.symbol.length > 0) { %> 20 | 21 | <%= tx.token[0].tokenDetails.name %> $<%= tx.token[0].tokenDetails.symbol %> 22 | 23 | <% } else { %> 24 | 25 | <% } %> 26 |
27 | 28 | 29 | -------------------------------------------------------------------------------- /public/img/loading_blue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/loading_green.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/address_burn_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_txid(tx.graphTxn.txid) %> 4 | 5 | 6 | 7 | <%= app.util.format_bignum_str(total_burnt) %> 8 | 9 | 10 |
11 | 12 | <% if (tx.token[0].tokenDetails.symbol.length > 0) { %> 13 | <%= tx.token[0].tokenDetails.name %> $<%= tx.token[0].tokenDetails.symbol %> 14 | <% } else { %> 15 | 16 | <% } %> 17 |
18 | 19 | 20 | <% if (tx.tx && tx.tx.blk) { %> 21 | <%= tx.tx.blk.i %> 22 | <% } else { %> 23 | 24 | <% } %> 25 | 26 | 27 | <% if (tx.tx && tx.tx.blk) { %> 28 | <%= new Date(tx.tx.blk.t*1000).toLocaleString() %> 29 | <% } else { %> 30 | 31 | <% } %> 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/img/top.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 6 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2709.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/index_token.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | <%= app.util.compress_tokenid(tx.slp.detail.tokenIdHex) %> 6 | 7 | 8 |
9 | 10 | 11 |
12 | <% if (tx.token.length > 0) { %> 13 | 14 | <% if (tx.token[0].tokenDetails.symbol.length > 0) { %> 15 | <%= tx.token[0].tokenDetails.name %> $<%= tx.token[0].tokenDetails.symbol %> 16 | <% } else { %> 17 | 18 | <% } %> 19 | <% } else { console.log('TODO: remove when mongo transactions fix this', tx); } %> 20 |
21 | 22 | 23 | <% if (tx.blk) { %> 24 | <%= tx.blk.i %> 25 | <% } else { %> 26 | 27 | <% } %> 28 | 29 | 30 | <% if (tx.blk) { %> 31 | <%= new Date(tx.blk.t*1000).toLocaleString() %> 32 | <% } else { %> 33 | 34 | <% } %> 35 | 36 | 37 | -------------------------------------------------------------------------------- /views/token_child_nft.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | <%= app.util.compress_tokenid(token.tokenDetails.tokenIdHex) %> 6 | 7 | 8 |
9 | 10 | 11 |
12 | 13 | 14 | <% if (token.tokenDetails.symbol) { %> 15 | <%= token.tokenDetails.symbol %> 16 | <% } else { %> 17 | 18 | <% } %> 19 | 20 |
21 | 22 | 23 |
24 | 25 | <% if (token.tokenDetails.name) { %> 26 | <%= token.tokenDetails.name %> 27 | <% } else { %> 28 | [none] 29 | <% } %> 30 | 31 |
32 | 33 | 34 |
35 | <% if (token.tokenStats.block_created) { %> 36 | <%= token.tokenStats.block_created %> 37 | <% } else { %> 38 | 39 | <% } %> 40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2665.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/index_burn_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= app.util.compress_txid(tx.graphTxn.txid) %> 4 | 5 | 6 | 7 |
8 | <% if (tx.token.length > 0) { %> 9 | 10 | <% if (tx.token[0].tokenDetails.symbol.length > 0) { %> 11 | <%= tx.token[0].tokenDetails.name %> $<%= tx.token[0].tokenDetails.symbol %> 12 | <% } else { %> 13 | 14 | <% } %> 15 | <% } else { console.log('TODO: remove when mongo transactions fix this', tx); } %> 16 |
17 | 18 | 19 | <%= app.util.format_bignum_str(total_burnt) %> 20 | 21 | 22 | <% if (tx.tx && tx.tx.blk) { %> 23 | <%= tx.tx.blk.i %> 24 | <% } else { %> 25 | 26 | <% } %> 27 | 28 | 29 | <% if (tx.tx && tx.tx.blk) { %> 30 | <%= new Date(tx.tx.blk.t*1000).toLocaleString() %> 31 | <% } else { %> 32 | 33 | <% } %> 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2b50.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 18 | 24 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f512.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f3b5.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SLP Token Explorer 2 | 3 | A open source block explorer for Bitcoin Cash tokens based on the Simple Ledger Protocol (SLP). 4 | 5 | ![screenshot](/img/screenshot_large.jpg) 6 | 7 | ## Translations 8 | 9 | Please see [TRANSLATIONS.md](TRANSLATIONS.md). 10 | 11 | ## How to add Token Icon? 12 | 13 | Open a PR at https://github.com/kosinusbch/slp-token-icons 14 | 15 | ## Token Verification 16 | 17 | The explorer has a list of "verified" tokens in `public/verified_tokens.json`. This is to help reduce the chance of someone namesquatting to perform a con. You should always verify the token id yourself to be sure, but since most people are too lazy to do that there is a checkmark that will appear next to tokens in the search dropdown which shows if they are in the verified list. 18 | 19 | If you would like your token to be considered verified open a PR adding the token id to the list and provide some proof you are the owner of the token. 20 | 21 | ## Building 22 | 23 | You need `Make`, `curl`, `npm` installed. 24 | 25 | For running puppeteer you need additional libraries: 26 | 27 | ``` 28 | sudo apt install libx11-xcb-dev libxcb-dri3-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxi-dev libxtst-dev libnss3-dev libcups2-dev libxss-dev libxrandr-dev libgbm-devlibasound2-dev libatk1.0-dev libatk-bridge2.0-dev libpangocairo-1.0-0 libgtk-3-dev 29 | ``` 30 | 31 | To actually build and start perform the following: 32 | 33 | ``` 34 | cp .env.example .env 35 | npm i 36 | make 37 | npm start 38 | ``` 39 | 40 | ## Credits 41 | 42 | [blockparty-sh](https://github.com/blockparty-sh) for all the dev work, [James Cramer](https://github.com/jcramer) ([simpleledger](https://github.com/simpleledger)), [kosinusbch](https://github.com/kosinusbch) for stylesheet, and [Evan](https://twitter.com/evanluza) from bitcoin.com for original design files 43 | -------------------------------------------------------------------------------- /public/img/bottom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 7@2x 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /views/dividend_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 |
7 |
8 |
9 | 10 | 11 | 15 | 18 | 19 | 20 | 24 | 27 | 28 | 29 | 33 | 36 | 37 | 38 | 42 | 43 | 44 |
12 | 13 |

14 |
16 | 17 |
21 | 22 |

23 |
25 | 26 |
30 | 31 |

32 |
34 | 35 |
39 | 40 |

41 |
45 | 46 |

47 |     
48 |
49 |
50 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2660.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/latest_transactions_tx.ejs: -------------------------------------------------------------------------------- 1 | <% const sent_amount = app.extract_sent_amount_from_tx(tx); %> 2 | 3 | 4 |
5 | <%= app.util.compress_txid(tx.tx.h) %> 6 | 7 |
8 | 9 | 10 |
11 | 12 | 13 | <% if (tx.slp.detail.symbol || tx.slp.detail.name) { %> 14 | <%= tx.slp.detail.name %> $<%= tx.slp.detail.symbol %> 15 | <% } else if (tx.token[0].tokenDetails.symbol || tx.token[0].tokenDetails.tokenIdHex) { %> 16 | <%= tx.token[0].tokenDetails.name %> $<%= tx.token[0].tokenDetails.symbol %> 17 | <% } else { %> 18 | 19 | <% } %> 20 | 21 |
22 | 23 | 24 | <%= sent_amount %> 25 | 26 | 27 |
28 | <% if(tx.token[0].tokenDetails.versionType === 1) { %><% } %> 29 | <% if(tx.token[0].tokenDetails.versionType === 129) { %><% } %> 30 | <% if(tx.token[0].tokenDetails.versionType === 65) { %> 31 | 32 | <% } %> 33 |
34 | 35 | 36 |
37 | <% if (tx.blk) { %> 38 | <%= tx.blk.i %> 39 | <% } else { %> 40 | 41 | <% } %> 42 |
43 | 44 | 45 |
46 | <% if (tx.blk) { %> 47 | <%= new Date(tx.blk.t*1000).toLocaleString() %> 48 | <% } else { %> 49 | 50 | <% } %> 51 |
52 | 53 | 54 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f511.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f388.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u262f.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2663.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f4cb.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f4e6.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 16 | 17 | 19 | 20 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /views/block_page.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | <% if (height !== 'mempool') { %> 5 |

<%= height %> | ... transactions

6 |
7 | 8 | 9 | 10 | 11 | <% if (next_block_exists) { %> 12 | 13 | 14 | 15 | <% } else { %> 16 | 17 | 18 | 19 | <% } %> 20 | 21 | 22 | 23 | 24 | <% } else { %> 25 |

| ... transactions

26 |
27 | 28 | 29 | 30 | <% } %> 31 |
32 |
33 | 34 |
35 |
36 |

(...)

37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 |
    52 |
53 |
54 |
55 |
56 |
57 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f36d.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f514.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u231a.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/lib/jquery.nice-select.min.js: -------------------------------------------------------------------------------- 1 | /* jQuery Nice Select - v1.0 2 | https://github.com/hernansartorio/jquery-nice-select 3 | Made by Hernán Sartorio */ 4 | !function(e){e.fn.niceSelect=function(t){function s(t){t.after(e("
").addClass("nice-select").addClass(t.attr("class")||"").addClass(t.attr("disabled")?"disabled":"").attr("tabindex",t.attr("disabled")?null:"0").html(''));var s=t.next(),n=t.find("option"),i=t.find("option:selected");s.find(".current").html(i.data("display")||i.text()),n.each(function(t){var n=e(this),i=n.data("display");s.find("ul").append(e("
  • ").attr("data-value",n.val()).attr("data-display",i||null).addClass("option"+(n.is(":selected")?" selected":"")+(n.is(":disabled")?" disabled":"")).html(n.text()))})}if("string"==typeof t)return"update"==t?this.each(function(){var t=e(this),n=e(this).next(".nice-select"),i=n.hasClass("open");n.length&&(n.remove(),s(t),i&&t.next().trigger("click"))}):"destroy"==t?(this.each(function(){var t=e(this),s=e(this).next(".nice-select");s.length&&(s.remove(),t.css("display",""))}),0==e(".nice-select").length&&e(document).off(".nice_select")):console.log('Method "'+t+'" does not exist.'),this;this.hide(),this.each(function(){var t=e(this);t.next().hasClass("nice-select")||s(t)}),e(document).off(".nice_select"),e(document).on("click.nice_select",".nice-select",function(t){var s=e(this);e(".nice-select").not(s).removeClass("open"),s.toggleClass("open"),s.hasClass("open")?(s.find(".option"),s.find(".focus").removeClass("focus"),s.find(".selected").addClass("focus")):s.focus()}),e(document).on("click.nice_select",function(t){0===e(t.target).closest(".nice-select").length&&e(".nice-select").removeClass("open").find(".option")}),e(document).on("click.nice_select",".nice-select .option:not(.disabled)",function(t){var s=e(this),n=s.closest(".nice-select");n.find(".selected").removeClass("selected"),s.addClass("selected");var i=s.data("display")||s.text();n.find(".current").text(i),n.prev("select").val(s.data("value")).trigger("change")}),e(document).on("keydown.nice_select",".nice-select",function(t){var s=e(this),n=e(s.find(".focus")||s.find(".list .option.selected"));if(32==t.keyCode||13==t.keyCode)return s.hasClass("open")?n.trigger("click"):s.trigger("click"),!1;if(40==t.keyCode){if(s.hasClass("open")){var i=n.nextAll(".option:not(.disabled)").first();i.length>0&&(s.find(".focus").removeClass("focus"),i.addClass("focus"))}else s.trigger("click");return!1}if(38==t.keyCode){if(s.hasClass("open")){var l=n.prevAll(".option:not(.disabled)").first();l.length>0&&(s.find(".focus").removeClass("focus"),l.addClass("focus"))}else s.trigger("click");return!1}if(27==t.keyCode)s.hasClass("open")&&s.trigger("click");else if(9==t.keyCode&&s.hasClass("open"))return!1});var n=document.createElement("a").style;return n.cssText="pointer-events:auto","auto"!==n.pointerEvents&&e("html").addClass("no-csspointerevents"),this}}(jQuery); -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f4bc.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/slp-logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 11 | 12 | 21 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /public/img/slp-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 11 | 12 | 21 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u26f5.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u26bd.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2600.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u26bd (1).svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u26bd (2).svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u26bd (3).svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f3a9.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f308_2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f336.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/address_transactions_tx.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 | <%= app.util.compress_txid(tx.tx.h) %> 5 | 6 |
    7 | 8 | 9 |
    10 | <% if (tx.slp.detail.transactionType === 'SEND') { %> 11 | <% console.log(tx); %> 12 | <% if (tx.graph && tx.graph[0]) { %> 13 | <% if (tx.graph[0].graphTxn.inputs.filter((v) => v.address === address).length) {%> 14 | 15 | <% } else if (tx.graph[0].graphTxn.outputs.filter((v) => v.address === address).length) {%> 16 | 17 | <% } else { %> 18 | 19 | <% } %> 20 | <% } else { %> 21 | <% if (tx.in.filter((v) => v.e.a === address).length) {%> 22 | 23 | <% } else if (tx.out.filter((v) => v.e.a === address).length) {%> 24 | 25 | <% } else { %> 26 | 27 | <% } %> 28 | <% } %> 29 | <% } else { %> 30 | <%= tx.slp.detail.transactionType %> 31 | <% } %> 32 |
    33 | 34 | 35 | <% if (tx.slp.detail.transactionType === 'SEND') { %> 36 | <% if (tx.graph && tx.graph[0]) { %> 37 | <% if (tx.graph[0].graphTxn.inputs.filter((v) => v.address === address).length) {%> 38 | <%= app.extract_sent_amount_from_tx(tx, address) %> 39 | <% } else if (tx.graph[0].graphTxn.outputs.filter((v) => v.address === address).length) {%> 40 | <%= app.extract_recv_amount_from_tx(tx, address) %> 41 | <% } else { %> 42 | <%= app.extract_sent_amount_from_tx(tx, address) %> 43 | <% } %> 44 | <% } else { %> 45 | <% if (tx.in.filter((v) => v.e.a === address).length) {%> 46 | <%= app.extract_sent_amount_from_tx(tx, address) %> 47 | <% } else if (tx.out.filter((v) => v.e.a === address).length) {%> 48 | <%= app.extract_recv_amount_from_tx(tx, address) %> 49 | <% } else { %> 50 | <%= app.extract_sent_amount_from_tx(tx, address) %> 51 | <% } %> 52 | <% } %> 53 | <% } %> 54 | <% if (tx.slp.detail.transactionType === 'GENESIS' 55 | || tx.slp.detail.transactionType === 'MINT') { %> 56 | <%= tx.slp.detail.outputs[0].amount %> 57 | <% } %> 58 | 59 | 60 |
    61 | 62 | <% if (tx.token[0].tokenDetails.symbol.length > 0) { %> 63 | <%= tx.token[0].tokenDetails.name %> $<%= tx.token[0].tokenDetails.symbol %> 64 | <% } else if (tx.token[0].tokenDetails.name.length > 0) { %> 65 | <%= tx.token[0].tokenDetails.name %> 66 | <% } else { %> 67 | 68 | <% } %> 69 |
    70 | 71 | 72 |
    73 | <% if (tx.blk) { %> 74 | <%= tx.blk.i %> 75 | <% } else { %> 76 | 77 | <% } %> 78 |
    79 | 80 | 81 | <% if (tx.blk) { %> 82 | <%= new Date(tx.blk.t*1000).toLocaleString() %> 83 | <% } else { %> 84 | 85 | <% } %> 86 | 87 | 88 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f349.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f697.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2708.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CURL := curl --create-dirs 2 | LINTER := npx eslint 3 | RM := rm -rf 4 | UNZIP := unzip 5 | 6 | LANGS := $(wildcard lang/*.json) 7 | VIEWS := $(wildcard views/*.ejs) 8 | 9 | all: public/dist/combined.js public/dist/app.js public/dist/combined.css 10 | 11 | public/dist/app.js: src/app.js babel.config.json public/verified_tokens.json public/group_icon_repos.json $(LANGS) $(VIEWS) 12 | npx babel $< > $@ 13 | 14 | public/dist/combined.js: build/unpkg.com/core-js-bundle@3.6.5/minified.js \ 15 | build/unpkg.com/jquery@3.3.1/dist/jquery.min.js \ 16 | build/unpkg.com/@popperjs/core@2.2.2/dist/umd/popper.min.js \ 17 | build/unpkg.com/tippy.js@6.1.1/dist/tippy-bundle.umd.min.js \ 18 | build/unpkg.com/ejs@3.0.2/ejs.min.js \ 19 | build/cdn.plot.ly/plotly-1.2.0.min.js \ 20 | build/cdnjs.cloudflare.com/ajax/libs/jquery.devbridge-autocomplete/1.4.9/jquery.autocomplete.min.js \ 21 | build/cdn.jsdelivr.net/npm/jdenticon@2.1.1 \ 22 | build/cdnjs.cloudflare.com/ajax/libs/bignumber.js/9.0.0/bignumber.min.js \ 23 | build/cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.min.js \ 24 | build/unpkg.com/bchaddrjs-slp@0.2.8/dist/bchaddrjs-slp-0.2.8.min.js \ 25 | build/unpkg.com/cytoscape@3.14.1/dist/cytoscape.min.js \ 26 | build/unpkg.com/klayjs@0.4.1/klay.js \ 27 | build/unpkg.com/clipboard@2.0.1/dist/clipboard.min.js \ 28 | build/unpkg.com/i18next@19.4.1/dist/umd/i18next.min.js \ 29 | build/unpkg.com/i18next-browser-languagedetector@4.0.2/i18nextBrowserLanguageDetector.min.js \ 30 | src/lib/cytoscape-klay.js \ 31 | src/lib/buffer.min.js \ 32 | src/lib/qrcode.min.js \ 33 | src/lib/EventSource.js \ 34 | src/lib/jquery.nice-select.min.js 35 | cat $^ > $@ 36 | 37 | build/unpkg.com/core-js-bundle@3.6.5/minified.js: 38 | $(CURL) https://unpkg.com/core-js-bundle@3.6.5/minified.js -o $@ 39 | 40 | build/unpkg.com/jquery@3.3.1/dist/jquery.min.js: 41 | $(CURL) https://unpkg.com/jquery@3.3.1/dist/jquery.min.js -o $@ 42 | 43 | build/unpkg.com/@popperjs/core@2.2.2/dist/umd/popper.min.js: 44 | $(CURL) https://unpkg.com/@popperjs/core@2.2.2/dist/umd/popper.min.js -o $@ 45 | 46 | build/unpkg.com/tippy.js@6.1.1/dist/tippy-bundle.umd.min.js: 47 | $(CURL) https://unpkg.com/tippy.js@6.1.1/dist/tippy-bundle.umd.min.js -o $@ 48 | 49 | build/unpkg.com/ejs@3.0.2/ejs.min.js: 50 | $(CURL) https://unpkg.com/ejs@3.0.2/ejs.min.js -o $@ 51 | 52 | build/cdn.plot.ly/plotly-1.2.0.min.js: 53 | $(CURL) https://cdn.plot.ly/plotly-1.2.0.min.js -o $@ 54 | 55 | build/cdnjs.cloudflare.com/ajax/libs/jquery.devbridge-autocomplete/1.4.9/jquery.autocomplete.min.js: 56 | $(CURL) https://cdnjs.cloudflare.com/ajax/libs/jquery.devbridge-autocomplete/1.4.9/jquery.autocomplete.min.js -o $@ 57 | 58 | build/cdn.jsdelivr.net/npm/jdenticon@2.1.1: 59 | $(CURL) https://cdn.jsdelivr.net/npm/jdenticon@2.1.1 -o $@ 60 | 61 | build/cdnjs.cloudflare.com/ajax/libs/bignumber.js/9.0.0/bignumber.min.js: 62 | $(CURL) https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/9.0.0/bignumber.min.js -o $@ 63 | 64 | build/cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.min.js: 65 | $(CURL) https://cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.min.js -o $@ 66 | 67 | build/unpkg.com/bchaddrjs-slp@0.2.8/dist/bchaddrjs-slp-0.2.8.min.js: 68 | $(CURL) https://unpkg.com/bchaddrjs-slp@0.2.8/dist/bchaddrjs-slp-0.2.8.min.js -o $@ 69 | 70 | build/unpkg.com/cytoscape@3.14.1/dist/cytoscape.min.js: 71 | $(CURL) https://unpkg.com/cytoscape@3.14.1/dist/cytoscape.min.js -o $@ 72 | 73 | build/unpkg.com/klayjs@0.4.1/klay.js: 74 | $(CURL) https://unpkg.com/klayjs@0.4.1/klay.js -o $@ 75 | 76 | build/unpkg.com/clipboard@2.0.1/dist/clipboard.min.js: 77 | $(CURL) https://unpkg.com/clipboard@2.0.1/dist/clipboard.min.js -o $@ 78 | 79 | build/unpkg.com/i18next@19.4.1/dist/umd/i18next.min.js: 80 | $(CURL) https://unpkg.com/i18next@19.4.1/dist/umd/i18next.min.js -o $@ 81 | 82 | build/unpkg.com/i18next-browser-languagedetector@4.0.2/i18nextBrowserLanguageDetector.min.js: 83 | $(CURL) https://unpkg.com/i18next-browser-languagedetector@4.0.2/i18nextBrowserLanguageDetector.min.js -o $@ 84 | 85 | public/dist/combined.css: src/css/nice-select.css src/css/explorer.css 86 | cat $^ > $@ 87 | 88 | .PHONY: clean lint 89 | 90 | clean: 91 | $(RM) build/* public/dist/* 92 | 93 | lint: 94 | $(LINTER) src/app.js 95 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f334.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u270f.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f34b.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f50d.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/css/nice-select.css: -------------------------------------------------------------------------------- 1 | .nice-select { 2 | -webkit-tap-highlight-color: transparent; 3 | background-color: #fff; 4 | border-radius: 5px; 5 | border: solid 1px #e8e8e8; 6 | box-sizing: border-box; 7 | clear: both; 8 | cursor: pointer; 9 | display: block; 10 | float: left; 11 | font-family: inherit; 12 | font-size: 14px; 13 | font-weight: normal; 14 | height: 42px; 15 | line-height: 40px; 16 | outline: none; 17 | padding-left: 18px; 18 | padding-right: 30px; 19 | position: relative; 20 | text-align: left !important; 21 | -webkit-transition: all 0.2s ease-in-out; 22 | transition: all 0.2s ease-in-out; 23 | -webkit-user-select: none; 24 | -moz-user-select: none; 25 | -ms-user-select: none; 26 | user-select: none; 27 | white-space: nowrap; 28 | width: auto; } 29 | .nice-select:hover { 30 | border-color: #dbdbdb; } 31 | .nice-select:active, .nice-select.open, .nice-select:focus { 32 | border-color: #999; } 33 | .nice-select:after { 34 | border-bottom: 2px solid #999; 35 | border-right: 2px solid #999; 36 | content: ''; 37 | display: block; 38 | height: 5px; 39 | margin-top: -4px; 40 | pointer-events: none; 41 | position: absolute; 42 | right: 12px; 43 | top: 50%; 44 | -webkit-transform-origin: 66% 66%; 45 | -ms-transform-origin: 66% 66%; 46 | transform-origin: 66% 66%; 47 | -webkit-transform: rotate(45deg); 48 | -ms-transform: rotate(45deg); 49 | transform: rotate(45deg); 50 | -webkit-transition: all 0.15s ease-in-out; 51 | transition: all 0.15s ease-in-out; 52 | width: 5px; } 53 | .nice-select.open:after { 54 | -webkit-transform: rotate(-135deg); 55 | -ms-transform: rotate(-135deg); 56 | transform: rotate(-135deg); } 57 | .nice-select.open .list { 58 | opacity: 1; 59 | pointer-events: auto; 60 | -webkit-transform: scale(1) translateY(0); 61 | -ms-transform: scale(1) translateY(0); 62 | transform: scale(1) translateY(0); } 63 | .nice-select.disabled { 64 | border-color: #ededed; 65 | color: #999; 66 | pointer-events: none; } 67 | .nice-select.disabled:after { 68 | border-color: #cccccc; } 69 | .nice-select.wide { 70 | width: 100%; } 71 | .nice-select.wide .list { 72 | left: 0 !important; 73 | right: 0 !important; } 74 | .nice-select.right { 75 | float: right; } 76 | .nice-select.right .list { 77 | left: auto; 78 | right: 0; } 79 | .nice-select.small { 80 | font-size: 12px; 81 | height: 36px; 82 | line-height: 34px; } 83 | .nice-select.small:after { 84 | height: 4px; 85 | width: 4px; } 86 | .nice-select.small .option { 87 | line-height: 34px; 88 | min-height: 34px; } 89 | .nice-select .list { 90 | background-color: #fff; 91 | border-radius: 5px; 92 | box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11); 93 | box-sizing: border-box; 94 | margin-top: 4px; 95 | opacity: 0; 96 | overflow: hidden; 97 | padding: 0; 98 | pointer-events: none; 99 | position: absolute; 100 | top: 100%; 101 | left: 0; 102 | -webkit-transform-origin: 50% 0; 103 | -ms-transform-origin: 50% 0; 104 | transform-origin: 50% 0; 105 | -webkit-transform: scale(0.75) translateY(-21px); 106 | -ms-transform: scale(0.75) translateY(-21px); 107 | transform: scale(0.75) translateY(-21px); 108 | -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; 109 | transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; 110 | z-index: 9; } 111 | .nice-select .list:hover .option:not(:hover) { 112 | background-color: transparent !important; } 113 | .nice-select .option { 114 | cursor: pointer; 115 | font-weight: 400; 116 | line-height: 40px; 117 | list-style: none; 118 | min-height: 40px; 119 | outline: none; 120 | padding-left: 18px; 121 | padding-right: 29px; 122 | text-align: left; 123 | -webkit-transition: all 0.2s; 124 | transition: all 0.2s; } 125 | .nice-select .option:hover, .nice-select .option.focus, .nice-select .option.selected.focus { 126 | background-color: #f6f6f6; } 127 | .nice-select .option.selected { 128 | font-weight: bold; } 129 | .nice-select .option.disabled { 130 | background-color: transparent; 131 | color: #999; 132 | cursor: default; } 133 | 134 | .no-csspointerevents .nice-select .list { 135 | display: none; } 136 | 137 | .no-csspointerevents .nice-select.open .list { 138 | display: block; } 139 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u2602.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f6a9.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f308.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f344.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f56f.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f332.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f9c0.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f3a7.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f577.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lang/zh.json: -------------------------------------------------------------------------------- 1 | { 2 | "maintenance": "当前正在维护的simpleledger.info,预计性能会下降。", 3 | "loading_dank_memes": "正在载入页面...", 4 | 5 | "homepage_btn_view_all_tokens": "查看所有代币", 6 | "homepage_btn_dividend_helper": "派息(空投)工具", 7 | 8 | "footer_source_code": "源代码", 9 | "footer_resources": "资源", 10 | "footer_connect": "友情链接", 11 | 12 | "error_modal_header": "抱歉,发生错误", 13 | "error_modal_subtext": "很抱歉给您带来不便,我们将尽快对此进行调查。 如果您愿意,您可以报告此错误
    重新加载页面可能会有所帮助。", 14 | 15 | "mainmenu_explorer": "浏览器", 16 | "mainmenu_all_tokens": "所有代币", 17 | 18 | "index_page_header": "简单分类帐协议代币浏览器", 19 | "index_page_subheader": "查询基于比特币现金的代币", 20 | "index_page_subtext": "本站基于SLPDB构建,SLPDBSLPDB,是BitDB FH 的分支Github
    在Github上查看代码并提交问题。Electron Cash SLP Edition.", 21 | "index_page_latest_transactions": "最新交易", 22 | "index_page_transaction_charts": "交易统计图表", 23 | "index_page_token_burns": "已毁灭代币", 24 | "index_page_exchanges": "交易所:", 25 | 26 | "address_page_sent_slp_transactions": "已发送SLP交易", 27 | "address_page_received_slp_transactions": "收到SLP交易", 28 | "address_page_token_balances": "代币余额", 29 | "address_page_transactions_chart": "交易统计图表", 30 | 31 | "bad_address_page_header": "错误地址", 32 | "bad_address_page_subtext": "抱歉,我们无法解码给定的地址。 仔细检查它是否拼写正确。", 33 | 34 | "processing_tx_page_header": "处理SLP交易", 35 | "processing_tx_page_subtext": "SLPDB当前正在处理此事务。 在高负载期间,处理交易可能需要更长的时间。 请稍后重试。", 36 | 37 | "no_tx_header": "找不到交易", 38 | "no_tx_subtext": "在SLPDB或BitDB中找不到此事务。 它可能已经很旧或拼写错误。", 39 | 40 | "404_page_header": "404找不到:(", 41 | "404_page_subtext1": "抱歉,找不到您想要的页面。", 42 | "404_page_subtext2": "请尝试其他搜索或返回浏览器,这可能是一个错误。 如果是这样,请报告它!", 43 | 44 | "block_page_view_all_block": "查看已确认的所有交易", 45 | "block_page_view_all_mempool": "查看所有等待确认的交易", 46 | 47 | "dividend_helper_tokenid_subtext": "空投bch给哪些代币的持有者", 48 | "dividend_helper_bch_subtext": "总共给代币持有者空投多少比特币现金", 49 | "dividend_helper_ignore_addresses_subtext": "不给这些地址空投,请每输入一个地址换一行", 50 | "dividend_helper_calculate_subtext": "使用Electron cash钱包的“Pay to many”功能", 51 | 52 | "slp_explorer": "SLP资源管理器", 53 | "ignore_addresses": "排除地址", 54 | "dividend_helper": "派息(空投)工具", 55 | "bitcoin_cash_transaction": "比特币现金交易", 56 | "bch": "BCH", 57 | "calculate": "计算", 58 | "popular_tokens": "热门代币", 59 | "all_tokens": "所有代币", 60 | "transaction": "交易", 61 | "transactions": "交易次数", 62 | "transaction_hash": "交易哈希", 63 | "transactions_chart": "交易图表", 64 | "txid": "交易编号", 65 | "tx": "交易", 66 | "token_id": "代币标识符", 67 | "token_balance": "代币余额", 68 | "token": "代币", 69 | "tokens": "代币", 70 | "name": "名称", 71 | "symbol": "符号", 72 | "amount": "金额", 73 | "version": "版本", 74 | "address": "地址", 75 | "addresses": "地址", 76 | "block": "区块高度", 77 | "blocks": "积木", 78 | "block_height": "区块高度", 79 | "block_time": "锁定时间", 80 | "block_created": "块已创建", 81 | "loading": "载入中...", 82 | "year": "年", 83 | "month": "月", 84 | "week": "星期", 85 | "day": "日", 86 | "view_on_bch_explorer": "在比特币现金浏览器上查看", 87 | "copy_to_clipboard": "复制到剪贴板", 88 | "type1": "第一类", 89 | "nft1_group": "不可替代代币一族", 90 | "nft1_child": "不可替代代币一个孩子", 91 | "child_nfts": "儿童不可替代代币", 92 | "mint_history": "造币史", 93 | "burn_history": "毁灭历史", 94 | "pending": "待定", 95 | "none": "[没有]", 96 | "rich_list": "丰富列表", 97 | "stats": "统计", 98 | "details": "代币细节", 99 | "balance": "结余", 100 | "mint_baton": "薄荷棒", 101 | "minting_baton_status": "铸棒状态", 102 | "minting_baton_utxo": "铸币指挥棒未使用的交易输出", 103 | "send": "发送", 104 | "mint": "薄荷", 105 | "genesis": "建立", 106 | "genesis_description": "代币类型一生成交易没有任何SLP输入。
    不可替代的代币子事务可以通过查看“代币详细信息”窗格中的“版本”行来看到输入。", 107 | "tokenstats_valid_token_transactions": "自创世以来的有效交易", 108 | "tokenstats_valid_token_utxos": "有效代币未花费的交易输出", 109 | "tokenstats_valid_token_addresses": "有效代币地址", 110 | "tokenstats_satoshis_locked_up": "聪锁定", 111 | "tokenstats_tokens_minted": "铸造币", 112 | "tokenstats_tokens_burned": "代币烧毁", 113 | "tokenstats_circulating_supply": "循环供应", 114 | "slpdb_address_error": "SLPDB地址错误", 115 | "no_inputs": "没有输入。", 116 | "type": "类型", 117 | "mempool": "内存池", 118 | "document": "文献", 119 | "document_uri": "文件网址", 120 | "document_checksum": "文件校验和", 121 | "creator": "创作者", 122 | "version": "版本", 123 | "verified": "已验证", 124 | "inputs": "输入项", 125 | "outputs": "产出", 126 | "vout": "输出向量", 127 | "timestamp": "时间戳记", 128 | "decimals": "小数点", 129 | "slp_address": "SLP地址", 130 | "cash_address": "收款地址", 131 | "legacy_address": "旧版地址", 132 | "cash_account": "现金账户", 133 | "cash_accounts": "现金账户", 134 | "go_back": "回后", 135 | "go_home": "回首页", 136 | "reload_page": "重新载入页面", 137 | "search_placeholder": "交易哈希,地址或代币名...", 138 | "nonslp_transaction": "非SLP交易", 139 | "slp_invalid_reason": "SLP无效原因", 140 | "this_is_not_a_slp_transaction": "这不是SLP事务。", 141 | "tokens_created": "已创建代币", 142 | "sent": "已发送", 143 | "received": "已收到", 144 | "tokenid_required": "代币标识符必填" 145 | } 146 | 147 | -------------------------------------------------------------------------------- /public/img/cashaccount-avatars/emoji_u1f380.svg: -------------------------------------------------------------------------------- 1 | 2 | --------------------------------------------------------------------------------