Merge pull request #18 from ping-pub/master

merge
This commit is contained in:
Alisa 2023-06-08 17:22:19 +08:00 committed by GitHub
commit bbdb0bc845
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 388 additions and 110 deletions

View File

@ -22,7 +22,7 @@ jobs:
run: yarn install --ignore-engines run: yarn install --ignore-engines
- name: Build - name: Build
run: yarn build-only run: yarn build
- name: Deploy - name: Deploy
run: cp -rf ./dist/* /var/www/html/ run: cp -rf ./dist/* /var/www/html/

View File

@ -0,0 +1,19 @@
{
"chain_name": "Composable",
"api": ["https://composable-api.polkachu.com"],
"rpc": ["https://composable-rpc.polkachu.com"],
"coingecko": "",
"snapshot_provider": "",
"sdk_version": "0.47.1",
"coin_type": "118",
"min_tx_fee": "500",
"addr_prefix": "banksy",
"logo": "/logos/composable.jpg",
"assets": [{
"base": "ppica",
"symbol": "PICA",
"exponent": "12",
"coingecko_id": "",
"logo": "/logos/composable.jpg"
}]
}

18
chains/testnet/noria.json Normal file
View File

@ -0,0 +1,18 @@
{
"chain_name": "Noria",
"api":[ "https://api.noria-testnet.stake-take.com" ],
"rpc":[ "https://rpc.noria-testnet.stake-take.com" ],
"snapshot_provider": "",
"sdk_version": "0.47.2",
"coin_type": 118,
"min_tx_fee": "0",
"addr_prefix": "noria",
"logo": "/logos/noria.jpg",
"assets": [{
"base": "unoria",
"symbol": "NORIA",
"exponent": 6,
"coingecko_id": "",
"logo": "/logos/noria.jpg"
}]
}

View File

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico"> <link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ping Dashboard</title> <title>Ping Dashboard - Cosmos Blockchain Explorer And Web Wallet</title>
<meta name="description" content="Ping Dashboard is a block explorer/web wallet for blockchains built on Cosmos SDK, Cosmoshub, Osmosis, Juno, Evmos, Injective, Canto and 70+ blockchains listed on ping.pub" /> <meta name="description" content="Ping Dashboard is a block explorer/web wallet for blockchains built on Cosmos SDK, Cosmoshub, Osmosis, Juno, Evmos, Injective, Canto and 70+ blockchains listed on ping.pub" />
<link rel="stylesheet" type="text/css" href="/loader.css" /> <link rel="stylesheet" type="text/css" href="/loader.css" />
</head> </head>

View File

@ -35,7 +35,7 @@
"md-editor-v3": "^2.8.1", "md-editor-v3": "^2.8.1",
"numeral": "^2.0.6", "numeral": "^2.0.6",
"osmojs": "^14.0.0-rc.0", "osmojs": "^14.0.0-rc.0",
"ping-widget": "^0.0.33", "ping-widget": "^0.0.35",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"postcss": "^8.4.23", "postcss": "^8.4.23",
"qrcode": "^1.5.3", "qrcode": "^1.5.3",
@ -55,6 +55,7 @@
"@types/marked": "^4.0.8", "@types/marked": "^4.0.8",
"@types/node": "^18.11.12", "@types/node": "^18.11.12",
"@types/numeral": "^2.0.2", "@types/numeral": "^2.0.2",
"@types/semver": "7.5.0",
"@vitejs/plugin-vue": "^4.0.0", "@vitejs/plugin-vue": "^4.0.0",
"@vue/tsconfig": "^0.1.3", "@vue/tsconfig": "^0.1.3",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",

BIN
public/logos/composable.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
public/logos/metamask.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/logos/noria.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { controlledComputed } from '@vueuse/core'
interface Props { interface Props {
title: string; title: string;

View File

@ -2,7 +2,7 @@
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
const props = defineProps({ const props = defineProps({
total: { type: Number }, total: { type: String },
limit: { type: Number }, limit: { type: Number },
callback: { type: Function, required: true }, callback: { type: Function, required: true },
}); });
@ -10,12 +10,13 @@ const current = ref(1)
const showSize = 3 const showSize = 3
const pages = computed(() => { const pages = computed(() => {
const pages: { color: string, page: number }[] = [] const pages: { color: string, page: number }[] = []
if (props.total && props.limit && props.total > props.limit) { const total = Number(props.total || 0)
if (total > 0 && props.limit && total > props.limit) {
let page = 0 let page = 0
while (true) { while (true) {
if (page * props.limit > props.total) break if (page * props.limit > total) break
page += 1 page += 1
if (props.total / props.limit > 10 && page > showSize && page < (props.total / props.limit - showSize + 1)) { if (total / props.limit > 10 && page > showSize && page < (total / props.limit - showSize + 1)) {
if (!(page >= current.value - 1 && page <= current.value + 1)) { if (!(page >= current.value - 1 && page <= current.value + 1)) {
continue continue
} }

View File

@ -7,7 +7,7 @@ const store = useTxDialog();
:type="store.type" :type="store.type"
:sender="store.sender" :sender="store.sender"
:endpoint="store.endpoint" :endpoint="store.endpoint"
:params="store.params" :params='store.params'
@view="store.view" @view="store.view"
@confirmed="store.confirmed" @confirmed="store.confirmed"
></ping-tx-dialog> ></ping-tx-dialog>

View File

@ -1,6 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { toBase64, toHex } from '@cosmjs/encoding'; import { toBase64, toHex } from '@cosmjs/encoding';
import { computed } from '@vue/reactivity'; import { computed } from '@vue/reactivity';
import { ref } from 'vue';
const props = defineProps(['value']); const props = defineProps(['value']);
const format = ref('base64'); const format = ref('base64');

View File

@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, resolveComponent, h } from 'vue'
export default defineComponent({ export default defineComponent({
setup() { setup() {
const routerView = resolveComponent('router-view'); const routerView = resolveComponent('router-view');

View File

@ -13,6 +13,7 @@ import { useBlockchain } from '@/stores';
import NavBarI18n from './NavBarI18n.vue'; import NavBarI18n from './NavBarI18n.vue';
import NavBarWallet from './NavBarWallet.vue'; import NavBarWallet from './NavBarWallet.vue';
import type { NavGroup, NavLink, NavSectionTitle, VerticalNavItems } from '../types';
const dashboard = useDashboard(); const dashboard = useDashboard();
dashboard.initial(); dashboard.initial();
@ -35,6 +36,20 @@ const changeOpen = (index: Number) => {
} }
}; };
const showDiscord = window.location.host.search('ping.pub') > -1; const showDiscord = window.location.host.search('ping.pub') > -1;
function isNavGroup(nav: VerticalNavItems | any): nav is NavGroup {
return (<NavGroup>nav).children !== undefined;
}
function isNavLink(nav: VerticalNavItems | any): nav is NavLink {
return (<NavLink>nav).to !== undefined;
}
function isNavTitle(nav: VerticalNavItems | any): nav is NavSectionTitle {
return (<NavSectionTitle>nav).heading !== undefined;
}
function selected(route: any, nav: NavLink) {
const b = route.path === nav.to?.path || route.path.startsWith(nav.to?.path) && nav.title.indexOf('dashboard') === -1
return b
}
</script> </script>
<template> <template>
@ -45,10 +60,12 @@ const showDiscord = window.location.host.search('ping.pub') > -1;
:class="{ block: sidebarShow, 'hidden xl:!block': !sidebarShow }" :class="{ block: sidebarShow, 'hidden xl:!block': !sidebarShow }"
> >
<div class="flex items-center pl-4 py-4 mb-1"> <div class="flex items-center pl-4 py-4 mb-1">
<img class="w-10 h-10" src="../../assets/logo.svg" /> <RouterLink to="/" class="flex items-center">
<h1 class="flex-1 ml-3 text-2xl font-semibold dark:text-white"> <img class="w-10 h-10" src="../../assets/logo.svg" />
Ping.pub <h1 class="flex-1 ml-3 text-2xl font-semibold dark:text-white">
</h1> Ping.pub
</h1>
</RouterLink>
<div <div
class="pr-4 cursor-pointer xl:!hidden" class="pr-4 cursor-pointer xl:!hidden"
@click="sidebarShow = false" @click="sidebarShow = false"
@ -62,7 +79,7 @@ const showDiscord = window.location.host.search('ping.pub') > -1;
class="px-2" class="px-2"
> >
<div <div
v-if="item?.title && item?.children?.length" v-if="isNavGroup(item)"
:tabindex="index" :tabindex="index"
class="collapse" class="collapse"
:class="{ :class="{
@ -107,17 +124,15 @@ const showDiscord = window.location.host.search('ping.pub') > -1;
</div> </div>
</div> </div>
<div class="collapse-content"> <div class="collapse-content">
<div class="menu bg-base-100 w-full"> <div v-for="(el, key) of item?.children" class="menu bg-base-100 w-full">
<RouterLink <RouterLink
v-for="(el, key) of item?.children" v-if="isNavLink(el)"
@click="sidebarShow = false" @click="sidebarShow = false"
:key="key"
class="hover:bg-gray-100 dark:hover:bg-[#373f59] rounded cursor-pointer px-3 py-2 flex items-center" class="hover:bg-gray-100 dark:hover:bg-[#373f59] rounded cursor-pointer px-3 py-2 flex items-center"
:to="el?.to"
:class="{ :class="{
'!bg-primary': '!bg-primary': selected($route, el),
$route.path === el?.to?.path && item?.title !== 'Favorite',
}" }"
:to="el.to"
> >
<Icon <Icon
v-if="!el?.icon?.image" v-if="!el?.icon?.image"
@ -137,9 +152,7 @@ const showDiscord = window.location.host.search('ping.pub') > -1;
<div <div
class="text-base capitalize text-gray-500 dark:text-gray-300" class="text-base capitalize text-gray-500 dark:text-gray-300"
:class="{ :class="{
'text-white': 'text-white': item?.title !== 'Favorite',
$route.path === el?.to?.path &&
item?.title !== 'Favorite',
}" }"
> >
{{ item?.title === 'Favorite' ? el?.title : $t(el?.title) }} {{ item?.title === 'Favorite' ? el?.title : $t(el?.title) }}
@ -150,8 +163,8 @@ const showDiscord = window.location.host.search('ping.pub') > -1;
</div> </div>
<RouterLink <RouterLink
v-if="isNavLink(item)"
:to="item?.to" :to="item?.to"
v-if="item?.title && !item?.children?.length && item?.to"
@click="sidebarShow = false" @click="sidebarShow = false"
class="cursor-pointer rounded-lg px-4 flex items-center py-2 hover:bg-gray-100 dark:hover:bg-[#373f59]" class="cursor-pointer rounded-lg px-4 flex items-center py-2 hover:bg-gray-100 dark:hover:bg-[#373f59]"
> >
@ -183,7 +196,7 @@ const showDiscord = window.location.host.search('ping.pub') > -1;
</div> </div>
</RouterLink> </RouterLink>
<div <div
v-if="item?.heading" v-if="isNavTitle(item)"
class="px-4 text-sm text-gray-400 pb-2 uppercase" class="px-4 text-sm text-gray-400 pb-2 uppercase"
> >
{{ item?.heading }} {{ item?.heading }}

View File

@ -1,6 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { useI18n } from 'vue-i18n';
const i18nLangs: Array<{ label: string; i18nLang: string }> = [ const i18nLangs: Array<{ label: string; i18nLang: string }> = [
{ {
label: 'English', label: 'English',
@ -13,7 +15,7 @@ const i18nLangs: Array<{ label: string; i18nLang: string }> = [
]; ];
let locale = ref(useI18n({ useScope: 'global' }).locale); let locale = ref(useI18n({ useScope: 'global' }).locale);
watch(locale, (val: string) => { watch(locale, (val) => {
document.documentElement.setAttribute('lang', val as string); document.documentElement.setAttribute('lang', val as string);
}); });

View File

@ -108,6 +108,7 @@ const tipMsg = computed(() => {
<ping-connect-wallet <ping-connect-wallet
:chain-id="baseStore.currentChainId" :chain-id="baseStore.currentChainId"
:hd-path="chainStore.defaultHDPath" :hd-path="chainStore.defaultHDPath"
:prefix="chainStore.current?.bech32Prefix"
@connect="walletStateChange" @connect="walletStateChange"
@keplr-config="walletStore.suggestChain()" @keplr-config="walletStore.suggestChain()"
/> />

59
src/layouts/types.d.ts vendored Normal file
View File

@ -0,0 +1,59 @@
// 👉 Vertical nav section title
export interface NavSectionTitle extends Partial<AclProperties> {
heading: string
}
// 👉 Vertical nav link
declare type ATagTargetAttrValues = '_blank' | '_self' | '_parent' | '_top' | 'framename'
declare type ATagRelAttrValues =
| 'alternate'
| 'author'
| 'bookmark'
| 'external'
| 'help'
| 'license'
| 'next'
| 'nofollow'
| 'noopener'
| 'noreferrer'
| 'prev'
| 'search'
| 'tag'
export interface NavLinkProps {
to?: RouteLocationRaw | string | null
href?: string
target?: ATagTargetAttrValues
rel?: ATagRelAttrValues
i18n?: boolean
}
export interface Icon {
icon?: string,
image?: string,
size: string,
}
export interface NavLink extends NavLinkProps {
title: string
icon?: Icon
badgeContent?: string | number
badgeClass?: string
disable?: boolean
order?: number
}
// 👉 Vertical nav group
export interface NavGroup {
title: string
icon?: Icon
badgeContent?: string | number
badgeClass?: string
children: (NavLink | NavGroup)[]
disable?: boolean
order?: number
i18n?: boolean
}
export declare type VerticalNavItems = (NavLink | NavGroup | NavSectionTitle)[]
export declare type HorizontalNavItems = (NavLink | NavGroup)[]

View File

@ -51,9 +51,10 @@ export function formatTokenAmount(
tokenDenom = 'uatom', tokenDenom = 'uatom',
format = true format = true
) { ) {
const denom = tokenDenom?.denom_trace const denom = typeof tokenDenom === 'string'
? tokenDenom?.denom_trace?.base_denom ? tokenDenom
: tokenDenom; // @ts-ignore
: tokenDenom?.denom_trace?.base_denom;
let amount = 0; let amount = 0;
const asset = assets.find((a: any) => a.base === denom); const asset = assets.find((a: any) => a.base === denom);
let exp = asset let exp = asset
@ -79,60 +80,6 @@ export function numberWithCommas(x: any) {
return parts.join('.'); return parts.join('.');
} }
export function tokenFormatter(tokens: any, denoms = {}, decimal = 2) {
if (Array.isArray(tokens)) {
return tokens.map((t) => formatToken(t, denoms, decimal)).join(', ');
}
return formatToken(tokens, denoms, 2);
}
export function formatToken(
token: any,
IBCDenom = {},
decimals = 2,
withDenom = true
) {
if (token) {
const denom = IBCDenom[token.denom] || token.denom;
if (withDenom) {
return `${formatTokenAmount(
token.amount,
decimals,
denom
)} ${formatTokenDenom(denom)}`;
}
return formatTokenAmount(token.amount, decimals, denom);
}
return token;
}
export function formatTokenDenom(tokenDenom: any) {
if (tokenDenom && tokenDenom.code === undefined) {
let denom = tokenDenom.denom_trace
? tokenDenom.denom_trace.base_denom
: tokenDenom;
const chains = getLocalChains();
const selected = localStorage.getItem('selected_chain');
const selChain = chains[selected];
const nativeAsset = selChain.assets.find((a) => a.base === denom);
if (nativeAsset) {
denom = nativeAsset.symbol;
} else {
const config = Object.values(chains);
config.forEach((x) => {
if (x.assets) {
const asset = x.assets.find((a) => a.base === denom);
if (asset) denom = asset.symbol;
}
});
}
return denom.length > 10
? `${denom.substring(0, 7).toUpperCase()}..${denom.substring(
denom.length - 3
)}`
: denom.toUpperCase();
}
return '';
}
export function isToken(value: string) { export function isToken(value: string) {
let is = false; let is = false;
if (Array.isArray(value)) { if (Array.isArray(value)) {

View File

@ -7,11 +7,12 @@ import {
useDashboard, useDashboard,
useStakingStore, useStakingStore,
} from '@/stores'; } from '@/stores';
import { consensusPubkeyToHexAddress } from '@/libs';
const format = useFormatter(); const format = useFormatter();
const chainStore = useBlockchain(); const chainStore = useBlockchain();
const dashboard = useDashboard(); const dashboard = useDashboard();
const stakingStore = useStakingStore(); const stakingStore = useStakingStore();
import { consensusPubkeyToHexAddress } from '@/libs';
const rpcList = ref( const rpcList = ref(
chainStore.current?.endpoints?.rpc || [{ address: '', provider: '' }] chainStore.current?.endpoints?.rpc || [{ address: '', provider: '' }]
); );
@ -42,21 +43,24 @@ onUnmounted(() => {
}); });
const newTime = computed(() => { const newTime = computed(() => {
return format.toDay(updatetime.value || '', 'time'); return format.toDay(updatetime.value?.toDateString(), 'time');
}); });
const vals = computed(() => { const vals = computed(() => {
return validators.value.map((x) => { return validators.value.map((x) => {
const x2 = x; const x2 = x;
// @ts-ignore
x2.hex = consensusPubkeyToHexAddress(x.consensus_pubkey); x2.hex = consensusPubkeyToHexAddress(x.consensus_pubkey);
return x2; return x2;
}); });
}); });
function showName(i, text) { function showName(i:number, text: string) {
if (text === 'nil-Vote') { if (text === 'nil-Vote') {
// @ts-ignore
if (positions.value?.[i]?.address) { if (positions.value?.[i]?.address) {
const val = vals.value.find( const val = vals.value.find(
// @ts-ignore
(x) => x.hex === positions.value?.[i]?.address (x) => x.hex === positions.value?.[i]?.address
); );
return val?.description?.moniker || i; return val?.description?.moniker || i;
@ -65,10 +69,11 @@ function showName(i, text) {
} }
const txt = text.substring(text.indexOf(':') + 1, text.indexOf(' ')); const txt = text.substring(text.indexOf(':') + 1, text.indexOf(' '));
const sig = text.split(' '); const sig = text.split(' ');
// @ts-ignore
const val = validators.value.find((x) => x?.hex?.startsWith(txt)); const val = validators.value.find((x) => x?.hex?.startsWith(txt));
return `${val?.description?.moniker || txt} - ${sig[2]}`; return `${val?.description?.moniker || txt} - ${sig[2]}`;
} }
function color(i, txt) { function color(i: number, txt: string) {
if (i === roundState.value?.proposer?.index) { if (i === roundState.value?.proposer?.index) {
return txt === 'nil-Vote' ? 'warning' : 'primary'; return txt === 'nil-Vote' ? 'warning' : 'primary';
} }
@ -99,7 +104,9 @@ async function fetchPosition() {
const data = await response.json(); const data = await response.json();
positions.value = data.result.round_state.validators.validators; positions.value = data.result.round_state.validators.validators;
} catch (error) { } catch (error) {
// @ts-ignore
httpstatus.value = error?.status || 500; httpstatus.value = error?.status || 500;
// @ts-ignore
httpStatusText.value = error?.message || 'Error'; httpStatusText.value = error?.message || 'Error';
} }
} }
@ -125,7 +132,7 @@ async function update() {
step.value = raw[2]; step.value = raw[2];
// find the highest onboard rate // find the highest onboard rate
roundState.value?.height_vote_set?.forEach((element) => { roundState.value?.height_vote_set?.forEach((element: any) => {
const rates = Number( const rates = Number(
element.prevotes_bit_array.substring( element.prevotes_bit_array.substring(
element.prevotes_bit_array.length - 4 element.prevotes_bit_array.length - 4

View File

@ -158,7 +158,7 @@ const result = ref('');
</table> </table>
<div class="flex justify-between"> <div class="flex justify-between">
<PaginationBar <PaginationBar
:limit="50" :limit="pageRequest.limit"
:total="response.pagination?.total" :total="response.pagination?.total"
:callback="loadContract" :callback="loadContract"
/> />

View File

@ -201,7 +201,7 @@ function updateState() {
</div> </div>
</div> </div>
<div class="grid grid-cols-2 gap-4 md:!grid-cols-3 lg:!grid-cols-6"> <div class="grid grid-cols-1 gap-4 md:!grid-cols-3 lg:!grid-cols-6">
<div v-for="(item, key) in store.stats" :key="key"> <div v-for="(item, key) in store.stats" :key="key">
<CardStatisticsVertical v-bind="item" /> <CardStatisticsVertical v-bind="item" />
</div> </div>

View File

@ -9,7 +9,7 @@ import {
import { useDistributionStore } from '@/stores/useDistributionStore'; import { useDistributionStore } from '@/stores/useDistributionStore';
import { useMintStore } from '@/stores/useMintStore'; import { useMintStore } from '@/stores/useMintStore';
import { useStakingStore } from '@/stores/useStakingStore'; import { useStakingStore } from '@/stores/useStakingStore';
import type { Tally } from '@/types'; import type { Coin, Tally } from '@/types';
import numeral from 'numeral'; import numeral from 'numeral';
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
@ -175,6 +175,7 @@ export const useIndexModule = defineStore('module-index', {
color: 'warning', color: 'warning',
icon: 'mdi-lock', icon: 'mdi-lock',
stats: formatter.formatTokenAmount({ stats: formatter.formatTokenAmount({
// @ts-ignore
amount: this.pool.bonded_tokens, amount: this.pool.bonded_tokens,
denom: staking.params.bond_denom, denom: staking.params.bond_denom,
}), }),
@ -192,8 +193,9 @@ export const useIndexModule = defineStore('module-index', {
color: 'primary', color: 'primary',
icon: 'mdi-bank', icon: 'mdi-bank',
stats: formatter.formatTokens( stats: formatter.formatTokens(
// @ts-ignore
this.communityPool?.filter( this.communityPool?.filter(
(x) => x.denom === staking.params.bond_denom (x: Coin) => x.denom === staking.params.bond_denom
) )
), ),
change: 0, change: 0,
@ -203,6 +205,7 @@ export const useIndexModule = defineStore('module-index', {
coingeckoId() { coingeckoId() {
this.tickerIndex = 0; this.tickerIndex = 0;
// @ts-ignore
const [firstAsset] = this.blockchain?.assets || []; const [firstAsset] = this.blockchain?.assets || [];
return firstAsset.coingecko_id return firstAsset.coingecko_id
} }

View File

@ -26,11 +26,11 @@ const chains = computed(() => {
</script> </script>
<template> <template>
<div class=""> <div class="">
<div class="flex items-center justify-center mb-6 mt-14"> <div class="flex flex-col md:flex-row items-center justify-center mb-6 mt-14 gap-3">
<div class="w-8 md:!w-16 rounded-full mr-3"> <div class="w-16 rounded-full">
<img src="/logo.svg" /> <img src="/logo.svg" />
</div> </div>
<h1 class="text-primary text-3xl md:!text-6xl font-bold mr-2"> <h1 class="text-primary text-3xl md:!text-6xl font-bold">
Ping dashboard Ping dashboard
</h1> </h1>
<div class="badge badge-primary badge-outline mt-1 text-sm md:!mt-8"> <div class="badge badge-primary badge-outline mt-1 text-sm md:!mt-8">
@ -50,14 +50,14 @@ const chains = computed(() => {
<progress class="progress progress-info w-80 h-1"></progress> <progress class="progress progress-info w-80 h-1"></progress>
</div> </div>
<div class="flex items-center rounded-full bg-base-100 border border-gray-200 dark:border-gray-700 mt-10"> <div class="flex items-center rounded-lg bg-base-100 border border-gray-200 dark:border-gray-700 mt-10">
<Icon icon="mdi:magnify" class="text-2xl text-gray-400 ml-3"/> <Icon icon="mdi:magnify" class="text-2xl text-gray-400 ml-3"/>
<input :placeholder="$t('index.search_placeholder')" class="px-4 h-10 bg-transparent flex-1 outline-none text-base" v-model="keywords" /> <input :placeholder="$t('index.search_placeholder')" class="px-4 h-10 bg-transparent flex-1 outline-none text-base" v-model="keywords" />
<div class="px-4 text-base">{{ chains.length }}/{{ dashboard.length }}</div> <div class="px-4 text-base hidden md:block">{{ chains.length }}/{{ dashboard.length }}</div>
</div> </div>
<div <div
class="grid grid-cols-2 gap-4 mt-6 md:!grid-cols-3 lg:!grid-cols-4 2xl:!grid-cols-5" class="grid grid-cols-1 gap-4 mt-6 md:!grid-cols-3 lg:!grid-cols-4 2xl:!grid-cols-5"
> >
<ChainSummary <ChainSummary
v-for="(chain, index) in chains" v-for="(chain, index) in chains"

View File

@ -1,6 +1,8 @@
import { useBlockchain } from "@/stores"; import { useBlockchain } from "@/stores";
import { setupLayouts } from "virtual:generated-layouts";
import { createRouter, createWebHistory } from "vue-router"; import { createRouter, createWebHistory } from "vue-router";
// @ts-ignore
import { setupLayouts } from "virtual:generated-layouts";
// @ts-ignore
import routes from "~pages"; import routes from "~pages";
const router = createRouter({ const router = createRouter({

View File

@ -10,6 +10,7 @@ export const useBankStore = defineStore('bankstore', {
supply: {} as Coin, supply: {} as Coin,
balances: {} as Record<string, Coin[]>, balances: {} as Record<string, Coin[]>,
totalSupply: { supply: [] as Coin[] }, totalSupply: { supply: [] as Coin[] },
ibcDenoms: {} as Record<string, DenomTrace>
}; };
}, },
getters: { getters: {

View File

@ -5,7 +5,7 @@ import {
type Endpoint, type Endpoint,
EndpointType, EndpointType,
} from './useDashboard'; } from './useDashboard';
import type { VerticalNavItems } from '@/@layouts/types'; import type { NavGroup, NavLink, NavSectionTitle, VerticalNavItems } from '@/layouts/types';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { CosmosRestClient } from '@/libs/client'; import { CosmosRestClient } from '@/libs/client';
import { import {
@ -107,7 +107,7 @@ export const useBlockchain = defineStore('blockchain', {
// combine all together // combine all together
return [ return [
...currNavItem, ...currNavItem,
{ heading: 'Ecosystem' }, { heading: 'Ecosystem' } as NavSectionTitle,
{ {
title: 'Favorite', title: 'Favorite',
children: favNavItems, children: favNavItems,
@ -115,7 +115,7 @@ export const useBlockchain = defineStore('blockchain', {
badgeClass: 'bg-primary', badgeClass: 'bg-primary',
i18n: true, i18n: true,
icon: { icon: 'mdi-star', size: '22' }, icon: { icon: 'mdi-star', size: '22' },
}, } as NavGroup,
{ {
title: 'All Blockchains', title: 'All Blockchains',
to: { path: '/' }, to: { path: '/' },
@ -123,7 +123,7 @@ export const useBlockchain = defineStore('blockchain', {
badgeClass: 'bg-primary', badgeClass: 'bg-primary',
i18n: true, i18n: true,
icon: { icon: 'mdi-grid', size: '22' }, icon: { icon: 'mdi-grid', size: '22' },
}, } as NavLink,
]; ];
}, },
}, },

View File

@ -147,6 +147,7 @@ export const useFormatter = defineStore('formatter', {
} }
const conf = mode === 'local'? this.blockchain.current?.assets?.find( const conf = mode === 'local'? this.blockchain.current?.assets?.find(
// @ts-ignore
(x) => x.base === token.denom || x.base.denom === token.denom (x) => x.base === token.denom || x.base.denom === token.denom
): this.findGlobalAssetConfig(token.denom) ): this.findGlobalAssetConfig(token.denom)
@ -226,7 +227,7 @@ export const useFormatter = defineStore('formatter', {
numberAndSign(input: number, fmt = '+0,0') { numberAndSign(input: number, fmt = '+0,0') {
return numeral(input).format(fmt); return numeral(input).format(fmt);
}, },
toDay(time?: string, format = 'long') { toDay(time?: string | number, format = 'long') {
if (!time) return ''; if (!time) return '';
if (format === 'long') { if (format === 'long') {
return dayjs(time).format('YYYY-MM-DD HH:mm'); return dayjs(time).format('YYYY-MM-DD HH:mm');

View File

@ -17,7 +17,7 @@ export const useWalletStore = defineStore('walletStore', {
balances: [] as Coin[], balances: [] as Coin[],
delegations: [] as Delegation[], delegations: [] as Delegation[],
unbonding: [] as UnbondingResponses[], unbonding: [] as UnbondingResponses[],
rewards: {} as DelegatorRewards, rewards: {total: [], rewards: []} as DelegatorRewards,
walletIsConnected: {} as WalletConnected walletIsConnected: {} as WalletConnected
}; };
}, },
@ -28,7 +28,7 @@ export const useWalletStore = defineStore('walletStore', {
connectedWallet() { connectedWallet() {
const chainStore = useBlockchain(); const chainStore = useBlockchain();
const key = chainStore.defaultHDPath; const key = chainStore.defaultHDPath;
let connected = this.walletIsConnected let connected = {} as WalletConnected
if (!this.walletIsConnected?.cosmosAddress){ if (!this.walletIsConnected?.cosmosAddress){
connected = JSON.parse(localStorage.getItem(key) || '{}'); connected = JSON.parse(localStorage.getItem(key) || '{}');
} }
@ -54,8 +54,9 @@ export const useWalletStore = defineStore('walletStore', {
}, },
rewardAmount() { rewardAmount() {
const stakingStore = useStakingStore(); const stakingStore = useStakingStore();
// @ts-ignore
const reward = this.rewards.total?.find( const reward = this.rewards.total?.find(
(x) => x.denom === stakingStore.params.bond_denom (x: Coin) => x.denom === stakingStore.params.bond_denom
); );
return reward || { amount: '0', denom: stakingStore.params.bond_denom }; return reward || { amount: '0', denom: stakingStore.params.bond_denom };
}, },
@ -125,7 +126,6 @@ export const useWalletStore = defineStore('walletStore', {
console.log(key, 'key') console.log(key, 'key')
console.log(localStorage.getItem(key)) console.log(localStorage.getItem(key))
localStorage.removeItem(key); localStorage.removeItem(key);
this.walletIsConnected = null
this.$reset() this.$reset()
}, },
setConnectedWallet(value: any) { setConnectedWallet(value: any) {

205
yarn.lock
View File

@ -1687,6 +1687,168 @@
ethereum-cryptography "^2.0.0" ethereum-cryptography "^2.0.0"
micro-ftch "^0.3.1" micro-ftch "^0.3.1"
"@ethersproject/abstract-provider@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef"
integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
dependencies:
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/networks" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/transactions" "^5.7.0"
"@ethersproject/web" "^5.7.0"
"@ethersproject/abstract-signer@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2"
integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
dependencies:
"@ethersproject/abstract-provider" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/address@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37"
integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
dependencies:
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/keccak256" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/rlp" "^5.7.0"
"@ethersproject/base64@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c"
integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/bignumber@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2"
integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
bn.js "^5.2.1"
"@ethersproject/bytes@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d"
integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
dependencies:
"@ethersproject/logger" "^5.7.0"
"@ethersproject/constants@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e"
integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
dependencies:
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/hash@5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7"
integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
dependencies:
"@ethersproject/abstract-signer" "^5.7.0"
"@ethersproject/address" "^5.7.0"
"@ethersproject/base64" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/keccak256" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/keccak256@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a"
integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
dependencies:
"@ethersproject/bytes" "^5.7.0"
js-sha3 "0.8.0"
"@ethersproject/logger@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892"
integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
"@ethersproject/networks@^5.7.0":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
dependencies:
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30"
integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
dependencies:
"@ethersproject/logger" "^5.7.0"
"@ethersproject/rlp@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304"
integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3"
integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
bn.js "^5.2.1"
elliptic "6.5.4"
hash.js "1.1.7"
"@ethersproject/strings@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2"
integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/constants" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/transactions@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b"
integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
dependencies:
"@ethersproject/address" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/constants" "^5.7.0"
"@ethersproject/keccak256" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/rlp" "^5.7.0"
"@ethersproject/signing-key" "^5.7.0"
"@ethersproject/web@^5.7.0":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
dependencies:
"@ethersproject/base64" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@iconify/types@^2.0.0": "@iconify/types@^2.0.0":
version "2.0.0" version "2.0.0"
resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz"
@ -2461,6 +2623,11 @@
resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz"
integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==
"@types/semver@7.5.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a"
integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
"@types/web-bluetooth@^0.0.16": "@types/web-bluetooth@^0.0.16":
version "0.0.16" version "0.0.16"
resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz" resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz"
@ -3001,7 +3168,7 @@ bn.js@^4.11.9, bn.js@^4.12.0:
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
bn.js@^5.2.0: bn.js@^5.2.0, bn.js@^5.2.1:
version "5.2.1" version "5.2.1"
resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz"
integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
@ -3649,7 +3816,7 @@ electron-to-chromium@^1.4.284:
resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz"
integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ== integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==
elliptic@^6.5.4: elliptic@6.5.4, elliptic@^6.5.4:
version "6.5.4" version "6.5.4"
resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
@ -4313,7 +4480,7 @@ hash-sum@^2.0.0:
resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz" resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz"
integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
hash.js@^1.0.0, hash.js@^1.0.3: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7" version "1.1.7"
resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
@ -4763,6 +4930,11 @@ jiti@^1.17.2, jiti@^1.18.2:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd"
integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==
js-sha3@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
js-tokens@^4.0.0: js-tokens@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
@ -5503,6 +5675,33 @@ ping-widget@^0.0.33:
vue "^3.2.47" vue "^3.2.47"
vue3-webcomponent-wrapper "^0.2.0" vue3-webcomponent-wrapper "^0.2.0"
ping-widget@^0.0.35:
version "0.0.35"
resolved "https://registry.yarnpkg.com/ping-widget/-/ping-widget-0.0.35.tgz#646c1680021f0575f144ea943afe5ba551e1b7ea"
integrity sha512-u9Hd51jmEMLgvDKNBFmNMI1gFC0D0Nn5/0qtcWr+FZsbLfmj1bIF62p+D6gt367l/QS4/UlxqyA0SfpW34OzSw==
dependencies:
"@cosmjs/amino" "^0.30.1"
"@cosmjs/cosmwasm-stargate" "^0.30.1"
"@cosmjs/ledger-amino" "^0.30.1"
"@cosmjs/proto-signing" "^0.30.1"
"@cosmjs/stargate" "^0.30.1"
"@ethersproject/hash" "5.7.0"
"@ethersproject/signing-key" "5.7.0"
"@ledgerhq/hw-transport-web-ble" "^6.27.13"
"@ledgerhq/hw-transport-webusb" "^6.27.14"
"@metamask/eth-sig-util" "^5.1.0"
"@ping-pub/chain-registry-client" "^0.0.25"
"@types/bignumber.js" "^5.0.0"
buffer "6.0.3"
cross-fetch "^3.1.5"
daisyui "^2.51.6"
dayjs "^1.11.7"
fflate "^0.8.0"
osmojs "^15.2.1"
ping-widget "^0.0.33"
vue "^3.2.47"
vue3-webcomponent-wrapper "^0.2.0"
pinia@^2.0.28: pinia@^2.0.28:
version "2.0.30" version "2.0.30"
resolved "https://registry.npmjs.org/pinia/-/pinia-2.0.30.tgz" resolved "https://registry.npmjs.org/pinia/-/pinia-2.0.30.tgz"