├── public ├── favicon.ico ├── index.html └── commonABI │ ├── ERC20.json │ ├── ERC1155.json │ └── ERC721.json ├── src ├── assets │ └── imgs │ │ ├── 404.jpg │ │ ├── copy.png │ │ ├── load.gif │ │ ├── logo.png │ │ ├── main.png │ │ ├── more.png │ │ ├── cubeLogo.png │ │ ├── dropDown.png │ │ ├── explain.png │ │ ├── github.png │ │ ├── topLogo.png │ │ ├── twitter.png │ │ ├── celoLogo.webp │ │ ├── okexLogo.webp │ │ ├── toolList1.png │ │ ├── toolList10.png │ │ ├── toolList11.png │ │ ├── toolList2.png │ │ ├── toolList3.png │ │ ├── toolList4.png │ │ ├── toolList5.png │ │ ├── toolList6.png │ │ ├── toolList7.png │ │ ├── toolList8.png │ │ ├── toolList9.png │ │ ├── BscScanLogo.png │ │ ├── PolygonLogo.png │ │ ├── arbitrumLogo.png │ │ ├── auroraLogo.webp │ │ ├── bscScanLogo.png │ │ ├── gnosisLogo.webp │ │ ├── harmonyLogo.webp │ │ ├── optimismLogo.png │ │ ├── polygonLogo.png │ │ ├── avalancheLogo.webp │ │ ├── arrowRight.svg │ │ └── etherscanLogo.svg ├── store │ └── index.js ├── interface.js ├── presetsABI.json ├── views │ ├── calldata │ │ ├── DataType.vue │ │ ├── Coding.vue │ │ ├── DataValue.vue │ │ └── DeCoding.vue │ ├── Notfind.vue │ ├── GenerateWallet.vue │ ├── Address.vue │ ├── CalldataDecode.vue │ ├── UintConvert.vue │ ├── QuerySelector.vue │ ├── Home.vue │ ├── HashTool.vue │ ├── BulkQuery.vue │ ├── Faucet.vue │ └── ConvertTopicID.vue ├── arrayParsing.js ├── lang │ ├── index.js │ ├── zh.js │ └── en.js ├── proxy.js ├── main.js ├── components │ └── Footer.vue ├── App.vue ├── functionSelector.js ├── network.json ├── router │ └── index.js ├── faucetData.js └── generateTree.js ├── .github └── ISSUE_TEMPLATE │ ├── feature.md │ └── bug-.md ├── .gitignore ├── README.md ├── vue.config.js └── package.json /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/imgs/404.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/404.jpg -------------------------------------------------------------------------------- /src/assets/imgs/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/copy.png -------------------------------------------------------------------------------- /src/assets/imgs/load.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/load.gif -------------------------------------------------------------------------------- /src/assets/imgs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/logo.png -------------------------------------------------------------------------------- /src/assets/imgs/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/main.png -------------------------------------------------------------------------------- /src/assets/imgs/more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/more.png -------------------------------------------------------------------------------- /src/assets/imgs/cubeLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/cubeLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/dropDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/dropDown.png -------------------------------------------------------------------------------- /src/assets/imgs/explain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/explain.png -------------------------------------------------------------------------------- /src/assets/imgs/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/github.png -------------------------------------------------------------------------------- /src/assets/imgs/topLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/topLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/twitter.png -------------------------------------------------------------------------------- /src/assets/imgs/celoLogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/celoLogo.webp -------------------------------------------------------------------------------- /src/assets/imgs/okexLogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/okexLogo.webp -------------------------------------------------------------------------------- /src/assets/imgs/toolList1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList1.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList10.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList11.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList2.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList3.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList4.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList5.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList6.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList7.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList8.png -------------------------------------------------------------------------------- /src/assets/imgs/toolList9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/toolList9.png -------------------------------------------------------------------------------- /src/assets/imgs/BscScanLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/BscScanLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/PolygonLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/PolygonLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/arbitrumLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/arbitrumLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/auroraLogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/auroraLogo.webp -------------------------------------------------------------------------------- /src/assets/imgs/bscScanLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/bscScanLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/gnosisLogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/gnosisLogo.webp -------------------------------------------------------------------------------- /src/assets/imgs/harmonyLogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/harmonyLogo.webp -------------------------------------------------------------------------------- /src/assets/imgs/optimismLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/optimismLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/polygonLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/polygonLogo.png -------------------------------------------------------------------------------- /src/assets/imgs/avalancheLogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChainToolDao/chaintool-frontend/HEAD/src/assets/imgs/avalancheLogo.webp -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature 3 | about: 提交你对产品的想法或建议 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **描述功能** 11 | 12 | 13 | **解决方法或思路** 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'Bug ' 3 | about: '提交发现的 Bug ' 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Bug 描述** 11 | 12 | 13 | **重现** 14 | 15 | 16 | **期望行为** 17 | 18 | 19 | **截图** 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | .sentryclirc 5 | 6 | # local env files 7 | .env 8 | .env.local 9 | .env.*.local 10 | 11 | # Log files 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? -------------------------------------------------------------------------------- /src/assets/imgs/arrowRight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | Vue.use(Vuex) 5 | 6 | const store = new Vuex.Store({ 7 | state: { 8 | account: null, 9 | }, 10 | mutations: { 11 | updataAccount(state, val) { 12 | state.account = val 13 | }, 14 | }, 15 | }) 16 | 17 | export default store 18 | -------------------------------------------------------------------------------- /src/interface.js: -------------------------------------------------------------------------------- 1 | const baseUrl = process.env.VUE_APP_SERVER_URL 2 | 3 | export default { 4 | // traceview 5 | getMap: `${baseUrl}/traceview/getMap`, 6 | analyze: `${baseUrl}/traceview/analyze`, 7 | selector: `${baseUrl}/func/selector`, 8 | topic: `${baseUrl}/event/topic`, 9 | getABI:`${baseUrl}/abi/get`, 10 | submitABI:`${baseUrl}/abi/submit`, 11 | } -------------------------------------------------------------------------------- /src/presetsABI.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "standard": "ERC Standard", 4 | "data": [ 5 | "ERC20", 6 | "ERC721", 7 | "ERC1155" 8 | ] 9 | }, 10 | { 11 | "standard": "Uniswap", 12 | "data": [ 13 | "UniswapV2Router02" 14 | ] 15 | }, 16 | { 17 | "standard": "Speedboat.studio", 18 | "data": [ 19 | "Speedboat NFT", 20 | "SpeedBoat721 NFT - Legacy" 21 | ] 22 | } 23 | ] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 区块链开发工具-前端 2 | 3 | 本项目包含多个工具,帮助开发者在使用、开发区块链项目时提高效率 4 | 5 | ## 环境依赖以及所需软件 6 | - Node.js v16^ 7 | 8 | ## 安装依赖 9 | ``` 10 | yarn install 11 | ``` 12 | 13 | ## 部署 14 | 15 | #### 打包部署 16 | ```` 17 | yarn build 18 | ```` 19 | 20 | #### 本地启动 21 | ``` 22 | yarn serve 23 | ``` 24 | 25 | #### 后台服务 26 | 部分工具使用需要部署后台服务, 后台部署参考后台仓库[README](https://github.com/ChainToolDao/chaintool-server/blob/main/README.md) 27 | 28 | #### 后台接口配置 29 | 根目录下新建.env配置文件 30 | 31 | ``` 32 | # 后台接口地址 33 | VUE_APP_SERVER_URL = https://xxx.xxx.xxx 34 | ``` 35 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Chaintool - 区块链开发者的工具箱 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/views/calldata/DataType.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 25 | 26 | -------------------------------------------------------------------------------- /src/ arrayParsing.js: -------------------------------------------------------------------------------- 1 | export default { 2 | //字符串数组解析 3 | async stringArrayParsing(string) { 4 | //对数组类型参数进行处理 5 | for (let i = 0; i < string.length; i++) { 6 | if(string[i]==undefined){ 7 | string[i]="" 8 | } 9 | if (string[i].indexOf('[') == 0 && string[i].substr(-1) == "]") { 10 | if (string[i].substring(1, string[i].length - 1).indexOf('[') != -1) { 11 | string[i] = eval(string[i]) 12 | } else { 13 | string[i] = string[i].substring(1, string[i].length - 1).split(',') 14 | } 15 | } 16 | } 17 | return string 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /src/lang/index.js: -------------------------------------------------------------------------------- 1 | // 进行多语言支持配置 2 | import Vue from 'vue' // 引入Vue 3 | import VueI18n from 'vue-i18n' // 引入国际化的插件包 4 | 5 | import locale from 'element-ui/lib/locale' 6 | 7 | import zh from './zh' 8 | import en from './en' 9 | 10 | Vue.use(VueI18n) // 全局注册国际化包 11 | 12 | // 创建国际化插件的实例 13 | const i18n = new VueI18n({ 14 | // 指定语言类型 zh表示中文 en表示英文 15 | locale: 'zh', 16 | // 将elementUI语言包加入到插件语言数据里 17 | messages: { 18 | // 英文环境下的语言数据 19 | en: { 20 | ...en 21 | }, 22 | // 中文环境下的语言数据 23 | zh: { 24 | ...zh 25 | } 26 | }, 27 | // 隐藏警告 28 | silentTranslationWarn: true 29 | }) 30 | 31 | // 配置elementUI语言转换关系 32 | locale.i18n((key, value) => i18n.t(key, value)) 33 | 34 | export default i18n 35 | -------------------------------------------------------------------------------- /src/proxy.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | export default { 4 | async initWeb3Account(callback,that) { 5 | let provider 6 | if (window.ethereum) { 7 | provider = window.ethereum; 8 | try { 9 | await window.ethereum.enable(); 10 | } catch (error) { 11 | callback(false) 12 | that.$message.error( 13 | that.$t('connectWallet.walleAccessDenied') 14 | ) 15 | return 16 | } 17 | callback(provider) 18 | } else { 19 | that.$message.error( 20 | that.$t('connectWallet.notInstalledMetaMask') 21 | ) 22 | } 23 | }, 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import ElementUI from 'element-ui' 3 | import 'element-ui/lib/theme-chalk/index.css' 4 | import axios from 'axios' 5 | import App from './App' 6 | import store from './store' 7 | import router from './router' 8 | import MetaInfo from "vue-meta-info"; 9 | import JsonViewer from 'vue-json-viewer'; 10 | import functionSelector from "./functionSelector"; 11 | import arrayParsing from './ arrayParsing' 12 | import i18n from '@/lang' 13 | 14 | Vue.use(JsonViewer); 15 | Vue.use(MetaInfo); 16 | Vue.use(ElementUI) 17 | Vue.config.productionTip = false 18 | Vue.prototype.functionSelector = functionSelector; 19 | Vue.prototype.arrayParsing=arrayParsing 20 | axios.defaults.timeout = 10000; 21 | Vue.prototype.$axios = axios 22 | 23 | new Vue({ 24 | el: '#app', 25 | router, 26 | store, 27 | i18n, 28 | render: h => h(App), 29 | }) -------------------------------------------------------------------------------- /src/views/Notfind.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 29 | 30 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | 3 | module.exports = { 4 | lintOnSave: false, 5 | configureWebpack: (config) => { 6 | config.module.rules = config.module.rules.map((rule) => { 7 | if (rule.oneOf instanceof Array) { 8 | return { 9 | ...rule, 10 | oneOf: [{ test: /\.wasm$/, type: 'webassembly/async' }, ...rule.oneOf], 11 | }; 12 | } 13 | return rule; 14 | }); 15 | const fallback = config.resolve.fallback || {}; 16 | Object.assign(fallback, { 17 | fs: false, 18 | buffer: require.resolve('buffer'), 19 | path: require.resolve('path-browserify'), 20 | stream: require.resolve('stream-browserify'), 21 | }); 22 | config.resolve.fallback = fallback; 23 | config.plugins = (config.plugins || []).concat([ 24 | new webpack.ProvidePlugin({ 25 | Buffer: ['buffer', 'Buffer'], 26 | }), 27 | ]); 28 | config.experiments = { 29 | asyncWebAssembly: true, 30 | }; 31 | }, 32 | }; -------------------------------------------------------------------------------- /src/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | 19 | 53 | -------------------------------------------------------------------------------- /src/views/GenerateWallet.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 49 | 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "serve": "vue-cli-service serve", 6 | "build": "vue-cli-service build", 7 | "lint": "vue-cli-service lint", 8 | "test": "vue-cli-service test:unit" 9 | }, 10 | "dependencies": { 11 | "@sentry/tracing": "^7.45.0", 12 | "@sentry/vue": "^7.45.0", 13 | "axios": "^0.21.4", 14 | "bip32": "^4.0.0", 15 | "bip39": "^3.1.0", 16 | "bitcoinjs-lib": "^6.1.0", 17 | "clipboard": "^2.0.8", 18 | "element-ui": "^2.15.6", 19 | "ethers": "^5.7.2", 20 | "file-saver": "^2.0.5", 21 | "node-polyfill-webpack-plugin": "^2.0.1", 22 | "prerender-spa-plugin": "^3.4.0", 23 | "tiny-secp256k1": "^2.2.1", 24 | "vue": "^2.6.10", 25 | "vue-i18n": "^8.22.2", 26 | "vue-json-viewer": "^2.2.22", 27 | "vue-meta-info": "^0.1.7", 28 | "vue-raven": "^1.0.3", 29 | "vue-router": "^3.0.6", 30 | "vuex": "^3.1.2", 31 | "webpack": "^5.79.0", 32 | "wif": "^2.0.6", 33 | "xlsx": "^0.18.5" 34 | }, 35 | "devDependencies": { 36 | "@babel/core": "^7.12.16", 37 | "@babel/eslint-parser": "^7.12.16", 38 | "@vue/cli-plugin-babel": "~5.0.0", 39 | "@vue/cli-plugin-eslint": "~5.0.0", 40 | "@vue/cli-service": "~5.0.0", 41 | "eslint": "^7.32.0", 42 | "eslint-plugin-vue": "^8.0.3", 43 | "vue-template-compiler": "^2.6.14" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 34 | 35 | 67 | -------------------------------------------------------------------------------- /src/functionSelector.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import intefUrl from "./interface"; 3 | 4 | export default { 5 | //提交函数签名 6 | async submitFunctionSelector(functionName, functionSelector) { 7 | try { 8 | axios 9 | .post(intefUrl.selector, { 10 | "signature": functionName, 11 | "selector": functionSelector, 12 | }) 13 | .then((res) => { 14 | }); 15 | } catch (error) { 16 | } 17 | }, 18 | 19 | //获取函数签名 20 | async getFunctionSignature(functionSelector) { 21 | let signatureData = []; 22 | try { 23 | await axios 24 | .get(intefUrl.selector + "/" + functionSelector) 25 | .then((res) => { 26 | for (let i in res.data.data) { 27 | if (signatureData.indexOf(res.data.data[i]) == -1) { 28 | signatureData.push(res.data.data[i]); 29 | } 30 | } 31 | }); 32 | } catch (error) { 33 | } 34 | functionSelector = functionSelector.slice(2); 35 | try { 36 | await axios 37 | .get( 38 | "https://raw.githubusercontent.com/ethereum-lists/4bytes/master/signatures/" + 39 | functionSelector 40 | ) 41 | .then((res) => { 42 | let data = res.data.split(";"); 43 | for (let i in data) { 44 | if (signatureData.indexOf(data[i]) == -1) { 45 | signatureData.push(data[i]); 46 | this.submitFunctionSelector(data[i], ("0x" + functionSelector)) 47 | } 48 | } 49 | }); 50 | } catch (error) { 51 | } 52 | return signatureData 53 | } 54 | }; 55 | -------------------------------------------------------------------------------- /src/assets/imgs/etherscanLogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/network.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "chainID": "31337", 4 | "networkName": "Hardhat(localhost)", 5 | "rpcUrls": [ 6 | "http://localhost:8545" 7 | ], 8 | "chainExplorer": "", 9 | "currencySymbol": "Hardhat" 10 | }, 11 | { 12 | "chainID": "1", 13 | "networkName": "Ethereum Mainnet", 14 | "rpcUrls": [ 15 | "https://mainnet.infura.io/v3/", 16 | "https://eth.llamarpc.com" 17 | ], 18 | "chainExplorer": "https://etherscan.io/", 19 | "currencySymbol": "ETH" 20 | }, 21 | { 22 | "chainID": "5", 23 | "networkName": "Goerli", 24 | "rpcUrls": [ 25 | "https://goerli.infura.io/v3/", 26 | "https://eth-goerli.api.onfinality.io/public" 27 | ], 28 | "chainExplorer": "https://goerli.etherscan.io/", 29 | "currencySymbol": "Goerli" 30 | }, 31 | { 32 | "chainID": "11155111", 33 | "networkName": "Sepolia", 34 | "rpcUrls": [ 35 | "https://sepolia.infura.io/v3/", 36 | "https://endpoints.omniatech.io/v1/eth/sepolia/public" 37 | ], 38 | "chainExplorer": "https://sepolia.etherscan.io/", 39 | "currencySymbol": "Sepolia" 40 | }, 41 | { 42 | "chainID": "137", 43 | "networkName": "Polygon Mainnet", 44 | "rpcUrls": [ 45 | "https://endpoints.omniatech.io/v1/matic/mainnet/public", 46 | "https://polygon.llamarpc.com" 47 | ], 48 | "chainExplorer": "https://polygonscan.com/", 49 | "currencySymbol": "MATIC" 50 | }, 51 | { 52 | "chainID": "80001", 53 | "networkName": "Mumbai", 54 | "rpcUrls": [ 55 | "https://endpoints.omniatech.io/v1/matic/mumbai/public", 56 | "https://endpoints.omniatech.io/v1/matic/mumbai/public" 57 | ], 58 | "chainExplorer": "https://mumbai.polygonscan.com/", 59 | "currencySymbol": "Mumbai" 60 | }, 61 | { 62 | "chainID": "56", 63 | "networkName": "BNB Chain", 64 | "rpcUrls": [ 65 | "https://rpc.ankr.com/bsc", 66 | "https://endpoints.omniatech.io/v1/bsc/mainnet/public" 67 | ], 68 | "chainExplorer": "https://bscscan.com/", 69 | "currencySymbol": "BNB" 70 | }, 71 | { 72 | "chainID": "97", 73 | "networkName": "BNB Testnet Chain", 74 | "rpcUrls": [ 75 | "https://endpoints.omniatech.io/v1/bsc/testnet/public", 76 | "https://endpoints.omniatech.io/v1/bsc/testnet/public" 77 | ], 78 | "chainExplorer": "https://testnet.bscscan.com/", 79 | "currencySymbol": "Testnet BNB" 80 | } 81 | ] -------------------------------------------------------------------------------- /src/views/calldata/Coding.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 82 | 83 | -------------------------------------------------------------------------------- /src/views/calldata/DataValue.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 97 | 98 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Home from '../views/Home.vue' 4 | import Unitconvert from '../views/UintConvert.vue' 5 | import Abi from '../views/ABI.vue' 6 | import Traceview from '../views/TraceView.vue' 7 | import Bulkquery from '../views/BulkQuery.vue' 8 | import Notfind from '../views/Notfind.vue' 9 | import Address from '../views/Address.vue' 10 | import QuerySelector from '../views/QuerySelector.vue' 11 | import GenerateWallet from '../views/GenerateWallet.vue' 12 | import ConvertTopicID from '../views/ConvertTopicID.vue' 13 | import HashTool from '../views/HashTool.vue' 14 | import CalldataDecode from '../views/CalldataDecode.vue' 15 | import Faucet from '../views/Faucet.vue' 16 | import BTCWallet from "../views/generateWallet/BTCWallet.vue" 17 | import EVMWallet from "../views/generateWallet/EVMWallet.vue" 18 | 19 | Vue.use(Router) 20 | 21 | const originalPush = Router.prototype.push 22 | 23 | Router.prototype.push = function push(location) { 24 | return originalPush.call(this, location).catch(err => err) 25 | } 26 | 27 | export default new Router({ 28 | mode: 'history', 29 | routes: [ 30 | { 31 | path: '/', 32 | name: 'Home', 33 | component: Home 34 | }, 35 | { 36 | path: '/unitConvert', 37 | name: 'Unitconvert', 38 | component: Unitconvert 39 | }, 40 | { 41 | path: '/unitConvert/:weiValue', 42 | name: 'Unitconvert-Value', 43 | component: Unitconvert 44 | }, 45 | { 46 | path: '/abi/:currencySymbol/:address', 47 | name: 'Abi-Value', 48 | component: Abi 49 | }, 50 | { 51 | path: '/abi', 52 | name: 'Abi', 53 | component: Abi 54 | }, 55 | { 56 | path: '/traceview', 57 | name: 'Traceview', 58 | component: Traceview 59 | }, 60 | { 61 | path: '/bulkQuery', 62 | name: 'Bulkquery', 63 | component: Bulkquery, 64 | }, 65 | { 66 | path: '/address', 67 | name: 'AddresAndEMS', 68 | component: Address 69 | }, 70 | { 71 | path: '/querySelector', 72 | name: 'QuerySelector', 73 | component: QuerySelector 74 | }, 75 | { 76 | path: '/generateWallet', 77 | name: 'GenerateWallet', 78 | component: GenerateWallet, 79 | children:[ 80 | { 81 | path:'', 82 | redirect:'evmWallet' 83 | }, 84 | { 85 | path:'evmWallet', 86 | name:'evmWallet', 87 | component:EVMWallet 88 | }, 89 | { 90 | path:'btcWallet', 91 | name:'btcWallet', 92 | component:BTCWallet 93 | } 94 | ] 95 | }, 96 | { 97 | path: '/topicID', 98 | name: 'ConvertTopicID', 99 | component: ConvertTopicID 100 | }, 101 | { 102 | path: '/hashTool', 103 | name: 'HashTool', 104 | component: HashTool 105 | }, 106 | { 107 | path: '/calldata', 108 | name: 'CalldataDecode', 109 | component: CalldataDecode 110 | }, 111 | { 112 | path: '/faucet', 113 | name: 'Faucet', 114 | component: Faucet 115 | }, 116 | { 117 | path: '/*', 118 | name: 'Notfind', 119 | component: Notfind 120 | }, 121 | ], 122 | }) -------------------------------------------------------------------------------- /src/views/Address.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 150 | 151 | 314 | -------------------------------------------------------------------------------- /public/commonABI/ERC20.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "string", 6 | "name": "name_", 7 | "type": "string" 8 | }, 9 | { 10 | "internalType": "string", 11 | "name": "symbol_", 12 | "type": "string" 13 | } 14 | ], 15 | "stateMutability": "nonpayable", 16 | "type": "constructor" 17 | }, 18 | { 19 | "anonymous": false, 20 | "inputs": [ 21 | { 22 | "indexed": true, 23 | "internalType": "address", 24 | "name": "owner", 25 | "type": "address" 26 | }, 27 | { 28 | "indexed": true, 29 | "internalType": "address", 30 | "name": "spender", 31 | "type": "address" 32 | }, 33 | { 34 | "indexed": false, 35 | "internalType": "uint256", 36 | "name": "value", 37 | "type": "uint256" 38 | } 39 | ], 40 | "name": "Approval", 41 | "type": "event" 42 | }, 43 | { 44 | "anonymous": false, 45 | "inputs": [ 46 | { 47 | "indexed": true, 48 | "internalType": "address", 49 | "name": "from", 50 | "type": "address" 51 | }, 52 | { 53 | "indexed": true, 54 | "internalType": "address", 55 | "name": "to", 56 | "type": "address" 57 | }, 58 | { 59 | "indexed": false, 60 | "internalType": "uint256", 61 | "name": "value", 62 | "type": "uint256" 63 | } 64 | ], 65 | "name": "Transfer", 66 | "type": "event" 67 | }, 68 | { 69 | "inputs": [ 70 | { 71 | "internalType": "address", 72 | "name": "owner", 73 | "type": "address" 74 | }, 75 | { 76 | "internalType": "address", 77 | "name": "spender", 78 | "type": "address" 79 | } 80 | ], 81 | "name": "allowance", 82 | "outputs": [ 83 | { 84 | "internalType": "uint256", 85 | "name": "", 86 | "type": "uint256" 87 | } 88 | ], 89 | "stateMutability": "view", 90 | "type": "function" 91 | }, 92 | { 93 | "inputs": [ 94 | { 95 | "internalType": "address", 96 | "name": "spender", 97 | "type": "address" 98 | }, 99 | { 100 | "internalType": "uint256", 101 | "name": "amount", 102 | "type": "uint256" 103 | } 104 | ], 105 | "name": "approve", 106 | "outputs": [ 107 | { 108 | "internalType": "bool", 109 | "name": "", 110 | "type": "bool" 111 | } 112 | ], 113 | "stateMutability": "nonpayable", 114 | "type": "function" 115 | }, 116 | { 117 | "inputs": [ 118 | { 119 | "internalType": "address", 120 | "name": "account", 121 | "type": "address" 122 | } 123 | ], 124 | "name": "balanceOf", 125 | "outputs": [ 126 | { 127 | "internalType": "uint256", 128 | "name": "", 129 | "type": "uint256" 130 | } 131 | ], 132 | "stateMutability": "view", 133 | "type": "function" 134 | }, 135 | { 136 | "inputs": [], 137 | "name": "decimals", 138 | "outputs": [ 139 | { 140 | "internalType": "uint8", 141 | "name": "", 142 | "type": "uint8" 143 | } 144 | ], 145 | "stateMutability": "view", 146 | "type": "function" 147 | }, 148 | { 149 | "inputs": [ 150 | { 151 | "internalType": "address", 152 | "name": "spender", 153 | "type": "address" 154 | }, 155 | { 156 | "internalType": "uint256", 157 | "name": "subtractedValue", 158 | "type": "uint256" 159 | } 160 | ], 161 | "name": "decreaseAllowance", 162 | "outputs": [ 163 | { 164 | "internalType": "bool", 165 | "name": "", 166 | "type": "bool" 167 | } 168 | ], 169 | "stateMutability": "nonpayable", 170 | "type": "function" 171 | }, 172 | { 173 | "inputs": [ 174 | { 175 | "internalType": "address", 176 | "name": "spender", 177 | "type": "address" 178 | }, 179 | { 180 | "internalType": "uint256", 181 | "name": "addedValue", 182 | "type": "uint256" 183 | } 184 | ], 185 | "name": "increaseAllowance", 186 | "outputs": [ 187 | { 188 | "internalType": "bool", 189 | "name": "", 190 | "type": "bool" 191 | } 192 | ], 193 | "stateMutability": "nonpayable", 194 | "type": "function" 195 | }, 196 | { 197 | "inputs": [], 198 | "name": "name", 199 | "outputs": [ 200 | { 201 | "internalType": "string", 202 | "name": "", 203 | "type": "string" 204 | } 205 | ], 206 | "stateMutability": "view", 207 | "type": "function" 208 | }, 209 | { 210 | "inputs": [], 211 | "name": "symbol", 212 | "outputs": [ 213 | { 214 | "internalType": "string", 215 | "name": "", 216 | "type": "string" 217 | } 218 | ], 219 | "stateMutability": "view", 220 | "type": "function" 221 | }, 222 | { 223 | "inputs": [], 224 | "name": "totalSupply", 225 | "outputs": [ 226 | { 227 | "internalType": "uint256", 228 | "name": "", 229 | "type": "uint256" 230 | } 231 | ], 232 | "stateMutability": "view", 233 | "type": "function" 234 | }, 235 | { 236 | "inputs": [ 237 | { 238 | "internalType": "address", 239 | "name": "recipient", 240 | "type": "address" 241 | }, 242 | { 243 | "internalType": "uint256", 244 | "name": "amount", 245 | "type": "uint256" 246 | } 247 | ], 248 | "name": "transfer", 249 | "outputs": [ 250 | { 251 | "internalType": "bool", 252 | "name": "", 253 | "type": "bool" 254 | } 255 | ], 256 | "stateMutability": "nonpayable", 257 | "type": "function" 258 | }, 259 | { 260 | "inputs": [ 261 | { 262 | "internalType": "address", 263 | "name": "sender", 264 | "type": "address" 265 | }, 266 | { 267 | "internalType": "address", 268 | "name": "recipient", 269 | "type": "address" 270 | }, 271 | { 272 | "internalType": "uint256", 273 | "name": "amount", 274 | "type": "uint256" 275 | } 276 | ], 277 | "name": "transferFrom", 278 | "outputs": [ 279 | { 280 | "internalType": "bool", 281 | "name": "", 282 | "type": "bool" 283 | } 284 | ], 285 | "stateMutability": "nonpayable", 286 | "type": "function" 287 | } 288 | ] -------------------------------------------------------------------------------- /src/views/CalldataDecode.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 77 | 78 | -------------------------------------------------------------------------------- /src/views/UintConvert.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 262 | 263 | 364 | -------------------------------------------------------------------------------- /src/views/QuerySelector.vue: -------------------------------------------------------------------------------- 1 | 35 | 153 | 154 | 322 | -------------------------------------------------------------------------------- /src/faucetData.js: -------------------------------------------------------------------------------- 1 | export function faucetData(that) { 2 | return [ 3 | { 4 | "network": "Goerli", 5 | "remark": that.$t('faucetData.ethereum')+that.$t('faucetData.testnet'), 6 | "chainID": "5", 7 | "currency": "GETH", 8 | "img": "toolList1.png", 9 | "faucet": [ 10 | { 11 | "url": "https://goerlifaucet.com", 12 | "remark": that.$t('faucetData.remarkGoerli[0]') 13 | }, 14 | { 15 | "url": "https://goerli-faucet.pk910.de", 16 | "remark": that.$t('faucetData.remarkGoerli[1]') 17 | }, 18 | { 19 | "url": "https://faucet.paradigm.xyz", 20 | "remark": that.$t('faucetData.remarkGoerli[2]') 21 | }, 22 | { 23 | "url": "https://grabteeth.xyz/", 24 | "remark": that.$t('faucetData.remarkGoerli[3]') 25 | }, 26 | { 27 | "url": "https://unitap.app/", 28 | "remark": "" 29 | }, 30 | { 31 | "url": "https://faucet.quicknode.com/drip", 32 | "remark": "" 33 | }, 34 | { 35 | "url": "https://www.allthatnode.com/faucet/ethereum.dsrv", 36 | "remark": "" 37 | } 38 | ] 39 | }, 40 | { 41 | "network": "Sepolia", 42 | "chainID": "11155111", 43 | "remark": that.$t('faucetData.ethereum')+that.$t('faucetData.testnet'), 44 | "currency": "SETH", 45 | "img": "toolList1.png", 46 | "faucet": [ 47 | { 48 | "url": "https://sepoliafaucet.com/", 49 | "remark": that.$t('faucetData.remarkSepolia[0]') 50 | }, 51 | { 52 | "url": "https://sepolia-faucet.pk910.de/", 53 | "remark": that.$t('faucetData.remarkSepolia[1]') 54 | }, 55 | { 56 | "url": "https://grabteeth.xyz/", 57 | "remark": that.$t('faucetData.remarkSepolia[2]') 58 | }, 59 | { 60 | "url": "https://faucet.quicknode.com/drip", 61 | "remark": "" 62 | }, 63 | { 64 | "url": "https://faucets.chain.link/", 65 | "remark": "" 66 | }, { 67 | "url": "https://www.infura.io/faucet?ref=chaintool.tech", 68 | "remark": "" 69 | } 70 | ] 71 | }, 72 | { 73 | "network": "Mumbai", 74 | "remark": "Polygon "+that.$t('faucetData.testnet'), 75 | "chainID": "80001", 76 | "currency": "tMATIC", 77 | "img": "polygonLogo.png", 78 | "faucet": [ 79 | { 80 | "url": "https://mumbaifaucet.com/", 81 | "remark": that.$t('faucetData.remarkMumbai[0]') 82 | }, 83 | { 84 | "url": "https://faucet.polygon.technology", 85 | "remark": "" 86 | } 87 | ] 88 | }, 89 | { 90 | "network": "Optimism Sepolia", 91 | "remark": "Optimism "+that.$t('faucetData.testnet'), 92 | "chainID": "11155420", 93 | "currency": "opETH", 94 | "img": "optimismLogo.png", 95 | "faucet": [ 96 | { 97 | "url": "https://www.alchemy.com/faucets/optimism-sepolia", 98 | "remark": that.$t('faucetData.remarkOptimismSepolia[0]') 99 | }, 100 | { 101 | "url": "https://learnweb3.io/faucets/optimism_sepolia", 102 | "remark": that.$t('faucetData.remarkOptimismSepolia[1]') 103 | } 104 | ] 105 | }, 106 | { 107 | "network": "Arbitrum Sepolia", 108 | "remark": "Arbitrum "+that.$t('faucetData.testnet'), 109 | "chainID": "421614", 110 | "currency": "arbETH", 111 | "img": "arbitrumLogo.png", 112 | "faucet": [ 113 | { 114 | "url": "https://www.alchemy.com/faucets/arbitrum-sepolia", 115 | "remark": that.$t('faucetData.remarkArbitrumSepolia[0]') 116 | }, 117 | { 118 | "url": "https://learnweb3.io/faucets/arbitrum_sepolia", 119 | "remark": that.$t('faucetData.remarkArbitrumSepolia[1]') 120 | } 121 | ] 122 | }, 123 | { 124 | "network": "BNB Chain Testnet", 125 | "remark": "BSC "+that.$t('faucetData.testnet'), 126 | "chainID": "97", 127 | "currency": "tBNB", 128 | "img": "bscScanLogo.png", 129 | "faucet": [ 130 | { 131 | "url": "https://unitap.app/gas-tap", 132 | "remark": "" 133 | }, 134 | { 135 | "url": "https://testnet.bnbchain.org/faucet-smart", 136 | "remark": "" 137 | } 138 | ] 139 | }, 140 | { 141 | "network": "Gnosis Chain", 142 | "remark": "Gnosis "+that.$t('faucetData.testnet'), 143 | "chainID": "300", 144 | "currency": "xDai", 145 | "img": "gnosisLogo.webp", 146 | "faucet": [ 147 | { 148 | "url": "https://stakely.io/faucet/xdai-chain", 149 | "remark": "" 150 | } 151 | ] 152 | }, 153 | { 154 | "network": "Avalanche Testnet", 155 | "remark": "Avalanche "+that.$t('faucetData.testnet'), 156 | "chainID": "43113", 157 | "currency": "AVAX", 158 | "img": "avalancheLogo.webp", 159 | "faucet": [ 160 | { 161 | "url": "https://faucet.avax-test.network", 162 | "remark": "" 163 | } 164 | ] 165 | }, 166 | { 167 | "network": "OKExChain Testnet", 168 | "remark": "OKExChain "+that.$t('faucetData.testnet'), 169 | "chainID": "65", 170 | "currency": "OKT", 171 | "img": "okexLogo.webp", 172 | "faucet": [ 173 | { 174 | "url": "https://gitter.im/okexchain-testnet/faucet", 175 | "remark": "" 176 | }, 177 | { 178 | "url": "https://discord.gg/B5nMs6qK5F", 179 | "remark": "" 180 | } 181 | ] 182 | }, 183 | { 184 | "network": "Harmony Testnet", 185 | "remark": "Harmony "+that.$t('faucetData.testnet'), 186 | "chainID": "1666700000", 187 | "currency": "ONE", 188 | "img": "harmonyLogo.webp", 189 | "faucet": [ 190 | { 191 | "url": "https://faucet.pops.one", 192 | "remark": that.$t('faucetData.remarkHarmony[0]') 193 | } 194 | ] 195 | }, 196 | { 197 | "network": "Aurora Testnet", 198 | "remark": "Aurora "+that.$t('faucetData.testnet'), 199 | "chainID": "1313161555", 200 | "currency": "ETH", 201 | "img": "auroraLogo.webp", 202 | "faucet": [ 203 | { 204 | "url": "https://aurora.dev/faucet", 205 | "remark": "" 206 | } 207 | ] 208 | }, 209 | { 210 | "network": "Celo Alfajores Testnet", 211 | "remark": "Celo "+that.$t('faucetData.testnet'), 212 | "chainID": "44787", 213 | "currency": "CELO", 214 | "img": "celoLogo.webp", 215 | "faucet": [ 216 | { 217 | "url": "https://faucet.celo.org/", 218 | "remark": that.$t('faucetData.remarkCelo[0]') 219 | } 220 | ] 221 | }, 222 | { 223 | "network": "Cube Chain Testnet", 224 | "remark": "Cube "+that.$t('faucetData.testnet'), 225 | "chainID": "1819", 226 | "currency": "CUBET", 227 | "img": "cubeLogo.png", 228 | "faucet": [ 229 | { 230 | "url": "https://faucet.cube.network/", 231 | "remark": "" 232 | }, 233 | ] 234 | } 235 | ] 236 | } -------------------------------------------------------------------------------- /public/commonABI/ERC1155.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "string", 6 | "name": "_uri", 7 | "type": "string" 8 | } 9 | ], 10 | "stateMutability": "nonpayable", 11 | "type": "constructor" 12 | }, 13 | { 14 | "anonymous": false, 15 | "inputs": [ 16 | { 17 | "indexed": true, 18 | "internalType": "address", 19 | "name": "account", 20 | "type": "address" 21 | }, 22 | { 23 | "indexed": true, 24 | "internalType": "address", 25 | "name": "operator", 26 | "type": "address" 27 | }, 28 | { 29 | "indexed": false, 30 | "internalType": "bool", 31 | "name": "approved", 32 | "type": "bool" 33 | } 34 | ], 35 | "name": "ApprovalForAll", 36 | "type": "event" 37 | }, 38 | { 39 | "anonymous": false, 40 | "inputs": [ 41 | { 42 | "indexed": true, 43 | "internalType": "address", 44 | "name": "operator", 45 | "type": "address" 46 | }, 47 | { 48 | "indexed": true, 49 | "internalType": "address", 50 | "name": "from", 51 | "type": "address" 52 | }, 53 | { 54 | "indexed": true, 55 | "internalType": "address", 56 | "name": "to", 57 | "type": "address" 58 | }, 59 | { 60 | "indexed": false, 61 | "internalType": "uint256[]", 62 | "name": "ids", 63 | "type": "uint256[]" 64 | }, 65 | { 66 | "indexed": false, 67 | "internalType": "uint256[]", 68 | "name": "values", 69 | "type": "uint256[]" 70 | } 71 | ], 72 | "name": "TransferBatch", 73 | "type": "event" 74 | }, 75 | { 76 | "anonymous": false, 77 | "inputs": [ 78 | { 79 | "indexed": true, 80 | "internalType": "address", 81 | "name": "operator", 82 | "type": "address" 83 | }, 84 | { 85 | "indexed": true, 86 | "internalType": "address", 87 | "name": "from", 88 | "type": "address" 89 | }, 90 | { 91 | "indexed": true, 92 | "internalType": "address", 93 | "name": "to", 94 | "type": "address" 95 | }, 96 | { 97 | "indexed": false, 98 | "internalType": "uint256", 99 | "name": "id", 100 | "type": "uint256" 101 | }, 102 | { 103 | "indexed": false, 104 | "internalType": "uint256", 105 | "name": "value", 106 | "type": "uint256" 107 | } 108 | ], 109 | "name": "TransferSingle", 110 | "type": "event" 111 | }, 112 | { 113 | "anonymous": false, 114 | "inputs": [ 115 | { 116 | "indexed": false, 117 | "internalType": "string", 118 | "name": "value", 119 | "type": "string" 120 | }, 121 | { 122 | "indexed": true, 123 | "internalType": "uint256", 124 | "name": "id", 125 | "type": "uint256" 126 | } 127 | ], 128 | "name": "URI", 129 | "type": "event" 130 | }, 131 | { 132 | "inputs": [ 133 | { 134 | "internalType": "address", 135 | "name": "account", 136 | "type": "address" 137 | }, 138 | { 139 | "internalType": "uint256", 140 | "name": "id", 141 | "type": "uint256" 142 | } 143 | ], 144 | "name": "balanceOf", 145 | "outputs": [ 146 | { 147 | "internalType": "uint256", 148 | "name": "", 149 | "type": "uint256" 150 | } 151 | ], 152 | "stateMutability": "view", 153 | "type": "function" 154 | }, 155 | { 156 | "inputs": [ 157 | { 158 | "internalType": "address[]", 159 | "name": "accounts", 160 | "type": "address[]" 161 | }, 162 | { 163 | "internalType": "uint256[]", 164 | "name": "ids", 165 | "type": "uint256[]" 166 | } 167 | ], 168 | "name": "balanceOfBatch", 169 | "outputs": [ 170 | { 171 | "internalType": "uint256[]", 172 | "name": "", 173 | "type": "uint256[]" 174 | } 175 | ], 176 | "stateMutability": "view", 177 | "type": "function" 178 | }, 179 | { 180 | "inputs": [ 181 | { 182 | "internalType": "address", 183 | "name": "account", 184 | "type": "address" 185 | }, 186 | { 187 | "internalType": "address", 188 | "name": "operator", 189 | "type": "address" 190 | } 191 | ], 192 | "name": "isApprovedForAll", 193 | "outputs": [ 194 | { 195 | "internalType": "bool", 196 | "name": "", 197 | "type": "bool" 198 | } 199 | ], 200 | "stateMutability": "view", 201 | "type": "function" 202 | }, 203 | { 204 | "inputs": [ 205 | { 206 | "internalType": "address", 207 | "name": "from", 208 | "type": "address" 209 | }, 210 | { 211 | "internalType": "address", 212 | "name": "to", 213 | "type": "address" 214 | }, 215 | { 216 | "internalType": "uint256[]", 217 | "name": "ids", 218 | "type": "uint256[]" 219 | }, 220 | { 221 | "internalType": "uint256[]", 222 | "name": "amounts", 223 | "type": "uint256[]" 224 | }, 225 | { 226 | "internalType": "bytes", 227 | "name": "data", 228 | "type": "bytes" 229 | } 230 | ], 231 | "name": "safeBatchTransferFrom", 232 | "outputs": [], 233 | "stateMutability": "nonpayable", 234 | "type": "function" 235 | }, 236 | { 237 | "inputs": [ 238 | { 239 | "internalType": "address", 240 | "name": "from", 241 | "type": "address" 242 | }, 243 | { 244 | "internalType": "address", 245 | "name": "to", 246 | "type": "address" 247 | }, 248 | { 249 | "internalType": "uint256", 250 | "name": "id", 251 | "type": "uint256" 252 | }, 253 | { 254 | "internalType": "uint256", 255 | "name": "amount", 256 | "type": "uint256" 257 | }, 258 | { 259 | "internalType": "bytes", 260 | "name": "data", 261 | "type": "bytes" 262 | } 263 | ], 264 | "name": "safeTransferFrom", 265 | "outputs": [], 266 | "stateMutability": "nonpayable", 267 | "type": "function" 268 | }, 269 | { 270 | "inputs": [ 271 | { 272 | "internalType": "address", 273 | "name": "operator", 274 | "type": "address" 275 | }, 276 | { 277 | "internalType": "bool", 278 | "name": "approved", 279 | "type": "bool" 280 | } 281 | ], 282 | "name": "setApprovalForAll", 283 | "outputs": [], 284 | "stateMutability": "nonpayable", 285 | "type": "function" 286 | }, 287 | { 288 | "inputs": [ 289 | { 290 | "internalType": "bytes4", 291 | "name": "interfaceId", 292 | "type": "bytes4" 293 | } 294 | ], 295 | "name": "supportsInterface", 296 | "outputs": [ 297 | { 298 | "internalType": "bool", 299 | "name": "", 300 | "type": "bool" 301 | } 302 | ], 303 | "stateMutability": "view", 304 | "type": "function" 305 | }, 306 | { 307 | "inputs": [ 308 | { 309 | "internalType": "uint256", 310 | "name": "", 311 | "type": "uint256" 312 | } 313 | ], 314 | "name": "uri", 315 | "outputs": [ 316 | { 317 | "internalType": "string", 318 | "name": "", 319 | "type": "string" 320 | } 321 | ], 322 | "stateMutability": "view", 323 | "type": "function" 324 | } 325 | ] -------------------------------------------------------------------------------- /public/commonABI/ERC721.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [], 4 | "stateMutability": "nonpayable", 5 | "type": "constructor" 6 | }, 7 | { 8 | "anonymous": false, 9 | "inputs": [ 10 | { 11 | "indexed": true, 12 | "internalType": "address", 13 | "name": "owner", 14 | "type": "address" 15 | }, 16 | { 17 | "indexed": true, 18 | "internalType": "address", 19 | "name": "approved", 20 | "type": "address" 21 | }, 22 | { 23 | "indexed": true, 24 | "internalType": "uint256", 25 | "name": "tokenId", 26 | "type": "uint256" 27 | } 28 | ], 29 | "name": "Approval", 30 | "type": "event" 31 | }, 32 | { 33 | "anonymous": false, 34 | "inputs": [ 35 | { 36 | "indexed": true, 37 | "internalType": "address", 38 | "name": "owner", 39 | "type": "address" 40 | }, 41 | { 42 | "indexed": true, 43 | "internalType": "address", 44 | "name": "operator", 45 | "type": "address" 46 | }, 47 | { 48 | "indexed": false, 49 | "internalType": "bool", 50 | "name": "approved", 51 | "type": "bool" 52 | } 53 | ], 54 | "name": "ApprovalForAll", 55 | "type": "event" 56 | }, 57 | { 58 | "anonymous": false, 59 | "inputs": [ 60 | { 61 | "indexed": true, 62 | "internalType": "address", 63 | "name": "from", 64 | "type": "address" 65 | }, 66 | { 67 | "indexed": true, 68 | "internalType": "address", 69 | "name": "to", 70 | "type": "address" 71 | }, 72 | { 73 | "indexed": true, 74 | "internalType": "uint256", 75 | "name": "tokenId", 76 | "type": "uint256" 77 | } 78 | ], 79 | "name": "Transfer", 80 | "type": "event" 81 | }, 82 | { 83 | "inputs": [ 84 | { 85 | "internalType": "address", 86 | "name": "to", 87 | "type": "address" 88 | }, 89 | { 90 | "internalType": "uint256", 91 | "name": "tokenId", 92 | "type": "uint256" 93 | } 94 | ], 95 | "name": "approve", 96 | "outputs": [], 97 | "stateMutability": "nonpayable", 98 | "type": "function" 99 | }, 100 | { 101 | "inputs": [ 102 | { 103 | "internalType": "address", 104 | "name": "owner", 105 | "type": "address" 106 | } 107 | ], 108 | "name": "balanceOf", 109 | "outputs": [ 110 | { 111 | "internalType": "uint256", 112 | "name": "", 113 | "type": "uint256" 114 | } 115 | ], 116 | "stateMutability": "view", 117 | "type": "function" 118 | }, 119 | { 120 | "inputs": [ 121 | { 122 | "internalType": "uint256", 123 | "name": "tokenId", 124 | "type": "uint256" 125 | } 126 | ], 127 | "name": "getApproved", 128 | "outputs": [ 129 | { 130 | "internalType": "address", 131 | "name": "", 132 | "type": "address" 133 | } 134 | ], 135 | "stateMutability": "view", 136 | "type": "function" 137 | }, 138 | { 139 | "inputs": [ 140 | { 141 | "internalType": "address", 142 | "name": "owner", 143 | "type": "address" 144 | }, 145 | { 146 | "internalType": "address", 147 | "name": "operator", 148 | "type": "address" 149 | } 150 | ], 151 | "name": "isApprovedForAll", 152 | "outputs": [ 153 | { 154 | "internalType": "bool", 155 | "name": "", 156 | "type": "bool" 157 | } 158 | ], 159 | "stateMutability": "view", 160 | "type": "function" 161 | }, 162 | { 163 | "inputs": [], 164 | "name": "name", 165 | "outputs": [ 166 | { 167 | "internalType": "string", 168 | "name": "", 169 | "type": "string" 170 | } 171 | ], 172 | "stateMutability": "view", 173 | "type": "function" 174 | }, 175 | { 176 | "inputs": [ 177 | { 178 | "internalType": "uint256", 179 | "name": "tokenId", 180 | "type": "uint256" 181 | } 182 | ], 183 | "name": "ownerOf", 184 | "outputs": [ 185 | { 186 | "internalType": "address", 187 | "name": "", 188 | "type": "address" 189 | } 190 | ], 191 | "stateMutability": "view", 192 | "type": "function" 193 | }, 194 | { 195 | "inputs": [ 196 | { 197 | "internalType": "address", 198 | "name": "from", 199 | "type": "address" 200 | }, 201 | { 202 | "internalType": "address", 203 | "name": "to", 204 | "type": "address" 205 | }, 206 | { 207 | "internalType": "uint256", 208 | "name": "tokenId", 209 | "type": "uint256" 210 | } 211 | ], 212 | "name": "safeTransferFrom", 213 | "outputs": [], 214 | "stateMutability": "nonpayable", 215 | "type": "function" 216 | }, 217 | { 218 | "inputs": [ 219 | { 220 | "internalType": "address", 221 | "name": "from", 222 | "type": "address" 223 | }, 224 | { 225 | "internalType": "address", 226 | "name": "to", 227 | "type": "address" 228 | }, 229 | { 230 | "internalType": "uint256", 231 | "name": "tokenId", 232 | "type": "uint256" 233 | }, 234 | { 235 | "internalType": "bytes", 236 | "name": "_data", 237 | "type": "bytes" 238 | } 239 | ], 240 | "name": "safeTransferFrom", 241 | "outputs": [], 242 | "stateMutability": "nonpayable", 243 | "type": "function" 244 | }, 245 | { 246 | "inputs": [ 247 | { 248 | "internalType": "address", 249 | "name": "operator", 250 | "type": "address" 251 | }, 252 | { 253 | "internalType": "bool", 254 | "name": "approved", 255 | "type": "bool" 256 | } 257 | ], 258 | "name": "setApprovalForAll", 259 | "outputs": [], 260 | "stateMutability": "nonpayable", 261 | "type": "function" 262 | }, 263 | { 264 | "inputs": [ 265 | { 266 | "internalType": "bytes4", 267 | "name": "interfaceId", 268 | "type": "bytes4" 269 | } 270 | ], 271 | "name": "supportsInterface", 272 | "outputs": [ 273 | { 274 | "internalType": "bool", 275 | "name": "", 276 | "type": "bool" 277 | } 278 | ], 279 | "stateMutability": "view", 280 | "type": "function" 281 | }, 282 | { 283 | "inputs": [], 284 | "name": "symbol", 285 | "outputs": [ 286 | { 287 | "internalType": "string", 288 | "name": "", 289 | "type": "string" 290 | } 291 | ], 292 | "stateMutability": "view", 293 | "type": "function" 294 | }, 295 | { 296 | "inputs": [ 297 | { 298 | "internalType": "uint256", 299 | "name": "tokenId", 300 | "type": "uint256" 301 | } 302 | ], 303 | "name": "tokenURI", 304 | "outputs": [ 305 | { 306 | "internalType": "string", 307 | "name": "", 308 | "type": "string" 309 | } 310 | ], 311 | "stateMutability": "view", 312 | "type": "function" 313 | }, 314 | { 315 | "inputs": [ 316 | { 317 | "internalType": "address", 318 | "name": "from", 319 | "type": "address" 320 | }, 321 | { 322 | "internalType": "address", 323 | "name": "to", 324 | "type": "address" 325 | }, 326 | { 327 | "internalType": "uint256", 328 | "name": "tokenId", 329 | "type": "uint256" 330 | } 331 | ], 332 | "name": "transferFrom", 333 | "outputs": [], 334 | "stateMutability": "nonpayable", 335 | "type": "function" 336 | } 337 | ] -------------------------------------------------------------------------------- /src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 154 | 155 | -------------------------------------------------------------------------------- /src/views/HashTool.vue: -------------------------------------------------------------------------------- 1 | 37 | 202 | 203 | 384 | -------------------------------------------------------------------------------- /src/lang/zh.js: -------------------------------------------------------------------------------- 1 | export default { 2 | pubilc: { 3 | usingHelp: "使用帮助", 4 | copySauccessfully: "复制成功", 5 | copyFailed: "复制失败", 6 | noData: "暂无数据", 7 | cancel: "取 消", 8 | sure: "确 定", 9 | copy: "复制", 10 | querying: "正在查询", 11 | btnInquire: "查询", 12 | tool:"工具", 13 | wallet:"钱包" 14 | }, 15 | title: { 16 | home: "区块链开发者的工具箱", 17 | unitConvert: "Ether单位换算", 18 | bulkQuery: "批量查询钱包余额", 19 | traceview: "交易分析工具", 20 | abi: "ABI 图形化", 21 | address: "地址转换与ENS查询", 22 | querySelector: "函数名查询函数选择器", 23 | topicID: "查询事件主题(TopicID)", 24 | hashTool: "Hash工具", 25 | calldata: "交易输入数据(Calldata)编解码", 26 | faucet: "测试币水龙头" 27 | }, 28 | navigation: { 29 | connectWallet: "连接钱包", 30 | nav: { 31 | home: "首页", 32 | languageSelection: "语言选择", 33 | folloUs: "关注我们", 34 | } 35 | }, 36 | home: { 37 | title: ["开源", "工具箱", "让区块链开发更轻松"], 38 | describe: "开源才值得信赖,好用才提高效率,你所需的工具尽在于此。", 39 | btnFeedback: "问题反馈", 40 | subheadingToolList: "工具列表", 41 | listDescribe: "免费效率工具,快上手试试吧", 42 | EVMWalletGenerator: '生成 EVM 钱包', 43 | toolList: [ 44 | { 45 | title: '单位换算', 46 | detail: 'ETH 单位换算', 47 | }, 48 | { 49 | title: '批量查询', 50 | detail: '批量查询钱包余额', 51 | }, 52 | { 53 | title: '交易分析', 54 | detail: '解析 EVM 交易内部详情', 55 | }, 56 | { 57 | title: 'ABI 可视化调用', 58 | detail: '根据 ABI 自动生成可调用函数', 59 | }, 60 | { 61 | title: '地址转换与ENS查询', 62 | detail: '地址查询转换与ENS查询', 63 | }, 64 | { 65 | title: '生成钱包', 66 | detail: '批量生成 EVM / BTC 钱包', 67 | }, 68 | { 69 | title: '签名选择器查询', 70 | detail: '根据函数签名查询 4 字节函数选择器', 71 | }, 72 | { 73 | title: '事件签名查询主题(TopicID)', 74 | detail: '根据事件签名查询主题TopicID及反向查询', 75 | }, 76 | { 77 | title: 'Hash 工具', 78 | detail: '常用 Hash 工具,如keccak-256、base64 等计算', 79 | }, 80 | { 81 | title: '交易输入数据编解码', 82 | detail: '编码及解码交易输入数据(Input Calldata)', 83 | }, 84 | { 85 | title: '测试币水龙头大全', 86 | detail: '测试网水龙头测试币获取', 87 | }, 88 | { 89 | title: '生成BTC钱包', 90 | detail: '批量生成BTC钱包', 91 | }, 92 | ], 93 | }, 94 | uintConvert: { 95 | title: "以太 ETH 单位转换器", 96 | describe: "以太币的最小单位是Wei,1个ETH等于10的18次方Wei。在支付Gas费时大家习惯使用Gwei作为展示单位,日常使用的单位是ETH、Gwei 和 Wei;", 97 | illustrate: ["以太坊 Ethereum 和以太币 Ether 的区别:", "以太坊 Ethereum 是一个允许任何人在其上创建和使用分布式应用的开放的区块链平台。", "以太币 Ether 是以太坊 Ethereum 中通用的货币,它主要用于支付转账及执行智能合约所消耗的汽油(Gas),在交易中以太币被缩写为ETH。"], 98 | }, 99 | bulkQuery: { 100 | enterAddress: "代币地址", 101 | enterAddressPrompt: "默认 ETH 地址", 102 | enterWalletAddress: "钱包地址", 103 | enterWalletAddressPrompt: "一行输入一个地址", 104 | inquireResult: "查询结果", 105 | list: ["钱包地址", "代币", "余额"], 106 | bntCheckBalance: "查询余额", 107 | btnExportExcel: "下载 Excel", 108 | exportExcelPrompt: "你当前还没有查询余额,请查询余额后再进行下载表格", 109 | checkBalancePrompt: ["你还没有输入钱包地址,请输入钱包地址后重试", "你输入代币地址错误,请重新输入后重试"], 110 | }, 111 | traceView: { 112 | title: "交易堆栈 Trace 分析工具", 113 | transactionHash: "交易哈希", 114 | inputTransactionHash: "输入交易哈希", 115 | btnAnalyze: "分析", 116 | options: "高级选项", 117 | inputAddressMap: "请填入Address 别名", 118 | inputFunctionMap: "请填入函数别名", 119 | example: "例", 120 | AddressMap: "地址映射", 121 | FunctionMap: "功能映射", 122 | CallTraces: "CallTraces", 123 | prompt: ["请输入正确的交易 Hash 值", "请输入交易hash值后重试"], 124 | analyzing: "全力分析中...", 125 | parsingFailed: ["解析失败,请稍后再试", "解析失败"] 126 | }, 127 | abi: { 128 | title: "ABI 可视化调用", 129 | btnAddContract: "添加合约", 130 | btnShare: "分享", 131 | sharePrompt: "链接分享给好友,将自动加载合约", 132 | btnABI: "查看ABI", 133 | ABIPrompt: "点击可查看ABI,还可以复制ABI", 134 | btnEtherscan: "查看Etherscan", 135 | EtherscanPrompt: "点击可跳转到对应区块链浏览器", 136 | btnEdit: "编辑", 137 | editPrompt: "可修改合约的名称、网络、地址、ABI", 138 | btnDelect: "删除", 139 | delectPrompt: "点击可删除合约", 140 | contractName: "合约名称", 141 | blockchainAddress: "区块链", 142 | contractAddress: "合约地址", 143 | callFunctions: "调用函数:", 144 | inputValue: "请输入 Value", 145 | pleaseChoose: "请选择", 146 | clearOutput: "清空输出", 147 | run: "运行", 148 | transactionDetails: "交易详情:", 149 | returnContent: "返回内容:", 150 | contract: "合约", 151 | commonABIs: "常见 ABI", 152 | blockchainNetwork: "区块链网络", 153 | selectNetwork: "请选择要连接的网络", 154 | chooseCommonABI: "从常见 ABI 选择", 155 | uploadABIFile: "上传 ABI 文件", 156 | etherscanGet: "从 Etherscan 获取", 157 | lookOverABI: "查看 ABI", 158 | jsonABI: "JSON ABI", 159 | readableABI: "可读友好的 ABI", 160 | inputPrompt: "请输入内容", 161 | quit: "关 闭", 162 | validateName: "请输入合约名称", 163 | sameName: "已有相同名称合约存在", 164 | validateAddress: "请输入正确的合约地址", 165 | checkAbi: "请输入 ABI", 166 | checkNetwork: "请选择区块链网络", 167 | autoAddError: '自动添加合约失败', 168 | promptSharingError: "分享失败,请稍后再试,", 169 | copyShareSuccess: "复制分享链接成功", 170 | examineAddressAndNetwork: "请输入合约地址和网络后重试", 171 | getABIeroor: "ABI获取失败", 172 | useCurrentNetwork: "使用当前连接网络", 173 | checkAbiError: "ABI有误!添加失败,请检查后重试", 174 | notSelectedContractPrompt: "当前暂未选择合约", 175 | contractNotRecorded: "该合约Etherscan暂未被记录", 176 | deniedAccess: "用户拒绝帐户访问", 177 | notInstalledMetaMaskPrompt: "需要安装MetaMask", 178 | abiError: "ABI有误", 179 | switchNetworkPrompt: "当前钱包连接的链与本合约连接的链不同。将为你切换到对应网络", 180 | currentNetworkError: "当前网络错误", 181 | connectionRequestError: "连接请求错误,请尝试手动连接。连接后刷新页面重试。", 182 | btnReturn:"返回", 183 | btnDevelop:"展开操作栏", 184 | btnFold:"收起操作栏", 185 | riskWarning:"当前的合约未开源验证,请确认风险,谨慎使用!!!", 186 | }, 187 | address: { 188 | address: "地址", 189 | btnConvert: "确认转换", 190 | btnInquire: "确认查询", 191 | inputENS: "输入ENS", 192 | errorAddressPrompt: "您输入的地址不合法,请重新输入。", 193 | errorENSPrompt: "没有查询到对应的ENS,也没有查询到对应的地址。" 194 | }, 195 | generateWallet: { 196 | tips: ["Tips:钱包生成过程均在本地完成,代码完全", "开源", "。任何人都无法获取到您的助记词及私钥,请放心使用。"], 197 | randomBatch: "随机批量生成", 198 | customize: "自定义私钥或助记词创建", 199 | mnemonicLength: "选择助记词长度", 200 | quantity: "生成钱包的数量", 201 | btnGenerateImmediately: "立即生成", 202 | regenerate: "重新生成", 203 | exportexcel: "下载表格", 204 | walletsNumber: "输入生成钱包数量", 205 | subtitle: "通过私钥或助记词创建钱包", 206 | createNow: "立即创建", 207 | enterPrompt: "输入私钥或助记词", 208 | address: "地址", 209 | privateKey: "私钥", 210 | mnemonic: '助记词', 211 | nullErrorPrompt: "你没有选择助记词长度或没有填入生成钱包的地址数量", 212 | IllegalErrorPrompt: "你写入的生成钱包的地址数量非数字或小于1, 无法生成,请重新输入", 213 | beyondErrorPrompt: "你写入的钱包数量大于100, 无法生成。请输入不大于100的生成数量。", 214 | inputErrorPrompt: "创建失败,请检查你的输入", 215 | popoverBtnClick: "查看", 216 | options:["同一助记词推导","不同助记词","自定义助记词创建"], 217 | advancedOptions:{ 218 | title:"高级选项", 219 | tips:["有关高级选项,请参阅","BIP44 规范"], 220 | options:["协议","币种","账户","外部内部","系数","推导路径"] 221 | }, 222 | messages:['最大生成钱包数量为100','当前生成钱包数量较多,请耐心等待','通过私钥生成钱包,无法改变生成数量及使用高级选项'], 223 | subtitleMnemonicCreate:"通过助记词创建钱包", 224 | publicKey:"公钥", 225 | }, 226 | querySelector: { 227 | title: "函数名 <-> 函数选择器", 228 | inputFunctionName: '通过函数名查询函数选择器', 229 | inputFunctionNamePrompt: "输入函数签名", 230 | inquire: "查询", 231 | inputByteFunctionSelector: "输入函数选择器查询函数签名", 232 | functionInputError: "你输入的函数有误,请重新输入!", 233 | noRecord: "你所查找的选择器暂未被记录", 234 | pointOutQuerying:"正在查询" 235 | }, 236 | topicID: { 237 | title: "事件 <-> 主题(TopicID)", 238 | EventSignature: '根据事件名查询主题(TopicID)', 239 | inputEventSignature: "输入事件签名", 240 | TopicID: "根据TopicID查询事件名", 241 | InputTopicID: "输入主题ID", 242 | signatureInputError: "输入错误,输入示例:event Transfer(address indexed from, address indexed to, uint256 amount)", 243 | topicIDInputError: "暂未查询到对应的事件签名。输入示例:0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" 244 | }, 245 | hashTool: { 246 | title: "Hash 工具", 247 | btnConfirm: "确认", 248 | coding: "编码", 249 | decoding: "解码", 250 | errorHexadecimal: "你的输入不是16进制的字符,请重新输入", 251 | decodingError: "解码失败,请检查你的输入后重试", 252 | noInput: "你的输入为空,请重新输入" 253 | }, 254 | calldata: { 255 | decoding: "解码", 256 | coding: "编码", 257 | inputFunction: "输入函数", 258 | inputFunctionPrompt: "请输入函数", 259 | parameter: "参数", 260 | inputParameterPrompt: "一行输入一个参数,数组类型参数输入格式:[0x2222,0x4444]", 261 | inputError: "你的输入有误,请检查后重试", 262 | inputCalldata: "输入Calldata", 263 | selectFunction: "选择函数", 264 | autoChoose: "自动选择", 265 | manualInput: "手动输入", 266 | decodingResult: "解码结果", 267 | parameter: "参数", 268 | parameterType: "参数类型", 269 | value: "值", 270 | queryFailed: "查询失败,请检查你的输入后重试", 271 | }, 272 | faucet: { 273 | prompt: ["水龙头(Faucet)是一个平台,为你提供测试币(或 Token ),以便在测试智能合约时使用。", "ChainTool 水龙头为大家收集了常用测试网的水龙头网站,方便开发者们享用。", "如果你有我们没有列出的水龙头网站,欢迎提交", "PR", "或", "ISSUE", "帮我们改进,你的支持是我们无限的动力。"], 274 | currency: "货币", 275 | url: "网址", 276 | remark: "备注", 277 | operate: "操作", 278 | receive: "前往领取", 279 | copyUrl: "复制网址", 280 | copyURLSuccessfully: "复制网址成功", 281 | }, 282 | notfind: { 283 | title: "未到找指定页面", 284 | return: "返回页面" 285 | }, 286 | faucetData: { 287 | ethereum: "以太坊", 288 | testnet: "测试网", 289 | remarkGoerli: ["要求在主网至少有 0.001ETH 才能领取", "需要通过挖矿获取", "可领取ETH、wETH、DAI、NFTs,要求登录Twitter", "在 2022 年11之前部署过合约的,可以领 10 个"], 290 | remarkSepolia: ["每天 1 Sepolia ETH", "需要通过挖矿获取", "在 2022 年11之前部署过合约的,可以领 10 个"], 291 | remarkMumbai: ["每天0.5 Mumbai MATIC"], 292 | remarkHarmony: ["包含Shard 0、Shard 1、Shard 2、Shard 3"], 293 | remarkCelo: ["需要使用Github进行身份验证"], 294 | remarkOptimismSepolia: ["每天 0.5 opEth, 需要主网钱包至少有 0.001 ETH", "每天 0.01 opEth"], 295 | remarkArbitrumSepolia: ["每天 0.5 opEth, 需要主网钱包至少有 0.001 ETH", "每天 0.01 opEth"] 296 | }, 297 | connectWallet: { 298 | walleAccessDenied: "连接失败, MetaMask连接被拒绝。", 299 | notInstalledMetaMask: "连接失败, 请先安装MetaMask." 300 | } 301 | } -------------------------------------------------------------------------------- /src/views/BulkQuery.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 231 | 232 | -------------------------------------------------------------------------------- /src/views/calldata/DeCoding.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 243 | 244 | -------------------------------------------------------------------------------- /src/views/Faucet.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 251 | 252 | -------------------------------------------------------------------------------- /src/views/ConvertTopicID.vue: -------------------------------------------------------------------------------- 1 | 36 | 238 | 239 | 403 | -------------------------------------------------------------------------------- /src/generateTree.js: -------------------------------------------------------------------------------- 1 | const ethers = require('ethers') 2 | 3 | async function parsingRawTraces(rawTraces, 4 | addressMapByUser, 5 | functionMapByUser, 6 | addressMapByCrawl, 7 | functionMapByCrawl 8 | ) { 9 | let res = []; 10 | // 解析rawTraces结构,是一个对象数组,解析时插入tree id 11 | for (let i = 0; i < rawTraces.length; i++) { 12 | // 交易结构 13 | let tx = { 14 | id: "0", // tree id 15 | pid: "", // 父id 16 | children: [], 17 | calltype: "", //调用类型 18 | ETH: "", // value 19 | from: "", // 发送者的地址 20 | fromName: "", // 发送者地址的解析名称 21 | to: "", // 接收者的地址,一般是合约地址 22 | toName: "", // 接收者地址的解析名称 23 | function: "", // 调用的函数签名 24 | inputArg: "", // 函数的参数集合 25 | gasUsed: "", // 实际消耗的gas 26 | output: "", // 函数输出 27 | init: false, // 该交易是否是创建合约 28 | } 29 | // 解析合约调用深度 30 | let deep = rawTraces[i].traceAddress.length; 31 | if (deep) { 32 | // 处理子节点id 33 | for (let j = 0; j < deep; j++) { 34 | tx.pid = tx.id; 35 | tx.id += ("-" + rawTraces[i].traceAddress[j]); 36 | } 37 | } 38 | 39 | // 先判断该交易是创建合约还是普通调用 40 | if (rawTraces[i].action.init) { 41 | // 创建合约 42 | tx.calltype = "create"; 43 | tx.function = "constructor()"; 44 | tx.init = true; 45 | tx.ETH = await getETH(rawTraces[i].action.value); 46 | tx.gasUsed = await getGasUsed(rawTraces[i].result.gasUsed); 47 | tx.from = rawTraces[i].action.from; 48 | tx.fromName = await getAddressName(rawTraces[i].action.from, addressMapByUser, addressMapByCrawl); 49 | tx.output = rawTraces[i].result.address; 50 | } else { 51 | // 普通调用 52 | try { 53 | tx.calltype = rawTraces[i].action.callType; 54 | tx.ETH = await getETH(rawTraces[i].action.value); 55 | tx.from = rawTraces[i].action.from; 56 | tx.fromName = await getAddressName(rawTraces[i].action.from, addressMapByUser, addressMapByCrawl); 57 | tx.to = rawTraces[i].action.to; 58 | tx.toName = await getAddressName(rawTraces[i].action.to, addressMapByUser, addressMapByCrawl); 59 | tx.function = await getFunctionSig(rawTraces[i].action.input, functionMapByUser, functionMapByCrawl) 60 | tx.gasUsed = await getGasUsed(rawTraces[i].result.gasUsed); 61 | tx.inputArg = await getInputArg(rawTraces[i].action.input, addressMapByUser, addressMapByCrawl, functionMapByUser, functionMapByCrawl); 62 | tx.output = await getOuput(rawTraces[i].action.input, rawTraces[i].result.output, addressMapByUser, addressMapByCrawl, functionMapByUser, functionMapByCrawl); 63 | } catch (error) { 64 | console.log(error) 65 | } 66 | } 67 | 68 | res.push(tx); 69 | } 70 | 71 | return res; 72 | } 73 | 74 | // 处理input数据返回函数签名,如果有数据返回函数签名,如果为undefined则为空 75 | async function getFunctionSig(inputData, functionMapByUser, functionMapByCrawl) { 76 | if (inputData) { 77 | return inputData.length >= 10 ? 78 | await getFucntionName(inputData.substring(0, 10), functionMapByUser, functionMapByCrawl) : inputData; 79 | } else { 80 | return ""; 81 | } 82 | } 83 | 84 | // 将json结构生成tree结构 85 | async function toTree(traceObj) { 86 | const tree = [] 87 | for (const node of traceObj) { 88 | // 如果没有pid就可以认为是根节点 89 | if (!node.pid) { 90 | let root = node 91 | root.children = getChildren(root.id, traceObj) 92 | tree.push(root) 93 | } 94 | } 95 | 96 | function getChildren(parentID, traceObj) { 97 | let children = [] 98 | for (const node of traceObj) { 99 | if (node.pid === parentID) { 100 | children.push(node) 101 | } 102 | } 103 | for (const node of children) { 104 | let children = getChildren(node.id, traceObj) 105 | node.children = children 106 | } 107 | return children 108 | } 109 | return tree 110 | } 111 | 112 | // 处理ETH数据 113 | async function getETH(value) { 114 | return value != "0x0" ? ethers.utils.formatUnits(value, 18) : ""; 115 | } 116 | 117 | // 处理gasUsed数据 118 | async function getGasUsed(value) { 119 | return value != "0x0" ? ethers.BigNumber.from(value) : ""; 120 | } 121 | 122 | // 处理input数据 123 | /** 124 | * @return Array 返回值是一个数组,数据的每一个元素内有三个值 125 | * eg."function transfer(address to,uint256 value) returns (bool )" 126 | * Array[0][0]: to 127 | * Array[0][1]: 0x4eeea05c9318d6bd9ddaa5a6a001f1916fbd4c9f 128 | * Array[0][2]: address 129 | * Array[1][0]: value 130 | * Array[1][1]: 100000000000000000 131 | * Array[1][2]: uint256 132 | * Array[i][0] 每个元素第一个值该参数的类型,如果没有对应的abi用于解析,则为null 133 | * Array[i][1] 每个元素第二个值表示input arg解析出的arg name,如果map或者用户输入的function map无匹配的值则为null 134 | * Array[i][2] 每个元素第三个值表示该参数在trace result里解析出的值 135 | * Array[i][3] 每个元素第四个值表示该参数未解析前的原始值 136 | * 137 | */ 138 | async function getInputArg( 139 | inputData, 140 | addressMapByUser, 141 | addressMapByCrawl, 142 | functionMapByUser, 143 | functionMapByCrawl 144 | ) { 145 | // todo 这里需要通过abi去解析inputData,abi其实要么在爬取map时保存到本地,要么通过建造本地abi数据库,这样就不用通过接口去请求 146 | // let abi = getDataBase(); 请求数据库 147 | let functionSig = inputData.slice(0, 10); 148 | let abi = getMapAbi(functionSig, functionMapByUser); 149 | if (abi === undefined) abi = getMapAbi(functionSig, functionMapByCrawl); 150 | if (abi === undefined) return [ 151 | [null, null, inputData, inputData] 152 | ]; 153 | 154 | let abiInterface = new ethers.utils.Interface(abi); 155 | let input = abiInterface.fragments[0].inputs; 156 | let len = input.length; 157 | if (!len) return [ 158 | [null, null, "", ""] 159 | ]; 160 | 161 | let arg = []; 162 | let argData = abiInterface.decodeFunctionData(functionSig, inputData); 163 | 164 | for (let i = 0; i < len; i++) { 165 | let type = input[i].type; //参数类型 166 | let temp = argData[i]; // 解析后的值 167 | let originValue = argData[i]; // 未解析的原始值 168 | 169 | // 处理uint类型 170 | if (input[i].type.indexOf("uint") != -1) { 171 | // temp = ethers.utils.formatUnits(argData[i], 18) 172 | } 173 | 174 | // 处理address类型 175 | if (input[i].type.indexOf("address") != -1) { 176 | if (Object.prototype.toString.call(argData[i]) === '[object Array]') { 177 | // address[] 178 | type = 'address[]'; 179 | temp = []; 180 | originValue = []; 181 | 182 | for (let j = 0; j < argData[i].length; j++) { 183 | originValue.push(argData[i][j]); 184 | temp.push(await getAddressName(argData[i][j], addressMapByUser, addressMapByCrawl)); 185 | } 186 | } else if (Object.prototype.toString.call(argData[i]) === '[object String]') { 187 | // address 188 | type = 'address'; 189 | temp = await getAddressName(argData[i], addressMapByUser, addressMapByCrawl); 190 | originValue = argData[i]; 191 | } 192 | 193 | } 194 | 195 | arg.push([type, input[i].name, temp, originValue]); 196 | 197 | } 198 | 199 | return arg; 200 | } 201 | 202 | // 处理output数据 203 | async function getOuput(inputData, outputData, addressMapByUser, addressMapByCrawl, functionMapByUser, functionMapByCrawl) { 204 | if (outputData != '0x') { 205 | let functionSig = inputData.slice(0, 10); 206 | let abi = getMapAbi(functionSig, functionMapByUser); 207 | if (abi === undefined) abi = getMapAbi(functionSig, functionMapByCrawl); 208 | if (abi === undefined) return outputData; 209 | 210 | let abiInterface = new ethers.utils.Interface(abi); 211 | let output = abiInterface.fragments[0].outputs; 212 | let len = output.length; 213 | let decodeResult = abiInterface.decodeFunctionResult(functionSig, outputData); 214 | outputData = [] 215 | for (let i = 0; i < len; i++) { 216 | let temp = decodeResult[i]; 217 | // 处理address类型 218 | if (output[i].type.indexOf("address") != -1) { 219 | if (Object.prototype.toString.call(decodeResult[i]) === '[object Array]') { 220 | // address[] 221 | temp = [] 222 | for (let j = 0; j < decodeResult[i].length; j++) { 223 | // 地址要转小写 224 | let addr = decodeResult[i][j].toLowerCase(); 225 | temp.push(await getAddressName(addr, addressMapByUser, addressMapByCrawl)); 226 | } 227 | } else if (Object.prototype.toString.call(decodeResult[i]) === '[object String]') { 228 | // address 229 | temp = await getAddressName(decodeResult[i], addressMapByUser, addressMapByCrawl); 230 | } 231 | 232 | } 233 | outputData.push(temp) 234 | } 235 | outputData = outputData.join(", ") 236 | } else if (outputData == '0x') { 237 | outputData = "" 238 | } 239 | 240 | return outputData; 241 | } 242 | 243 | // todo: 以后从addressMap拿值会通过请求数据库的方式,加快处理速度 244 | async function getAddressName(address, addressMapByUser, addressMapByCrawl) { 245 | // todo addressMapByUserk可以预处理后存入数据库中作为数据集 246 | // todo 以后修改成优先匹配数据库的addressMap,再匹配用户的addressMap和爬取的addressMap 247 | // let name = getDataBase(address); 请求数据库 248 | // 目前优先匹配用户的addressMap,再匹配爬取的addressMap 249 | let name = ""; 250 | 251 | if (address) { 252 | address = address.toLowerCase(); 253 | name = getMapName(address, addressMapByUser, addressMapByCrawl); 254 | } 255 | 256 | if (name != "") { 257 | return name; 258 | } 259 | //如果map都没有这个address的解析,则返回原address 260 | return address; 261 | } 262 | 263 | // todo: 以后从fucntionMap拿值会通过请求数据库的方式,加快处理速度 264 | async function getFucntionName(functionSig, functionMapByUser, functionMapByCrawl) { 265 | // todo functionMapByUser可以预处理后存入数据库中作为数据集 266 | // todo 以后修改成优先匹配数据库的function sig,匹配用户的functionMap和爬取的functionMap 267 | // let name = getDataBase(functionSig); 请求数据库 268 | // 目前优先匹配用户的functionMap,再匹配爬取的functionMap 269 | 270 | let name = ""; 271 | 272 | functionSig = functionSig.toLowerCase(); 273 | 274 | name = getMapName(functionSig, functionMapByUser, functionMapByCrawl); 275 | 276 | if (name != "") { 277 | // 这里略微处理一下,只获取函数名 278 | // eg."function getReserves()" 279 | let start = 9; 280 | let end = name.indexOf("("); 281 | return name.slice(start, end); 282 | } 283 | 284 | return functionSig 285 | } 286 | 287 | // 获取Map的name 288 | function getMapName(key, mapByUser, mapByCrawl) { 289 | let name = ''; 290 | let map = {}; 291 | if (mapByUser) { 292 | try { 293 | map = JSON.parse(mapByUser); 294 | } catch (error) { } 295 | } else if (mapByCrawl) { 296 | try { 297 | map = JSON.parse(mapByCrawl); 298 | } catch (error) { } 299 | } 300 | 301 | if (map.hasOwnProperty(key)) { 302 | name = map[key] 303 | } 304 | 305 | return name; 306 | } 307 | 308 | // 获取Map的abi 309 | function getMapAbi(key, map) { 310 | if (!map) return undefined; 311 | 312 | try { 313 | map = JSON.parse(map); 314 | let abi = map[key]; 315 | if (!abi) return undefined; 316 | return [abi]; 317 | } catch (error) { 318 | if (map) { 319 | return map[key]; 320 | } else { 321 | return undefined; 322 | } 323 | 324 | } 325 | } 326 | 327 | /** 328 | * @dev 生成树的结构,返回给前端显示 329 | * @param rawTraces trace log json 330 | * @param addressMapByUser 用户输入框中自定义的 address map 331 | * @param functionMapByUser 用户输入框中自定义的 function map 332 | * @param addressMapByCrawl 脚本爬取区块链浏览器开源合约的 address map 333 | * @param functionMapByCrawl 脚本爬取区块链浏览器开源合约的 function map 334 | */ 335 | async function generateTree( 336 | rawTraces, 337 | addressMapByUser, 338 | functionMapByUser, 339 | addressMapByCrawl, 340 | functionMapByCrawl 341 | ) { 342 | let tracesObj = await parsingRawTraces( 343 | rawTraces, 344 | addressMapByUser, 345 | functionMapByUser, 346 | addressMapByCrawl, 347 | functionMapByCrawl 348 | ) 349 | 350 | return await toTree(tracesObj); 351 | } 352 | module.exports = { 353 | generateTree 354 | } -------------------------------------------------------------------------------- /src/lang/en.js: -------------------------------------------------------------------------------- 1 | export default { 2 | pubilc: { 3 | usingHelp: "Help", 4 | copySauccessfully: "Copied", 5 | copyFailed: "Copy Failed", 6 | noData: "No data", 7 | cancel: "Cancel", 8 | sure: "OK", 9 | copy: "Copy", 10 | querying: "loading", 11 | btnInquire: "query", 12 | tool:"Tool", 13 | wallet:"Wallet" 14 | }, 15 | title: { 16 | home: "Toolbox For Blockchain Developer", 17 | unitConvert: "Unit Converter", 18 | bulkQuery: "Batch Query Wallet Balance", 19 | traceview: "Tx trace viewer", 20 | abi: "ABI Caller", 21 | address: "Address & ENS Lookup", 22 | querySelector: "Selector By Function Signature", 23 | topicID: "TopicID Querier", 24 | hashTool: "Hash Tools", 25 | calldata: "Input Calldata Decoder & Encoder", 26 | faucet: "Testnet Faucets" 27 | }, 28 | navigation: { 29 | connectWallet: "Connect Wallet", 30 | nav: { 31 | home: "Home", 32 | languageSelection: "Lang", 33 | folloUs: "Follow", 34 | } 35 | }, 36 | home: { 37 | title: ["OpenSource ", "Toolbox", "Make Blockchain Develop More Easier"], 38 | describe: "Open source is trustworthy, good to use to improve efficiency. The tools you need are here.", 39 | btnFeedback: "Feedback", 40 | subheadingToolList: "Tools", 41 | listDescribe: "Free & Efficiency, try it out", 42 | EVMWalletGenerator: 'EVM Wallet Generator', 43 | toolList: [ 44 | { 45 | title: 'Unit Converter', 46 | detail: 'ETH Unit Converter', 47 | }, 48 | { 49 | title: 'Balance Querier', 50 | detail: 'Batch query wallet balance', 51 | }, 52 | { 53 | title: 'Tx Trace Viewer', 54 | detail: 'Parse internal details of EVM transactions', 55 | }, 56 | { 57 | title: 'ABI Caller', 58 | detail: 'Friendly generate callable functions for ABI', 59 | }, 60 | { 61 | title: 'Address & ENS lookup', 62 | detail: 'Address lookup and ENS lookup', 63 | }, 64 | { 65 | title: 'Wallet Generator', 66 | detail: 'Trustworthy & Batch EVM / BTC Wallet Generator', 67 | }, 68 | { 69 | title: 'Selector Querier', 70 | detail: 'Function selector <=> Function signature', 71 | }, 72 | { 73 | title: 'TopicID Querier', 74 | detail: 'Event TopicID <=> Event signature', 75 | }, 76 | { 77 | title: 'Hash Tools', 78 | detail: 'Commonly used Hash Tools: keccak-256, base64 and so on...', 79 | }, 80 | { 81 | title: 'Calldata Decoder & Encoder', 82 | detail: 'Encoding and decoding Tx Calldata', 83 | }, 84 | { 85 | title: 'Testnet Faucets', 86 | detail: 'Testnet Faucet All in one', 87 | }, 88 | { 89 | title: 'BTC Wallet Generator', 90 | detail: 'Trustworthy & Batch BTC Wallet Generator', 91 | }, 92 | ], 93 | }, 94 | uintConvert: { 95 | title: "Unit Converter", 96 | describe: "The smallest unit of Ether is Wei in EVM, 1 Ether == 10^18 Wei, gwei usual as the unit when paying gas fee.", 97 | illustrate: ["The difference between ethereum and ether:", "Ethereum is an open blockchain platform that allows anyone to deploy or interact with smart contracts on it", "Ether is the native coin in Ethereum, ether used to pay for the gas fee"], 98 | }, 99 | bulkQuery: { 100 | enterAddress: "Token Address", 101 | enterAddressPrompt: "Input your wallet address", 102 | enterWalletAddress: "Wallet", 103 | enterWalletAddressPrompt: "One address per line", 104 | inquireResult: "Result", 105 | list: ["Wallet", "Token", "Balance"], 106 | bntCheckBalance: "Get Balance", 107 | btnExportExcel: "Download Excel", 108 | exportExcelPrompt: "No balance data", 109 | checkBalancePrompt: ["No wallet address", "Token address error, please review"], 110 | }, 111 | traceView: { 112 | title: "Tx Trace Viewer", 113 | transactionHash: "Tx Hash", 114 | inputTransactionHash: "Input transaction hash", 115 | btnAnalyze: "Analyze", 116 | options: "options", 117 | inputAddressMap: "Input address alias", 118 | inputFunctionMap: "Input function alias", 119 | example: "A example", 120 | AddressMap: "Address alias", 121 | FunctionMap: "Function alias", 122 | CallTraces: "Traces", 123 | prompt: ["input tx hash", "retry input tx hash and "], 124 | analyzing: "analyzing...", 125 | parsingFailed: ["An error has occurred", "Failed"] 126 | }, 127 | abi: { 128 | title: "ABI Caller", 129 | btnAddContract: "Add Contract", 130 | btnShare: "Share", 131 | sharePrompt: "Share to friends, will auto load contract", 132 | btnABI: "Show ABI", 133 | ABIPrompt: "Click for show ABI, copy ABI", 134 | btnEtherscan: "Go etherscan", 135 | EtherscanPrompt: "Go etherscan for more details ", 136 | btnEdit: "edit", 137 | editPrompt: "Modify contract name, network , address, ABI", 138 | btnDelect: "Delete", 139 | delectPrompt: "Delete this contract", 140 | contractName: "Name", 141 | blockchainAddress: "Chain", 142 | contractAddress: "contract", 143 | callFunctions: "Function:", 144 | inputValue: "msg.value", 145 | pleaseChoose: "Choose", 146 | clearOutput: "Clean Output", 147 | run: "Run", 148 | transactionDetails: "Tx Details", 149 | returnContent: "Return:", 150 | contract: "Contract", 151 | commonABIs: "Commonly ABI", 152 | blockchainNetwork: "Chain", 153 | selectNetwork: "choose network", 154 | chooseCommonABI: "From Commonly ABI", 155 | uploadABIFile: "Upload ABI File", 156 | etherscanGet: "From Etherscan", 157 | lookOverABI: "Show ABI", 158 | jsonABI: "JSON ABI", 159 | readableABI: "Humanable ABI", 160 | inputPrompt: "Please input", 161 | quit: "Exit", 162 | validateName: "Contract name", 163 | sameName: "Contract name existed", 164 | validateAddress: "Please check contract address", 165 | checkAbi: "Input ABI", 166 | checkNetwork: "Choose network", 167 | autoAddError: 'Load contract error', 168 | promptSharingError: "Share Failed, please retry later", 169 | copyShareSuccess: "Copy share link success", 170 | examineAddressAndNetwork: "Please input contract address and network", 171 | getABIeroor: "Fail to get ABI ", 172 | useCurrentNetwork: "Network by wallet", 173 | checkAbiError: "ABI Error", 174 | notSelectedContractPrompt: "none contract selected", 175 | contractNotRecorded: "No source on Etherscan", 176 | deniedAccess: "User denied account access", 177 | notInstalledMetaMaskPrompt: "Need install MetaMask", 178 | abiError: "ABI Invalid", 179 | switchNetworkPrompt: "Network are mismatch, switch network ...", 180 | currentNetworkError: "Network error", 181 | connectionRequestError: "Network error, please retry connect and reload", 182 | btnReturn:"Return", 183 | btnDevelop:"Expand Panel", 184 | btnFold:"Collapse Panel", 185 | riskWarning:"The current contract is not open source verified, please confirm the risk!!!", 186 | }, 187 | address: { 188 | address: "wallet address", 189 | btnConvert: "Lookup", 190 | btnInquire: "Lookup", 191 | inputENS: "ens domain", 192 | errorAddressPrompt: "invalid wallet address, please retype", 193 | errorENSPrompt: "No corresponding results were found." 194 | }, 195 | generateWallet: { 196 | tips: ["Tips: only run in your browser, totally", "Open Source", ". No one can get your mnemonic or private key, feel free to use."], 197 | randomBatch: "By Random", 198 | customize: "By Pri-key or Mnemonic", 199 | mnemonicLength: "How many mnemonic words", 200 | quantity: "Address numbers", 201 | btnGenerateImmediately: "Create", 202 | regenerate: "Re-create", 203 | exportexcel: "Download", 204 | walletsNumber: "Address numbers", 205 | subtitle: "Create Wallet by Private key or mnemonic", 206 | createNow: "Create", 207 | enterPrompt: "Private key or mnemonic", 208 | address: "Address", 209 | privateKey: "Pri-key", 210 | mnemonic: 'Mnemonic', 211 | nullErrorPrompt: "Invalid input", 212 | IllegalErrorPrompt: "Invalid address numbers", 213 | beyondErrorPrompt: "Address number too big, must be smaller than 100", 214 | inputErrorPrompt: "Create failed", 215 | popoverBtnClick: "Click", 216 | options:["One Mnemonic","Many Mnemonic","User Input"], 217 | advancedOptions:{ 218 | title:"Advanced", 219 | tips:["Refer:","BIP44"], 220 | options:["Purpose","Coin","Account","External / Internal","Index","Path"] 221 | }, 222 | messages:['Max is 100','Please wait...','Advanced is disable, where create by private key'], 223 | subtitleMnemonicCreate:"Create wallet by mnemonic", 224 | publicKey:"Public key", 225 | }, 226 | querySelector: { 227 | title: "Selector Querier", 228 | inputFunctionName: 'Get selector by function signature', 229 | inputFunctionNamePrompt: "enter the function signature", 230 | inquire: "query", 231 | inputByteFunctionSelector: "Get function signature by selector", 232 | functionInputError: "Input error", 233 | noRecord: "no record", 234 | pointOutQuerying:"loading" 235 | }, 236 | topicID: { 237 | title: "TopicID Querier", 238 | EventSignature: 'Get topicId by event signature', 239 | inputEventSignature: "Input Event Signature", 240 | TopicID: "Get event signature by topicId", 241 | InputTopicID: "Input topicId", 242 | signatureInputError: "Such as: event Transfer(address indexed from, address indexed to, uint256 amount)", 243 | topicIDInputError: "no record" 244 | }, 245 | hashTool: { 246 | title: "Hash Tools", 247 | btnConfirm: "Confirm", 248 | coding: "Encoding", 249 | decoding: "Decoding", 250 | errorHexadecimal: "Invalid hex data", 251 | decodingError: "Decoding Error", 252 | noInput: "No input data" 253 | }, 254 | calldata: { 255 | decoding: "Decoding", 256 | coding: "Encoding", 257 | inputFunction: "input function", 258 | inputFunctionPrompt: "function signaturs", 259 | parameter: "Params", 260 | inputParameterPrompt: "A param per line, Array like this:[0x2222,0x4444]", 261 | inputError: "Input Error", 262 | inputCalldata: "Calldata:", 263 | selectFunction: "Function", 264 | autoChoose: "Auto", 265 | manualInput: "Manual", 266 | decodingResult: "Result", 267 | parameter: "Param", 268 | parameterType: "Type", 269 | value: "Value", 270 | queryFailed: "An error has occurred", 271 | }, 272 | faucet: { 273 | prompt: ["Request testnet coins and tokens for test you smart contract.", "ChainTool Faucets collet commonly used faucet websites for developers to enjoy.", "If you have a faucet website that we don't list, feel free to submit ", "PR", " or ", "ISSUE", ", Your support is our motivation."], 274 | currency: "Currency", 275 | url: "Website", 276 | remark: "Comment", 277 | operate: "Operate", 278 | receive: "Go", 279 | copyUrl: "Copy", 280 | copyURLSuccessfully: "URL Copied", 281 | }, 282 | notfind: { 283 | title: "No Page Found", 284 | return: "Go back" 285 | }, 286 | faucetData: { 287 | ethereum: "Ethereum", 288 | testnet: " Testnet", 289 | remarkGoerli: ["requires a minimum mainnet balance of 0.001 ETH", "by pow", "Twitter Auth, faucet ETH, wETH, DAI, NFTs", "10 for those who have deployed contracts before 202211"], 290 | remarkSepolia: ["1 Sepolia ETH per day", "by pow", "10 for those who have deployed contracts before 202211"], 291 | remarkMumbai: ["0.5 Mumbai MATIC per day"], 292 | remarkHarmony: ["Shard 0、Shard 1、Shard 2、Shard 3"], 293 | remarkCelo: ["need github auth"], 294 | remarkOptimismSepolia: ["Dripping 0.5 opETH per da, requires a minimum 0.001 ETH on mainnet wallet", "Dripping 0.01 opETH per day"], 295 | remarkArbitrumSepolia: ["Dripping 0.5 opETH per day, requires a minimum 0.001 ETH on mainnet wallet", "Dripping 0.01 opETH per day"] 296 | }, 297 | connectWallet: { 298 | walleAccessDenied: "MetaMask refused", 299 | notInstalledMetaMask: "Please install MetaMask." 300 | } 301 | } --------------------------------------------------------------------------------