diff --git a/.github/workflows/mainnet-deploy.yaml b/.github/workflows/mainnet-deploy.yaml index 95271eee..221ab70a 100644 --- a/.github/workflows/mainnet-deploy.yaml +++ b/.github/workflows/mainnet-deploy.yaml @@ -12,13 +12,14 @@ jobs: name: Ping deploy runs-on: mainnet steps: - - name: print - run: echo ${GITHUB_REF#refs/heads/} + - name: Environment + run: export NODE_OPTIONS="--max_old_space_size=4096" + - name: Git Checkout Latest uses: actions/checkout@v3 - name: Install - run: yarn install + run: yarn install --ignore-engines - name: Build run: yarn run vue-cli-service build diff --git a/.gitignore b/.gitignore index 26b88946..4f605ab5 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ yarn-error.log* .yarn/ .yarnrc.yml package-lock.json +yarn.lock +pkg/ diff --git a/README.md b/README.md index 6e65f4ed..c5c07a29 100644 --- a/README.md +++ b/README.md @@ -15,22 +15,24 @@ -Ping Explorer is a light explorer for Cosmos-based Blockchains. https://ping.pub . +`Ping Dashboard` is a light explorer for Cosmos-based Blockchains. https://ping.pub . ## What is the difference between Ping explorer and other explorers? -Ping Explorer is designed to explore blockchain data as real as possible, therefore there is no cache, no pre-processing. Ping Explorer does not cache/save blockchain data on its server. Ping Explorer only fetch data from Cosmos full node via LCD/RPC endpoints. We call it "Light Explorer". +`Ping Dashboard` is designed to explore blockchain data as real as possible, therefore there is no cache, no pre-processing. `Ping Dashboard` only fetch data from Cosmos full node via LCD/RPC endpoints. We call it "Light Explorer". ## Do you want to list your blockchain on ping.pub? -Pull your request [here](./src/chains), We will add your chains as soon as possible. It is **FREE** (You must have 10+ independent validators on your chain). +Submit your pull request [here](./src/chains), We will add your chains as soon as possible. It is **FREE** (You must have 10+ independent validators on your chain). + +We remain neutral to all chains, and we do not comment on their market prospects, technical risks, or investment risks. The only condition we list on ping.pub is if there are ten validators, and we cannot determine if these validators are controlled by the same entity. ## Why Ping explorer use official/trusted third party public LCD/rpc server? -We have two considerations: +There are two main reasons: - - Trust, In decentralize system, everything controlled by one single team/organization could be risks. So we decided to co-build with the community. - - Limited Resources: ` Ping Dashboard ` will list hundreds cosmos-based blockchains in the future, it's impossible for our team to run validators or fullnodes for all of those chains. + - Trust, in a decentralized system, anything controlled by one entity cannot be trusted. So we decided to build with the community. + - Limited resources: `Ping Dashboard` will list hundreds of cosmos-based blockchains in the future, and it is impossible for our team to run validators or full nodes for all of them. ## Donation diff --git a/public/logos/c4e.png b/public/logos/c4e.png new file mode 100644 index 00000000..b0e03c20 Binary files /dev/null and b/public/logos/c4e.png differ diff --git a/public/logos/cronos.png b/public/logos/cronos.png new file mode 100644 index 00000000..68f2db74 Binary files /dev/null and b/public/logos/cronos.png differ diff --git a/public/logos/game_of_chain.jpeg b/public/logos/game_of_chain.jpeg new file mode 100644 index 00000000..054353ad Binary files /dev/null and b/public/logos/game_of_chain.jpeg differ diff --git a/public/logos/mars.jpg b/public/logos/mars.jpg new file mode 100644 index 00000000..e5c26c50 Binary files /dev/null and b/public/logos/mars.jpg differ diff --git a/public/logos/mars.png b/public/logos/mars.png new file mode 100644 index 00000000..73de99a1 Binary files /dev/null and b/public/logos/mars.png differ diff --git a/public/logos/planq.png b/public/logos/planq.png new file mode 100644 index 00000000..8e254394 Binary files /dev/null and b/public/logos/planq.png differ diff --git a/public/logos/quasar.png b/public/logos/quasar.png new file mode 100644 index 00000000..7885e123 Binary files /dev/null and b/public/logos/quasar.png differ diff --git a/src/@core/layouts/components/AppBreadcrumb.vue b/src/@core/layouts/components/AppBreadcrumb.vue index 929fd432..7f602bf4 100644 --- a/src/@core/layouts/components/AppBreadcrumb.vue +++ b/src/@core/layouts/components/AppBreadcrumb.vue @@ -31,7 +31,7 @@ {{ chainname }} diff --git a/src/@core/layouts/modules.js b/src/@core/layouts/modules.js index 4d525a10..633fd96b 100644 --- a/src/@core/layouts/modules.js +++ b/src/@core/layouts/modules.js @@ -1,53 +1,53 @@ export default () => ([ { scope: 'normal', - title: 'dashboard', + title: 'dashboard.dashboard', route: 'dashboard', }, { scope: 'normal', - title: 'blocks', + title: 'dashboard.blocks', route: 'blocks', }, { scope: 'normal', - title: 'staking', + title: 'dashboard.staking', route: 'staking', }, { scope: 'normal', - title: 'governance', + title: 'dashboard.governance', route: 'governance', exclude: 'emoney', }, { scope: 'normal', - title: 'uptime', + title: 'dashboard.uptime', route: 'uptime', }, { scope: 'normal', - title: 'parameters', + title: 'dashboard.parameters', route: 'parameters', }, { scope: 'normal', - title: 'statesync', + title: 'dashboard.statesync', route: 'statesync', }, { scope: 'normal', - title: 'consensus', + title: 'dashboard.consensus', route: 'consensus', }, { scope: 'cos-mos', - title: 'gravity', + title: 'dashboard.gravity', route: 'gravity', }, { scope: 'osmosis', - title: 'trade', + title: 'dashboard.trade', route: 'osmosis-trade', }, ]) diff --git a/src/@core/scss/base/bootstrap-extended/_progress.scss b/src/@core/scss/base/bootstrap-extended/_progress.scss index 3c2956d7..3abd8c31 100644 --- a/src/@core/scss/base/bootstrap-extended/_progress.scss +++ b/src/@core/scss/base/bootstrap-extended/_progress.scss @@ -22,3 +22,28 @@ .progress { border-radius: 3px; } + + +.scale { + width: 100%; + height: 3em; + position: relative; + /* margin: 30px; // */ +} +.box { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + padding-top: 0.5em; + /* opacity: 0.7; /**/ + background: transparent; +} +.overlay { + z-index: 9; + width: 2px; + border-right-color: green; + border-right-width: 2px; + border-right-style: dotted; +} diff --git a/src/chains/mainnet/agoric.json b/src/chains/mainnet/agoric.json index db42af2c..a831e63c 100644 --- a/src/chains/mainnet/agoric.json +++ b/src/chains/mainnet/agoric.json @@ -1,7 +1,6 @@ { "chain_name": "agoric", "api": [ - "https://api.agoric.sgtstake.com", "https://agoric-api.polkachu.com", "https://api-agoric.nodes.guru", "https://agoric.stakesystems.io", diff --git a/src/chains/mainnet/beezee.json b/src/chains/mainnet/beezee.json index 7703c10b..37027bb0 100644 --- a/src/chains/mainnet/beezee.json +++ b/src/chains/mainnet/beezee.json @@ -4,7 +4,7 @@ "api": ["https://rest.getbze.com"], "rpc": ["https://rpc-1.getbze.com:443","https://rpc-2.getbze.com:443"], "snapshot_provider": ["a9fac0534bd6853f5810fdc692564967bd01b1fe@rpc-1.getbze.com:26656"], - "sdk_version": "0.44.3", + "sdk_version": "0.45.9", "coin_type": "370", "min_tx_fee": "8000", "addr_prefix": "bze", diff --git a/src/chains/mainnet/bitcanna.json b/src/chains/mainnet/bitcanna.json index bbb75ce0..941fddb2 100644 --- a/src/chains/mainnet/bitcanna.json +++ b/src/chains/mainnet/bitcanna.json @@ -6,7 +6,7 @@ "snapshot_provider": "29edc55748bc341224f711a05cb0a9f6d73b4da3@bitcanna.rpc.ping.pub:26656", "sdk_version": "0.45.10", "coin_type": "118", - "min_tx_fee": "8000", + "min_tx_fee": "420", "assets": [{ "base": "ubcna", "symbol": "BCNA", diff --git a/src/chains/mainnet/chain4energy.json b/src/chains/mainnet/chain4energy.json new file mode 100644 index 00000000..2b5e72e9 --- /dev/null +++ b/src/chains/mainnet/chain4energy.json @@ -0,0 +1,16 @@ +{ + "chain_name": "chain4energy", + "api": ["https://lcd.c4e.io"], + "rpc": ["https://rpc.c4e.io:443", "https://rpc.c4e.io:443"], + "sdk_version": "0.45.5", + "coin_type": "4444", + "min_tx_fee": "3000", + "addr_prefix": "c4e", + "logo": "/logos/c4e.png", + "assets": [{ + "base": "uc4e", + "symbol": "C4E", + "exponent": "6", + "logo": "/logos/c4e.png" + }] +} diff --git a/src/chains/mainnet/cronos.json b/src/chains/mainnet/cronos.json new file mode 100644 index 00000000..7c74868e --- /dev/null +++ b/src/chains/mainnet/cronos.json @@ -0,0 +1,17 @@ + +{ + "chain_name": "cronos", + "api": ["https://rest.cronos.org"], + "rpc": ["https://rpc.cronos.org:443"], + "snapshot_provider": "", + "sdk_version": "0.45.11", + "coin_type": "60", + "min_tx_fee": "5000000000000000", + "addr_prefix": "crc", + "logo": "/logos/cronos.png", + "assets": [{ + "base": "basecro", + "symbol": "CRO", + "exponent": "18" + }] +} diff --git a/src/chains/mainnet/injective.json b/src/chains/mainnet/injective.json index a5a66cb0..f5350b49 100644 --- a/src/chains/mainnet/injective.json +++ b/src/chains/mainnet/injective.json @@ -1,7 +1,7 @@ { "chain_name": "injective", - "api": "https://lcd.injective.network", - "rpc": ["https://injective-rpc.api.chainlayer.network:443", "https://injective-rpc.api.chainlayer.network:443"], + "api": ["https://lcd.injective.network", "https://injective-api.polkachu.com"], + "rpc": ["https://tm.injective.network", "https://injective-rpc.polkachu.com"], "snapshot_provider": "", "sdk_version": "v0.45.5", "coin_type": "60", @@ -9,6 +9,12 @@ "addr_prefix": "inj", "excludes": "", "logo": "/logos/injective.jpg", + "keplr_features": ["ibc-transfer", "ibc-go", "eth-address-gen", "eth-key-sign"], + "keplr_price_step": { + "low": 100000000000, + "average": 200000000000, + "high": 30000000000000 + }, "assets": [{ "base": "inj", "symbol": "INJ", diff --git a/src/chains/mainnet/jackal.json b/src/chains/mainnet/jackal.json index f1b7fbcc..aede3ec9 100644 --- a/src/chains/mainnet/jackal.json +++ b/src/chains/mainnet/jackal.json @@ -1,18 +1,28 @@ { "chain_name": "jackal", - "coingecko": "", - "api": ["https://api.jackalprotocol.com", "https://jackal-api.polkachu.com","https://api.jackal.nodestake.top"], - "rpc": ["https://rpc.jackalprotocol.com", "https://jackal-rpc.polkachu.com","https://rpc.jackal.nodestake.top"], + "coingecko": "jackal-protocol", + "api": [ + "https://api.jackalprotocol.com", + "https://jackal-api.polkachu.com", + "https://api.jackal.nodestake.top" + ], + "rpc": [ + "https://rpc.jackalprotocol.com", + "https://jackal-rpc.polkachu.com", + "https://rpc.jackal.nodestake.top" + ], "snapshot_provider": "", "coin_type": "118", - "sdk_version": "0.45.9", + "sdk_version": "0.45.11", "addr_prefix": "jkl", "logo": "/logos/jackal.png", - "assets": [{ - "base": "ujkl", - "symbol": "JKL", - "exponent": "6", - "coingecko_id": "jackal", - "logo": "/logos/jackal.png" - }] + "assets": [ + { + "base": "ujkl", + "symbol": "JKL", + "exponent": "6", + "coingecko_id": "jackal", + "logo": "/logos/jackal.png" + } + ] } diff --git a/src/chains/mainnet/lumenx.json b/src/chains/mainnet/lumenx.json index 4789d238..137a7e43 100644 --- a/src/chains/mainnet/lumenx.json +++ b/src/chains/mainnet/lumenx.json @@ -1,8 +1,8 @@ { "chain_name": "lumenx", "coingecko": "", - "api": "https://api.helios-1.lumenex.io", - "rpc": ["https://rpc.helios-1.lumenex.io:443","http://node4.lumenex.io:26657"], + "api": ["https://api.lumenx.chaintools.tech:443","https://api-lumenx.cryptonet.pl:443"], + "rpc": ["https://rpc.lumenx.chaintools.tech:443","https://rpc-lumenx.cryptonet.pl:443"], "snapshot_provider": "", "sdk_version": "0.45.5", "coin_type": "118", diff --git a/src/chains/mainnet/mars.json b/src/chains/mainnet/mars.json new file mode 100644 index 00000000..4d96eb42 --- /dev/null +++ b/src/chains/mainnet/mars.json @@ -0,0 +1,29 @@ +{ + "chain_name": "mars", + "coingecko": "", + "api": [ + "https://rest.marsprotocol.io", + "https://mars-api.polkachu.com", + "https://rest.cosmos.directory/mars" + ], + "rpc": [ + "https://rpc.marsprotocol.io", + "https://mars-rpc.polkachu.com", + "https://rpc.marsprotocol.io", + "https://rpc.cosmos.directory/mars" + ], + "snapshot_provider": "", + "coin_type": "118", + "sdk_version": "0.46.8", + "addr_prefix": "mars", + "logo": "/logos/mars.png", + "assets": [ + { + "base": "umars", + "symbol": "MARS", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/mars.png" + } + ] +} diff --git a/src/chains/mainnet/planq.json b/src/chains/mainnet/planq.json new file mode 100644 index 00000000..fc307b8c --- /dev/null +++ b/src/chains/mainnet/planq.json @@ -0,0 +1,19 @@ +{ + "chain_name": "planq", + "api": ["https://rest.planq.network"], + "rpc": ["https://rpc.planq.network"], + "snapshot_provider": "", + "sdk_version": "0.46.3", + "coin_type": "60", + "min_tx_fee": "5000000000000000", + "addr_prefix": "plq", + "logo": "/logos/planq.png", + "keplr_features": ["ibc-transfer", "ibc-go", "eth-address-gen", "eth-key-sign"], + "assets": [{ + "base": "aplanq", + "symbol": "planq", + "exponent": "18", + "coingecko_id": "", + "logo": "/logos/planq.png" + }] +} diff --git a/src/chains/mainnet/quicksilver.json b/src/chains/mainnet/quicksilver.json new file mode 100644 index 00000000..59572b06 --- /dev/null +++ b/src/chains/mainnet/quicksilver.json @@ -0,0 +1,20 @@ +{ + "chain_name": "quicksilver", + "coingecko": "", + "api": ["https://quicksilver-api.polkachu.com", "https://api-quicksilver.nodeist.net"], + "rpc": ["https://quicksilver-rpc.polkachu.com", "https://rpc-quicksilver.nodeist.net"], + "sdk_version": "0.46.7", + "coin_type": "118", + "min_tx_fee": "8000", + "addr_prefix": "quick", + "logo": "/logos/quicksilver.png", + "assets": [ + { + "base": "uqck", + "symbol": "QCK", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/quicksilver.png" + } + ] +} diff --git a/src/chains/mainnet/rebus.json b/src/chains/mainnet/rebus.json index c3a768e7..7f55e439 100644 --- a/src/chains/mainnet/rebus.json +++ b/src/chains/mainnet/rebus.json @@ -1,7 +1,7 @@ { "chain_name": "rebus", - "api": ["https://api.mainnet.rebus.money:1317", "https://rebus.api.kjnodes.com"], - "rpc": ["https://api.mainnet.rebus.money:26657", "https://rebus.rpc.kjnodes.com:443"], + "api": ["https://api.mainnet.rebus.money:1317","https://api.rebus.nodestake.top"], + "rpc": ["https://api.mainnet.rebus.money:26657","https://rpc.rebus.nodestake.top"], "snapshot_provider": "", "sdk_version": "0.45.6", "coin_type": "118", diff --git a/src/chains/mainnet/secret.json b/src/chains/mainnet/secret.json index b4147458..fce16d84 100644 --- a/src/chains/mainnet/secret.json +++ b/src/chains/mainnet/secret.json @@ -1,8 +1,8 @@ { "chain_name": "secret", "coingecko": "secret", - "api": ["https://api.roninventures.io","https://api.scrt.network"], - "rpc": ["http://beta-api.scrt.network:26657", "https://api.scrt.network:443"], + "api": ["https://lcd.spartanapi.dev", "https://secretnetwork-lcd.stakely.io"], + "rpc": ["https://rpc.spartanapi.dev", "https://secretnetwork-rpc.stakely.io"], "snapshot_provider": "", "sdk_version": "0.45.4", "coin_type": "529", diff --git a/src/chains/mainnet/shentu.json b/src/chains/mainnet/shentu.json index ff3a30e7..f12c35a2 100644 --- a/src/chains/mainnet/shentu.json +++ b/src/chains/mainnet/shentu.json @@ -2,10 +2,10 @@ { "chain_name": "shentu", "coingecko": "certik", - "api": ["https://certik-api.polkachu.com/", "https://shentu-api.panthea.eu", "https://chainfull.noopsbycertik.com"], - "rpc": ["https://certik-rpc.polkachu.com:443", "https://shentu-rpc.panthea.eu:443"], + "api": ["https://certik-api.polkachu.com", "https://chainfull.noopsbycertik.com"], + "rpc": ["https://certik-rpc.polkachu.com:443"], "snapshot_provider": "", - "sdk_version": "0.45.4", + "sdk_version": "0.45.9", "coin_type": "118", "min_tx_fee": "8000", "addr_prefix": "certik", diff --git a/src/chains/mainnet/teritori.json b/src/chains/mainnet/teritori.json index 6f5a286e..ebb12292 100644 --- a/src/chains/mainnet/teritori.json +++ b/src/chains/mainnet/teritori.json @@ -1,7 +1,7 @@ { "chain_name": "teritori", - "api": ["https://rest.mainnet.teritori.com", "https://teritori.api.kjnodes.com"], - "rpc": ["https://rpc.mainnet.teritori.com", "https://teritori.rpc.kjnodes.com:443"], + "api": ["https://rest.mainnet.teritori.com","https://api.teritori.nodestake.top"], + "rpc": ["https://rpc.mainnet.teritori.com","https://rpc.teritori.nodestake.top"], "snapshot_provider": "", "sdk_version": "0.45.4", "coin_type": "118", diff --git a/src/chains/mainnet/vidulum.json b/src/chains/mainnet/vidulum.json index a5bd690e..ddd2fd76 100644 --- a/src/chains/mainnet/vidulum.json +++ b/src/chains/mainnet/vidulum.json @@ -1,9 +1,9 @@ { "chain_name": "vidulum", "coingecko": "vidulum", - "api": ["https://mainnet-lcd.vidulum.app", "https://api-vidulum-ia.cosmosia.notional.ventures", "https://rest.rpc.erialos.me"], - "rpc": ["https://trpc.rpc.erialos.me:443","https://rpc-vidulum-ia.cosmosia.notional.ventures:443", "https://mainnet-rpc.vidulum.app:443"], - "snapshot_provider": "c32903505e9ab811ac46306d2913c98ccf4883ce@rpc.erialos.me:26656", + "api": ["https://mainnet-lcd.vidulum.app", "https://api-vidulum-ia.cosmosia.notional.ventures"], + "rpc": ["https://mainnet-rpc.vidulum.app:443", "https://rpc-vidulum-ia.cosmosia.notional.ventures:443"], + "snapshot_provider": "", "sdk_version": "0.45.9", "coin_type": "370", "min_tx_fee": "8000", diff --git a/src/chains/testnet/apollo.json b/src/chains/testnet/apollo.json new file mode 100644 index 00000000..b8bc3299 --- /dev/null +++ b/src/chains/testnet/apollo.json @@ -0,0 +1,20 @@ +{ + "chain_name": "apollo", + "provider_chain": { + "api": "https://rest.provider-sentry-01.goc.earthball.xyz" + }, + "api": ["https://apollo.api.ping.pub"], + "rpc": [], + "sdk_version": "0.45.7", + "coin_type": 118, + "min_tx_fee": "0", + "addr_prefix": "cosmos", + "logo": "/logos/game_of_chain.jpeg", + "assets": [{ + "base": "upol", + "symbol": "POL", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/game_of_chain.jpeg" + }] +} \ No newline at end of file diff --git a/src/chains/testnet/canto.json b/src/chains/testnet/canto.json new file mode 100644 index 00000000..08b18a3a --- /dev/null +++ b/src/chains/testnet/canto.json @@ -0,0 +1,19 @@ +{ + "chain_name": "canto", + "api": ["https://canto-testnet.ansybl.io/api"], + "rpc": ["https://canto-testnet.ansybl.io/rpc"], + "snapshot_provider": "", + "sdk_version": "0.45.6", + "coin_type": "60", + "min_tx_fee": "800", + "addr_prefix": "canto", + "logo": "/logos/canto.png", + "assets": [ + { + "base": "acanto", + "symbol": "CANTO", + "exponent": "18" + } + ] +} + diff --git a/src/chains/testnet/celestia.json b/src/chains/testnet/celestia.json new file mode 100644 index 00000000..85e7f47f --- /dev/null +++ b/src/chains/testnet/celestia.json @@ -0,0 +1,19 @@ +{ + "chain_name": "celestia", + "coingecko": "", + "api": ["https://celestia-testnet-api.polkachu.com"], + "rpc": ["https://celestia-testnet-rpc.polkachu.com"], + "snapshot_provider": "", + "sdk_version": "0.46.0", + "coin_type": "118", + "min_tx_fee": "800", + "addr_prefix": "celestia", + "logo": "/logos/celestia.png", + "assets": [{ + "base": "utia", + "symbol": "TIA", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/celestia.png" + }] +} diff --git a/src/chains/testnet/cosmos.json b/src/chains/testnet/cosmos.json index 98fcb4b7..c31c9748 100644 --- a/src/chains/testnet/cosmos.json +++ b/src/chains/testnet/cosmos.json @@ -1,7 +1,17 @@ { - "chain_name": "cosmos-vega", - "api":"https://vega.api.ping.pub", - "sdk_version": "0.42.9", + "chain_name": "cosmos", + "api": ["https://vega.api.ping.pub", "https://rest.seed-01.theta-testnet.polypore.xyz", "https://rest.seed-02.theta-testnet.polypore.xyz"], + "rpc": ["https://rpc.seed-01.theta-testnet.polypore.xyz", "https://rpc.seed-02.theta-testnet.polypore.xyz"], + "sdk_version": "0.45.1", + "coin_type": "118", + "min_tx_fee": "800", "addr_prefix": "cosmos", - "logo": "https://dl.airtable.com/.attachments/e54f814bba8c0f9af8a3056020210de0/2d1155fb/cosmos-hub.svg" -} + "logo": "/logos/cosmos.svg", + "assets": [{ + "base": "uatom", + "symbol": "ATOM", + "exponent": "6", + "coingecko_id": "cosmos", + "logo": "/logos/cosmos.svg" + }] +} \ No newline at end of file diff --git a/src/chains/testnet/evmos.json b/src/chains/testnet/evmos.json index b3c5ba5f..ce5209d0 100644 --- a/src/chains/testnet/evmos.json +++ b/src/chains/testnet/evmos.json @@ -9,6 +9,7 @@ "min_tx_fee": "3000000000000000", "addr_prefix": "evmos", "logo": "/logos/evmos.jpeg", + "keplr_features": ["ibc-transfer", "ibc-go", "eth-address-gen", "eth-key-sign"], "assets": [{ "base": "atevmos", "symbol": "TEVMOS", diff --git a/src/chains/testnet/hero.json b/src/chains/testnet/hero.json new file mode 100644 index 00000000..3bae8a86 --- /dev/null +++ b/src/chains/testnet/hero.json @@ -0,0 +1,20 @@ +{ + "chain_name": "hero", + "provider_chain": { + "api": "https://rest.provider-sentry-01.goc.earthball.xyz" + }, + "api": ["https://api-c.hero.nodestake.top"], + "rpc": ["https://rpc-c.hero.nodestake.top"], + "sdk_version": "0.45.7", + "coin_type": 118, + "min_tx_fee": "0", + "addr_prefix": "cosmos", + "logo": "/logos/game_of_chain.jpeg", + "assets": [{ + "base": "uhero", + "symbol": "HERO", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/game_of_chain.jpeg" + }] +} \ No newline at end of file diff --git a/src/chains/testnet/jackal.json b/src/chains/testnet/jackal.json index 30850421..cfd886bf 100644 --- a/src/chains/testnet/jackal.json +++ b/src/chains/testnet/jackal.json @@ -1,17 +1,23 @@ { "chain_name": "jackal", - "coingecko": "jackal", - "api": "https://testnet-api.jackalprotocol.com", - "rpc": "https://testnet-rpc.jackalprotocol.com", + "coingecko": "jackal_protocol", + "api": [ + "https://testnet-api.jackalprotocol.com" + ], + "rpc": [ + "https://testnet-rpc.jackalprotocol.com" + ], "coin_type": "118", - "sdk_version": "0.45.9", - "addr_prefix": "jkl", + "sdk_version": "0.45.11", + "addr_prefix": "jkl", "logo": "/logos/jackal.png", - "assets": [{ - "base": "ujkl", - "symbol": "JKL", - "exponent": "6", - "coingecko_id": "jackal", - "logo": "/logos/jackal.png" - }] -} + "assets": [ + { + "base": "ujkl", + "symbol": "JKL", + "exponent": "6", + "coingecko_id": "jackal-protocol", + "logo": "/logos/jackal.png" + } + ] +} \ No newline at end of file diff --git a/src/chains/testnet/osmosis.json b/src/chains/testnet/osmosis.json index eab64779..e0a2d5cf 100644 --- a/src/chains/testnet/osmosis.json +++ b/src/chains/testnet/osmosis.json @@ -1,8 +1,8 @@ { "chain_name": "osmosis", "coingecko": "osmosis", - "api": ["https://testnet-rest.osmosis.zone", "https://lcd.osmo-test.ccvalidators.com", "https://osmosistest-lcd.quickapi.com"], - "rpc": ["https://testnet-rpc.osmosis.zone:443", "https://rpc.osmo-test.ccvalidators.com:443"," https://osmosistest-rpc.quickapi.com:443"], + "api": ["https://lcd-test.osmosis.zone", "https://lcd.osmo-test.ccvalidators.com", "https://osmosistest-lcd.quickapi.com"], + "rpc": ["https://rpc-test.osmosis.zone", "https://testnet-rpc.osmosis.zone:443", "https://rpc.osmo-test.ccvalidators.com:443"," https://osmosistest-rpc.quickapi.com:443"], "snapshot_provider": "", "sdk_version": "0.44.5", "coin_type": "118", diff --git a/src/chains/testnet/provider.json b/src/chains/testnet/provider.json new file mode 100644 index 00000000..a567ebad --- /dev/null +++ b/src/chains/testnet/provider.json @@ -0,0 +1,17 @@ +{ + "chain_name": "provider", + "api": ["https://rest.provider-sentry-01.goc.earthball.xyz","https://rest.provider-sentry-02.goc.earthball.xyz"], + "rpc": ["https://rpc.provider-sentry-01.goc.earthball.xyz"], + "sdk_version": "0.45.7", + "coin_type": 118, + "min_tx_fee": "0", + "addr_prefix": "cosmos", + "logo": "/logos/game_of_chain.jpeg", + "assets": [{ + "base": "uprov", + "symbol": "PROV", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/game_of_chain.jpeg" + }] +} \ No newline at end of file diff --git a/src/chains/testnet/quasar.json b/src/chains/testnet/quasar.json new file mode 100644 index 00000000..10ba9554 --- /dev/null +++ b/src/chains/testnet/quasar.json @@ -0,0 +1,20 @@ +{ + "chain_name": "quasar", + "coingecko": "", + "api": ["https://quasar-testnet-api.polkachu.com", "https://lcd-office.cosmostation.io/quasar-testnet"], + "rpc": ["https://quasar-testnet-rpc.polkachu.com", "https://rpc-office.cosmostation.io/quasar-testnet", "https://questnet.quasar-finance.rhinostake.com"], + "sdk_version": "0.45.6", + "coin_type": 118, + "min_tx_fee": "8000", + "addr_prefix": "quasar", + "logo": "/logos/quasar.png", + "assets": [ + { + "base": "uqsr", + "symbol": "QSR", + "exponent": 6, + "coingecko_id": "", + "logo": "/logos/quasar.png" + } + ] +} diff --git a/src/chains/testnet/secret.json b/src/chains/testnet/secret.json index b0bafa70..49feb845 100644 --- a/src/chains/testnet/secret.json +++ b/src/chains/testnet/secret.json @@ -1,8 +1,8 @@ { "chain_name": "secret", "coingecko": "secret", - "api": ["https://api.pulsar.scrttestnet.com","https://lcd.testnet.secretsaturn.net", "https://testnet-api.roninventures.io", "https://pulsar-2.api.trivium.network:1317"], - "rpc": ["https://rpc.pulsar.scrttestnet.com", "https://rpc.testnet.secretsaturn.net", "https://testnet-rpc.roninventures.io", "https://pulsar-2.api.trivium.network:26657"], + "api": ["https://api.pulsar.scrttestnet.com","https://lcd.testnet.secretsaturn.net", "https://pulsar-2.api.trivium.network:1317"], + "rpc": ["https://rpc.pulsar.scrttestnet.com", "https://rpc.testnet.secretsaturn.net", "https://pulsar-2.api.trivium.network:26657"], "snapshot_provider": "", "sdk_version": "0.45.4", "coin_type": "529", diff --git a/src/chains/testnet/sputnik.json b/src/chains/testnet/sputnik.json new file mode 100644 index 00000000..45438683 --- /dev/null +++ b/src/chains/testnet/sputnik.json @@ -0,0 +1,20 @@ +{ + "chain_name": "sputnik", + "provider_chain": { + "api": "https://rest.provider-sentry-01.goc.earthball.xyz" + }, + "api": ["https://sputnik.api.ping.pub"], + "rpc": [], + "sdk_version": "0.45.7", + "coin_type": 118, + "min_tx_fee": "0", + "addr_prefix": "cosmos", + "logo": "/logos/game_of_chain.jpeg", + "assets": [{ + "base": "unik", + "symbol": "NIK", + "exponent": "6", + "coingecko_id": "", + "logo": "/logos/game_of_chain.jpeg" + }] +} \ No newline at end of file diff --git a/src/lang/locales/en.json b/src/lang/locales/en.json index b3e12e36..17fcc5d2 100644 --- a/src/lang/locales/en.json +++ b/src/lang/locales/en.json @@ -2,64 +2,150 @@ "message": { }, - "cosmos": "Cosmos Hub", - "kava": "Kava", - "akash-network": "Akash Decloud", - "iris-network": "IRIS Hub", - "crypto-com-chain": "Crypto.org", - "osmosis": "Osmosis", - "okexchain": "OKEX Chain", - "band-protocol": "Band Protocol", - "terra-luna": "Terra", - "persistence": "Persistence", - "regen": "Regen Network", - "secret": "Secret Network", - "desmos": "Desmos", - "juno": "Juno", - "certik": "Certik", - "sentinel": "Sentinel", - "sifchain": "Sifchain", - "starname": "Starname", - "bitsong": "BitSong", - "e-money": "E-Money", - "omniflix": "OmniFlix", - "likecoin": "LikeCoin", - "stargaze": "Stargaze", - "injective": "Injective Protocal", - "vidulum": "Vidulum", - "kichain": "KI Chain", - "genesisL1": "Genesis L1", - "microtick": "Microtick", - "odin": "ODIN", - "chihuahua": "CHIHUAHUA", - - "staking": "Staking", - "governance": "Governance", - "summary": "Summary", - "blocks": "Blocks / Transactions", - "blockchains": "Blockchains", - "uptime": "Uptime", - "statesync": "State Sync", - "trade": "Trade", - "gravity": "Gravity(WIP)", - "pools": "Pools(WIP)", + "chains": { + "cosmos": "Cosmos Hub", + "kava": "Kava", + "akash-network": "Akash Decloud", + "iris-network": "IRIS Hub", + "crypto-com-chain": "Crypto.org", + "osmosis": "Osmosis", + "okexchain": "OKEX Chain", + "band-protocol": "Band Protocol", + "terra-luna": "Terra", + "persistence": "Persistence", + "regen": "Regen Network", + "secret": "Secret Network", + "desmos": "Desmos", + "juno": "Juno", + "certik": "Certik", + "sentinel": "Sentinel", + "sifchain": "Sifchain", + "starname": "Starname", + "bitsong": "BitSong", + "e-money": "E-Money", + "omniflix": "OmniFlix", + "likecoin": "LikeCoin", + "stargaze": "Stargaze", + "injective": "Injective Protocal", + "vidulum": "Vidulum", + "kichain": "KI Chain", + "genesisL1": "Genesis L1", + "microtick": "Microtick", + "odin": "ODIN", + "chihuahua": "CHIHUAHUA", - "proposal_id": "Proposal ID", - "proposal_type": "Proposal Type", - "proposal_proposer": "Proposer", - "proposal_submit_time": "Submited Time", - "proposal_voting_start_time": "Voting Begin Time", - "proposal_voting_end_time": "Voting End Time", - "proposal_description": "Description", - "proposal_content": "Content", - "proposal_total_deposit": "Total Deposit", - "voting_time": "Voting Time", - "upgrade_time": "Estimated Upgrade Time:", + "gravity": "Gravity(WIP)", + "pools": "Pools(WIP)" + }, - "btn_vote": "Vote", - "btn_deposit": "Deposit", - "btn_detail": "Detail", - "btn_back_list": "Back To List" - + "dashboard": { + "dashboard": "Dashboard", + "staking": "Staking", + "governance": "Governance", + "summary": "Summary", + "blocks": "Blocks / Transactions", + "blockchains": "Blockchains", + "uptime": "Uptime", + "statesync": "State Sync", + "trade": "Trade", + "parameters": "Parameters", + "consensus": "consensus", + "no_new_blocks": "No new blocks have been produced since ", + "active_props": "Active Proposals", + "proposal_votes_yes": "voters voted Yes", + "proposal_votes_no": "voters voted No", + "proposal_votes_nwv": "voters voted No With Veto", + "proposal_votes_abstain": "voters voted Abstain", + "no_active_prop": "No active proposal!", + "browse": "Browse all", + "assets": "Assets", + "more": "More", + "not_conn": "Not Connected?", + "delegate": "Delegate", + "redelegate": "Redelegate", + "unbond": "Unbond", + "withdraw_reward": "Withdraw Rewards", + "unbonding_token": "Unbonding Tokens", + "send": "Send", + "receive": "Receive", + "connect_wal": "Connect Wallet" + }, + + "governanceProposal": { + "proposal_id": "Proposal ID", + "proposal_type": "Proposal Type", + "proposal_proposer": "Proposer", + "proposal_submit_time": "Submitted Time", + "proposal_voting_start_time": "Voting Begin Time", + "proposal_voting_end_time": "Voting End Time", + "proposal_description": "Description", + "proposal_content": "Content", + "proposal_total_deposit": "Total Deposit", + "proposal_deposits": "Deposits", + "voting_time": "Voting Time", + "upgrade_time": "Estimated Upgrade Time:", + + "btn_vote": "Vote", + "btn_deposit": "Deposit", + "btn_detail": "Detail", + "btn_back_list": "Back To List", + + "proposal_status": "Status", + "proposal_status_deposit": "Deposit", + "proposal_status_voting": "Voting", + "proposal_status_passed": "Passed", + "proposal_status_rejected": "Rejected", + "proposal_status_start_date": "Start Date", + "proposal_status_end_date": "End Date", + "proposal_votes": "Votes", + "proposal_votes_yes": "voted Yes", + "proposal_votes_no": "voted No", + "proposal_votes_nwv": "voted No With Veto", + "proposal_votes_abstain": "voted Abstain", + "proposal_votes_load": "Load More Votes" + }, + "parameters" : { + "no_blocks_produced" : "No new blocks have been produced since ", + "app_ver": "Application Version", + "node_info": "Node Information" + }, + "uptimeMyChainBlocks" : { + "height": "Height:", + "no_blocks_produced" : "No new blocks have been produced since ", + "not_active": "Your node is out of active validator set" + }, + "walletAccountDetail": { + "address": "Address:", + "assets": "Assets", + "transfer": "Transfer", + "ibc_transfer": "IBC Transfer", + "total": "Total: ", + "unbonding": "Unbonding Tokens", + "from": "From: ", + "delegation": "Delegation", + "delegate": "Delegate", + "withdraw": " Withdraw Rewards", + "acct_type": "Account Type", + "acct_num": "Account Number", + "seq": "Sequence", + "pub_key": "Public Key", + "orig_vest": "Original Vesting", + "delegated_free": "Delegated Free", + "delegated_vest": "Delegated Vesting", + "vest_time": "Vesting Time", + "vest_period": "Vesting Periods", + "length": "Length", + "amount": "Amount", + "end_time": "End Time", + "acct_not_found": "Account not found", + "opps": "Oops!", + "back_home": "Back to home" + }, + "uptimeMyValidators": { + "tips": "Tips", + "two_ways": "There are two ways to monitor your validators:", + "pin": "Pin a validator on Uptime pages.", + "link": "Specify parameters like following:" + } } diff --git a/src/layouts/components/Navbar.vue b/src/layouts/components/Navbar.vue index 492a1b86..20b2c4ee 100644 --- a/src/layouts/components/Navbar.vue +++ b/src/layouts/components/Navbar.vue @@ -84,9 +84,9 @@ - + - + = 0) { + if (this.element.messages) [this.contents] = this.element.messages + if (this.contents) this.type = this.contents['@type'] + if (this.contents['@type'] === '/cosmos.gov.v1.MsgExecLegacyContent') { + this.title = this.contents.content.title + this.description = this.contents.content.description + } if (this.element.metadata) { this.title = this.element.metadata.title || this.element.metadata this.description = this.element.metadata.description || this.element.metadata diff --git a/src/libs/data/wrapstdtx.js b/src/libs/data/wrapstdtx.js index f973a98c..97c4052b 100644 --- a/src/libs/data/wrapstdtx.js +++ b/src/libs/data/wrapstdtx.js @@ -46,6 +46,7 @@ export default class WrapStdTx { self.tx = StdTx.create(element.tx, version) self.raw_log = element.tx_response.raw_log } + self.element = element return self } } diff --git a/src/libs/fetch.js b/src/libs/fetch.js index 5a51a28b..6e14334f 100644 --- a/src/libs/fetch.js +++ b/src/libs/fetch.js @@ -128,8 +128,8 @@ export default class ChainFetch { // return ret // }) return Promise.all([ - this.get(`/cosmos/distribution/v1beta1/validators/${address}/commission`), - this.get(`/cosmos/distribution/v1beta1/validators/${address}/outstanding_rewards`), + this.get(`/cosmos/distribution/v1beta1/validators/${address}/commission`, null, true), + this.get(`/cosmos/distribution/v1beta1/validators/${address}/outstanding_rewards`, null, true), ]).then(data => { const ret = ValidatorDistribution.create({ operator_address: address, @@ -145,6 +145,9 @@ export default class ChainFetch { } async getBankTotal(denom) { + if (compareVersions(this.config.sdk_version, '0.46.2') > 0) { + return this.get(`/cosmos/bank/v1beta1/supply/by_denom?denom=${denom}`).then(data => commonProcess(data).amount) + } if (compareVersions(this.config.sdk_version, '0.40') < 0) { return this.get(`/supply/total/${denom}`).then(data => ({ amount: commonProcess(data), denom })) } @@ -159,7 +162,7 @@ export default class ChainFetch { } async getStakingPool() { - return this.get('/cosmos/staking/v1beta1/pool').then(data => new StakingPool().init(commonProcess(data.pool))) + return this.get('/cosmos/staking/v1beta1/pool', null, true).then(data => new StakingPool().init(commonProcess(data.pool))) } async getMintingInflation() { @@ -176,14 +179,14 @@ export default class ChainFetch { } async getStakingParameters() { - return this.get('/cosmos/staking/v1beta1/params').then(data => { + return this.get('/cosmos/staking/v1beta1/params', null, true).then(data => { this.getSelectedConfig() return StakingParameters.create(commonProcess(data.params), this.config.chain_name) }) } async getValidatorList(config = null) { - return this.get('/cosmos/staking/v1beta1/validators?pagination.limit=200&status=BOND_STATUS_BONDED', config).then(data => { + return this.get('/cosmos/staking/v1beta1/validators?pagination.limit=200&status=BOND_STATUS_BONDED', config, true).then(data => { const vals = commonProcess(data.validators).map(i => new Validator().init(i)) try { localStorage.setItem(`validators-${this.config.chain_name}`, JSON.stringify(vals)) @@ -203,7 +206,7 @@ export default class ChainFetch { } async getValidatorUnbondedList() { - return this.get('/cosmos/staking/v1beta1/validators?pagination.limit=100&status=BOND_STATUS_UNBONDED').then(data => { + return this.get('/cosmos/staking/v1beta1/validators?pagination.limit=100&status=BOND_STATUS_UNBONDED', null, true).then(data => { const result = commonProcess(data.validators) const vals = result.validators ? result.validators : result return vals.map(i => new Validator().init(i)) @@ -211,7 +214,7 @@ export default class ChainFetch { } async getValidatorListByStatus(status) { - return this.get(`/cosmos/staking/v1beta1/validators?status=${status}&pagination.limit=500`).then(data => { + return this.get(`/cosmos/staking/v1beta1/validators?status=${status}&pagination.limit=500`, null, true).then(data => { const result = commonProcess(data) const vals = result.validators ? result.validators : result return vals.map(i => new Validator().init(i)) @@ -223,7 +226,7 @@ export default class ChainFetch { } async getStakingValidator(address) { - return this.get(`/cosmos/staking/v1beta1/validators/${address}`).then(data => new Validator().init(commonProcess(data).validator)) + return this.get(`/cosmos/staking/v1beta1/validators/${address}`, null, true).then(data => new Validator().init(commonProcess(data).validator)) } async getSlashingParameters() { @@ -277,27 +280,39 @@ export default class ChainFetch { } async getDistributionParameters() { - return this.get('/cosmos/distribution/v1beta1/params').then(data => commonProcess(data.params)) + return this.get('/cosmos/distribution/v1beta1/params', null, true).then(data => commonProcess(data.params)) } async getGovernanceParameterDeposit() { - return this.get('/cosmos/gov/v1beta1/params/deposit').then(data => commonProcess(data.deposit_params)) + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/params/deposit`).then(data => commonProcess(data.deposit_params)) } async getGovernanceParameterTallying() { - return this.get('/cosmos/gov/v1beta1/params/tallying').then(data => commonProcess(data.tally_params)) + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/params/tallying`).then(data => commonProcess(data.tally_params)) } async getGovernanceParameterVoting() { - return this.get('/cosmos/gov/v1beta1/params/voting').then(data => commonProcess(data.voting_params)) + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/params/voting`).then(data => commonProcess(data.voting_params)) } async getGovernanceTally(pid, total, conf) { - return this.get(`/cosmos/gov/v1beta1/proposals/${pid}/tally`, conf).then(data => new ProposalTally().init(commonProcess(data).tally, total)) + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/proposals/${pid}/tally`, conf).then(data => new ProposalTally().init(commonProcess(data).tally, total)) } getGovernance(pid) { - return this.get(`/cosmos/gov/v1beta1/proposals/${pid}`).then(data => { + if (this.config.chain_name === 'shentu') { + return this.get(`/shentu/gov/v1alpha1/proposals/${pid}`).then(data => { + const p = new Proposal().init(commonProcess(data).proposal, 0) + return p + }) + } + + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/proposals/${pid}`).then(data => { const p = new Proposal().init(commonProcess(data).proposal, 0) p.versionFixed(this.config.sdk_version) return p @@ -305,20 +320,22 @@ export default class ChainFetch { } async getGovernanceProposer(pid) { - if (this.config.chain_name === 'certik') { + if (this.config.chain_name === 'shentu') { return this.get(`/shentu/gov/v1alpha1/${pid}/proposer`).then(data => new Proposer().init(commonProcess(data))) } return this.get(`/gov/proposals/${pid}/proposer`).then(data => new Proposer().init(commonProcess(data))) } async getGovernanceDeposits(pid) { - if (this.config.chain_name === 'certik') { + if (this.config.chain_name === 'shentu') { return this.get(`/shentu/gov/v1alpha1/proposals/${pid}/deposits`).then(data => { const result = commonProcess(data) return Array.isArray(result) ? result.reverse().map(d => new Deposit().init(d)) : result }) } - return this.get(`/cosmos/gov/v1beta1/proposals/${pid}/deposits`).then(data => { + + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/proposals/${pid}/deposits`).then(data => { const result = commonProcess(data) return Array.isArray(result) ? result.reverse().map(d => new Deposit().init(d)) : result }) @@ -334,12 +351,15 @@ export default class ChainFetch { if (this.config.chain_name === 'shentu') { return this.get(`/shentu/gov/v1alpha1/proposals/${pid}/votes?pagination.key=${encodeURIComponent(next)}&pagination.limit=${limit}&pagination.reverse=true`) } - return this.get(`/cosmos/gov/v1beta1/proposals/${pid}/votes?pagination.key=${encodeURIComponent(next)}&pagination.limit=${limit}&pagination.reverse=true`) + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + return this.get(`/cosmos/gov/${ver}/proposals/${pid}/votes?pagination.key=${encodeURIComponent(next)}&pagination.limit=${limit}&pagination.reverse=true`) } async getGovernanceListByStatus(status, chain = null) { const conf = chain || this.config - const url = conf.chain_name === 'shentu' ? `/shentu/gov/v1alpha1/proposals?pagination.limit=100&proposal_status=${status}` : `/cosmos/gov/v1beta1/proposals?pagination.limit=100&proposal_status=${status}` + + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' + const url = conf.chain_name === 'shentu' ? `/shentu/gov/v1alpha1/proposals?pagination.limit=100&proposal_status=${status}` : `/cosmos/gov/${ver}/proposals?pagination.limit=100&proposal_status=${status}` return this.get(url, conf).then(data => { let proposals = commonProcess(data) if (Array.isArray(proposals.proposals)) { @@ -361,9 +381,10 @@ export default class ChainFetch { } async getGovernanceProposalVote(pid, voter, chain) { + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' const url = this.config.chain_name === 'shentu' ? `/shentu/gov/v1alpha1/proposals/${pid}/votes/${voter}` - : `/cosmos/gov/v1beta1/proposals/${pid}/votes/${voter}` + : `/cosmos/gov/${ver}/proposals/${pid}/votes/${voter}` return this.get(url, chain).then(data => { if (data.code === 3) { throw new Error('not found') @@ -379,9 +400,10 @@ export default class ChainFetch { async getGovernanceList(next = '', chain = null) { const key = next || '' + const ver = compareVersions(this.config.sdk_version, '0.46.5') < 0 ? 'v1beta1' : 'v1' const url = this.config.chain_name === 'shentu' ? `/shentu/gov/v1alpha1/proposals?pagination.limit=20&pagination.reverse=true&pagination.key=${key}` - : `/cosmos/gov/v1beta1/proposals?pagination.limit=20&pagination.reverse=true&pagination.key=${key}` + : `/cosmos/gov/${ver}/proposals?pagination.limit=20&pagination.reverse=true&pagination.key=${key}` return this.get(url, chain).then(data => { let proposals = commonProcess(data) if (Array.isArray(proposals.proposals)) { @@ -415,22 +437,22 @@ export default class ChainFetch { async getStakingReward(address, config = null) { if (compareVersions(config ? config.sdk_version : this.config.sdk_version, '0.40') < 0) { - return this.get(`/distribution/delegators/${address}/rewards`, config).then(data => commonProcess(data)) + return this.get(`/distribution/delegators/${address}/rewards`, config, true).then(data => commonProcess(data)) } - return this.get(`/cosmos/distribution/v1beta1/delegators/${address}/rewards`, config).then(data => commonProcess(data)) + return this.get(`/cosmos/distribution/v1beta1/delegators/${address}/rewards`, config, true).then(data => commonProcess(data)) } async getValidatorSlashs(address, config = null) { - return this.get(`/cosmos/distribution/v1beta1/validators//${address}/slashes`, config).then(data => commonProcess(data)) + return this.get(`/cosmos/distribution/v1beta1/validators/${address}/slashes`, config, true).then(data => commonProcess(data)) } async getStakingValidators(address) { - return this.get(`/cosmos/distribution/v1beta1/delegators/${address}/validators?pagination.size=200`).then(data => commonProcess(data.validators)) + return this.get(`/cosmos/distribution/v1beta1/delegators/${address}/validators?pagination.size=200`, null, true).then(data => commonProcess(data.validators)) } async getStakingDelegations(address, config = null) { if (compareVersions(config ? config.sdk_version : this.config.sdk_version, '0.40') < 0) { - return this.get(`/staking/delegators/${address}/delegations`, config).then(data => commonProcess(data).map(x => { + return this.get(`/staking/delegators/${address}/delegations`, config, true).then(data => commonProcess(data).map(x => { const xh = x if (!xh.delegation) { xh.delegation = { @@ -441,21 +463,21 @@ export default class ChainFetch { return xh })) } - return this.get(`/cosmos/staking/v1beta1/delegations/${address}`, config).then(data => commonProcess(data)) + return this.get(`/cosmos/staking/v1beta1/delegations/${address}`, config, true).then(data => commonProcess(data)) } async getStakingRedelegations(address, config = null) { if (compareVersions(config ? config.sdk_version : this.config.sdk_version, '0.40') < 0) { - return this.get(`/staking/redelegations?delegator=${address}`, config).then(data => commonProcess(data)) + return this.get(`/staking/redelegations?delegator=${address}`, config, true).then(data => commonProcess(data)) } - return this.get(`/cosmos/staking/v1beta1/delegators/${address}/redelegations`, config).then(data => commonProcess(data)) + return this.get(`/cosmos/staking/v1beta1/delegators/${address}/redelegations`, config, true).then(data => commonProcess(data)) } async getStakingUnbonding(address, config = null) { if (compareVersions(config ? config.sdk_version : this.config.sdk_version, '0.40') < 0) { - return this.get(`/staking/delegators/${address}/unbonding_delegations`, config).then(data => commonProcess(data)) + return this.get(`/staking/delegators/${address}/unbonding_delegations`, config, true).then(data => commonProcess(data)) } - return this.get(`/cosmos/staking/v1beta1/delegators/${address}/unbonding_delegations`, config).then(data => commonProcess(data)) + return this.get(`/cosmos/staking/v1beta1/delegators/${address}/unbonding_delegations`, config, true).then(data => commonProcess(data)) } async getBankBalances(address, config = null) { @@ -463,7 +485,7 @@ export default class ChainFetch { } async getCommunityPool(config = null) { - return this.get('/cosmos/distribution/v1beta1/community_pool', config).then(data => commonProcess(data)) + return this.get('/cosmos/distribution/v1beta1/community_pool', config, true).then(data => commonProcess(data)) } async getAllIBCDenoms(config = null) { @@ -589,15 +611,17 @@ export default class ChainFetch { return response.json() // parses JSON response into native JavaScript objects } - async get(url, config = null) { + async get(url, config = null, fetch_on_provider = false) { if (!config) { this.getSelectedConfig() } const conf = config || this.config + if (fetch_on_provider && conf.provider_chain) { + return fetch(`${conf.provider_chain.api}${url}`).then(response => response.json()) + } const finalurl = (Array.isArray(conf.api) ? conf.api[this.getApiIndex(config)] : conf.api) + url // finalurl = finalurl.replaceAll('v1beta1', this.getEndpointVersion()) - const ret = await fetch(finalurl).then(response => response.json()) - return ret + return fetch(finalurl).then(response => response.json()) } getApiIndex(config = null) { diff --git a/src/libs/utils.js b/src/libs/utils.js index ea88ee11..1658bf2c 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -1,5 +1,5 @@ import { - Bech32, fromBase64, fromBech32, fromHex, toBase64, toBech32, toHex, + fromBase64, fromBech32, fromHex, toBase64, toBech32, toHex, } from '@cosmjs/encoding' import { sha256, stringToPath } from '@cosmjs/crypto' // ledger @@ -82,20 +82,26 @@ export async function connectLedger(transport = 'usb') { return new CosmosApp(trans) } -export function operatorAddressToAccount(operAddress) { - const { prefix, data } = Bech32.decode(operAddress) - if (prefix === 'iva') { // handle special cases - return Bech32.encode('iaa', data) - } - if (prefix === 'crocncl') { // handle special cases - return Bech32.encode('cro', data) - } - return Bech32.encode(prefix.replace('valoper', ''), data) +export function valoperToPrefix(valoper) { + const prefixIndex = valoper.indexOf('valoper') + if (prefixIndex === -1) return null + return valoper.slice(0, prefixIndex) } -// TODO, not tested -export function pubkeyToAccountAddress(pubkey, prefix) { - return Bech32.encode(prefix, pubkey, 40) +export function operatorAddressToAccount(operAddress) { + const { prefix, data } = fromBech32(operAddress) + if (prefix === 'iva') { // handle special cases + return toBech32('iaa', data) + } + if (prefix === 'crocncl') { // handle special cases + return toBech32('cro', data) + } + return toBech32(prefix.replace('valoper', ''), data) +} + +export function pubKeyToValcons(pubkey, prefix) { + const addressData = sha256(fromBase64(pubkey.key)).slice(0, 20) + return toBech32(`${prefix}valcons`, addressData) } export function toETHAddress(cosmosAddress) { diff --git a/src/router/index.js b/src/router/index.js index 3084d4b9..83f4f029 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -249,16 +249,16 @@ const router = new VueRouter({ component: () => import('@/views/StakingValidator.vue'), meta: { pageTitle: 'Staking Validator', - breadcrumb: [ + breadcrumb: route => ([ { text: 'Staking', - active: true, + to: `/${route.params.chain}/staking`, }, { text: 'Validator', active: true, }, - ], + ]), }, }, { @@ -317,16 +317,16 @@ const router = new VueRouter({ component: () => import('@/views/Block.vue'), meta: { pageTitle: 'Block', - breadcrumb: [ + breadcrumb: route => ([ { text: 'Blocks', - active: true, + to: `/${route.params.chain}/blocks`, }, { text: 'Block', active: true, }, - ], + ]), }, }, { diff --git a/src/views/ConsensusStates.vue b/src/views/ConsensusStates.vue index e893a077..6476004a 100644 --- a/src/views/ConsensusStates.vue +++ b/src/views/ConsensusStates.vue @@ -273,8 +273,9 @@ export default { return i } const txt = text.substring(text.indexOf(':') + 1, text.indexOf(' ')) + const sig = text.split(' ') const val = this.vals.find(x => x.hex.startsWith(txt)) - return val?.description?.moniker || txt + return `${val?.description?.moniker || txt} - ${sig[2]}` }, }, diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue index 621522d4..f926992d 100644 --- a/src/views/Dashboard.vue +++ b/src/views/Dashboard.vue @@ -5,7 +5,7 @@ :show="syncing" >
- No new blocks have been produced since {{ latestTime }} + {{ $t('dashboard.no_new_blocks') }}{{ latestTime }}
@@ -90,40 +90,162 @@ - Active Proposals + {{ $t('dashboard.active_props') }} - - - - {{ myVotes[prop.id] || 'Vote' }} - - - - -
- {{ prop.id }}. {{ prop.title }} -
- {{ formatType(prop.contents['@type']) }} {{ formatEnding(prop.voting_end_time) }} -
-
-
+ + + {{ prop.id }} + + + + +
+ + {{ formatType(prop.contents['@type']) }} + {{ prop.title }} +
+ will {{ caculateTallyResult(prop.tally) }} {{ formatEnding(prop.voting_end_time) }} +
+
+ + + + + +
+
+ + + + + + +
+
+
+
+ + {{ percent(prop.tally.yes) }}% {{ $t('dashboard.proposal_votes_yes') }} + + + {{ percent(prop.tally.no) }}% {{ $t('dashboard.proposal_votes_no') }} + + + {{ percent(prop.tally.veto) }}% {{ $t('dashboard.proposal_votes_nwv') }} + + + {{ percent(prop.tally.abstain) }}% {{ $t('dashboard.proposal_votes_abstain') }} + + + + + {{ myVotes[prop.id] ? `${myVotes[prop.id]}`: 'Vote' }} + + + + + + + + {{ addNewLine(prop.description) }} + + + +
- No active proposal! + {{ $t('dashboard.no_active_prop') }} - Browse all + {{ $t('dashboard.browse') }}
@@ -133,20 +255,20 @@ bg-variant="transparent" class="shadow-none" > - - {{ walletName }} Assets + + {{ walletName }} {{ $t('dashboard.assets') }} - More + {{ $t('dashboard.more') }} - Not connected? + {{ $t('dashboard.not_conn') }} @@ -211,6 +333,7 @@ + + + + {{ $t('dashboard.redelegate') }} + + + {{ $t('dashboard.unbond') }} + + + + {{ $t('dashboard.withdraw_reward') }} + - - - - Widthdraw Rewards - - @@ -260,7 +406,7 @@ - Unbonding Tokens + {{ $t('dashboard.unbonding_token') }} - Send + {{ $t('dashboard.send') }} @@ -319,7 +465,7 @@ - Receive + {{ $t('dashboard.receive') }} @@ -327,7 +473,7 @@ - Connect Wallet + {{ $t('dashboard.connect_wal') }} +
diff --git a/src/views/Governance.vue b/src/views/Governance.vue index e0b83a96..3333fd8a 100644 --- a/src/views/Governance.vue +++ b/src/views/Governance.vue @@ -7,7 +7,11 @@ lg="6" md="12" > - + @@ -64,9 +68,14 @@ export default { max: 1, operationModalType: '', next: '', + totalPower: 0, + tallyParam: null, } }, mounted() { + this.$http.getGovernanceParameterTallying().then(res => { + this.tallyParam = res + }) this.getList() }, methods: { @@ -81,9 +90,10 @@ export default { }, updateTally(res) { this.$http.getStakingPool().then(pool => { + this.totalPower = pool.bondedToken const voting = res.filter(i => i.status === 2) if (voting.length > 0) { - voting.forEach(p => this.$http.getGovernanceTally(p.id, pool.bondedToken).then(update => { + voting.forEach(p => this.$http.getGovernanceTally(p.id, 0).then(update => { this.$set(p, 'tally', update) })) } diff --git a/src/views/GovernanceProposalView.vue b/src/views/GovernanceProposalView.vue index 2ad5ddfa..f7387c42 100644 --- a/src/views/GovernanceProposalView.vue +++ b/src/views/GovernanceProposalView.vue @@ -12,7 +12,7 @@ variant="light-info" class="text-right" > - Deposit + {{$t('governanceProposal.proposal_status_deposit')}} - Voting + {{$t('governanceProposal.proposal_status_voting')}} - Passed + {{$t('governanceProposal.proposal_status_passed')}} - Rejected + {{$t('governanceProposal.proposal_status_rejected')}} {{ proposal.title }}
+
+
- {{ $t('proposal_proposer') }} - - {{ formatAddress(proposer.proposer) }} - - - - - {{ $t('proposal_total_deposit') }} + {{ $t('governanceProposal.proposal_total_deposit') }} {{ formatToken(proposal.total_deposit) }} - {{ $t('proposal_submit_time') }} + {{ $t('governanceProposal.proposal_submit_time') }} {{ formatDate(proposal.submit_time) }} - {{ $t('voting_time') }} + {{ $t('governanceProposal.voting_time') }} {{ formatDate(proposal.voting_start_time) }} - {{ formatDate(proposal.voting_end_time) }} + + + Metadata + {{ proposal.metadata }} + -
-
- {{ $t('upgrade_time') }} {{ upgradeTime }} + {{ $t('governanceProposal.upgrade_time') }} {{ upgradeTime }} + + + + 7s + + + 6s + + + 2s + + + 1s + + @@ -91,7 +104,7 @@ - {{ $t('btn_back_list') }} + {{ $t('governanceProposal.btn_back_list') }} - {{ $t('btn_vote') }} + {{ $t('governanceProposal.btn_vote') }} - Votes + {{ $t('governanceProposal.proposal_votes') }} - - - - - - - - {{ percent(proposal.tally.yes) }}% voted Yes - - - {{ percent(proposal.tally.no) }}% voted No - - - {{ percent(proposal.tally.veto) }}% voted No With Veto - - - {{ percent(proposal.tally.abstain) }}% voted Abstain - - - - -
- - Load More Votes -
-
+
+
+
+ + + + + + + + {{ percent(proposal.tally.yes) }}% {{ $t('governanceProposal.proposal_votes_yes') }} + + + {{ percent(proposal.tally.no) }}% {{ $t('governanceProposal.proposal_votes_no') }} + + + {{ percent(proposal.tally.veto) }}% voted {{ $t('governanceProposal.proposal_votes_nwv') }} + + + {{ percent(proposal.tally.abstain) }}% {{ $t('governanceProposal.proposal_votes_abstain') }} + + +
+
+
+ + + +
+ + {{ $t('governanceProposal.proposal_votes_load') }} +
+
- Deposits ({{ formatToken(proposal.total_deposit) }}) + {{ $t('governanceProposal.proposal_deposits') }} ({{ formatToken(proposal.total_deposit) }}) @@ -219,7 +244,7 @@ - {{ $t('btn_back_list') }} + {{ $t('governanceProposal.btn_back_list') }} - {{ $t('btn_deposit') }} + {{ $t('governanceProposal.btn_deposit') }} - {{ $t('btn_vote') }} + {{ $t('governanceProposal.btn_vote') }} @@ -253,7 +278,7 @@ diff --git a/src/views/components/governance/ProposalSummaryComponent.vue b/src/views/components/governance/ProposalSummaryComponent.vue index 4b2e5cb3..4ddb59cc 100644 --- a/src/views/components/governance/ProposalSummaryComponent.vue +++ b/src/views/components/governance/ProposalSummaryComponent.vue @@ -20,27 +20,27 @@

- Status + {{$t('governanceProposal.proposal_status')}}

- Deposit + {{$t('governanceProposal.proposal_status_deposit')}} - Voting + {{$t('governanceProposal.proposal_status_voting')}} - Passed + {{$t('governanceProposal.proposal_status_passed')}} - Rejected + {{$t('governanceProposal.proposal_status_rejected')}} {{ p.status }}

- Start Date + {{$t('governanceProposal.proposal_status_start_date')}}

{{ formatDate(p.voting_start_time) }} @@ -48,7 +48,7 @@

- End Date + {{$t('governanceProposal.proposal_status_end_date')}}

{{ formatDate(p.voting_end_time) }} @@ -56,108 +56,126 @@

- Deposit + {{$t('governanceProposal.proposal_status_deposit')}}

{{ formatToken(p.total_deposit) || '-' }}
- - - - - - - - - {{ percent(p.tally.yes) }}% voted Yes - - - {{ percent(p.tally.no) }}% voted No - - - {{ percent(p.tally.veto) }}% voted No With Veto - - - {{ percent(p.tally.abstain) }}% voted Abstain - - - - +
+
+ + + + + + +
+
+
+ + {{ percent(p.tally.yes) }}% {{ $t('governanceProposal.proposal_votes_yes') }} + + + {{ percent(p.tally.no) }}% {{ $t('governanceProposal.proposal_votes_no') }} + + + {{ percent(p.tally.veto) }}% {{ $t('governanceProposal.proposal_votes_nwv') }} + + + {{ percent(p.tally.abstain) }}% {{ $t('governanceProposal.proposal_votes_abstain') }} + +
+ + - {{ $t('btn_detail') }} + + {{ $t('governanceProposal.btn_detail') }} + + + + {{ $t('governanceProposal.btn_deposit') }} - - - {{ $t('btn_deposit') }} - - - {{ $t('btn_vote') }} - - - + + {{ $t('governanceProposal.btn_vote') }} + + +
-