Merge pull request #381 from alisaweb3/v3-single

wallet state, process,ibc,dashboard
This commit is contained in:
ping 2023-05-16 06:59:18 +08:00 committed by GitHub
commit c35b07ee49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 631 additions and 211 deletions

View File

@ -27,6 +27,7 @@
"@tomieric/vue-flip-countdown": "^0.0.5", "@tomieric/vue-flip-countdown": "^0.0.5",
"@vitejs/plugin-vue-jsx": "^3.0.0", "@vitejs/plugin-vue-jsx": "^3.0.0",
"@vueuse/core": "^9.12.0", "@vueuse/core": "^9.12.0",
"@vueuse/integrations": "^10.1.2",
"@vueuse/math": "^9.12.0", "@vueuse/math": "^9.12.0",
"apexcharts": "^3.37.1", "apexcharts": "^3.37.1",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
@ -40,10 +41,11 @@
"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.7", "ping-widget": "^0.0.9",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"postcss": "^8.4.23", "postcss": "^8.4.23",
"prismjs": "^1.29.0", "prismjs": "^1.29.0",
"qrcode": "^1.5.3",
"tailwindcss": "^3.3.1", "tailwindcss": "^3.3.1",
"theme-change": "^2.5.0", "theme-change": "^2.5.0",
"vite-plugin-vue-layouts": "^0.7.0", "vite-plugin-vue-layouts": "^0.7.0",

View File

@ -1,5 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useBlockchain, useFormatter, useStakingStore } from '@/stores'; import { useBlockchain, useFormatter, useStakingStore } from '@/stores';
import { select } from '@/components/dynamic/index';
import type { PaginatedProposals } from '@/types'; import type { PaginatedProposals } from '@/types';
import ProposalProcess from './ProposalProcess.vue'; import ProposalProcess from './ProposalProcess.vue';
import type { PropType } from 'vue'; import type { PropType } from 'vue';
@ -26,64 +27,201 @@ const statusMap: Record<string, string> = {
</script> </script>
<template> <template>
<div class="bg-white dark:bg-[#28334e] rounded text-sm"> <div class="bg-white dark:bg-[#28334e] rounded text-sm">
<RouterLink <table class="table-compact w-full table-fixed hidden lg:table">
:to="`/${chain.chainName}/gov/${item?.proposal_id}`" <tbody>
v-for="(item, index) in proposals?.proposals" <tr v-for="(item, index) in proposals?.proposals" :key="index">
:key="index" <td class="px-4 w-20">
class="py-4 px-4 hover:bg-gray-100 dark:hover:bg-[#353f5a] block rounded cursor-pointer" <label
> for="proposal-detail-modal"
<div class="grid grid-cols-6 md:grid-cols-11 flex-1"> class="text-main text-base hover:text-indigo-400 cursor-pointer"
<div class="text-main dark:text-white mb-3"> >
#{{ item?.proposal_id }} #{{ item?.proposal_id }}</label
</div> >
<input
type="checkbox"
id="proposal-detail-modal"
class="modal-toggle"
/>
<div class="modal modal-bottom sm:modal-middle">
<div class="modal-box">
<h3 class="font-bold text-lg">Description</h3>
<p class="py-4">
<Component
v-if="item.content?.description"
:is="select(item.content?.description, 'horizontal')"
:value="item.content?.description"
></Component>
</p>
<div class="modal-action">
<label
for="proposal-detail-modal"
class="btn btn-sm btn-primary"
>Close</label
>
</div>
</div>
</div>
</td>
<td class="w-[35%]">
<div>
<RouterLink
:to="`/${chain.chainName}/gov/${item?.proposal_id}`"
class="text-main text-base mb-1 block hover:text-indigo-400 truncate"
>
{{ item?.content?.title }}
</RouterLink>
<div
class="bg-[#f6f2ff] text-[#9c6cff] dark:bg-gray-600 dark:text-gray-300 inline-block rounded-full px-2 py-[1px] text-xs mb-1"
>
{{ showType(item.content['@type']) }}
</div>
</div>
</td>
<td class="w-[25%]">
<ProposalProcess
:pool="staking.pool"
:tally="item.final_tally_result"
></ProposalProcess>
</td>
<td>
<div class="pl-4">
<div
class="flex items-center"
:class="
statusMap?.[item?.status] === 'PASSED'
? 'text-yes'
: statusMap?.[item?.status] === 'REJECTED'
? 'text-no'
: 'text-info'
"
>
<div
class="w-1 h-1 rounded-full mr-2"
:class="
statusMap?.[item?.status] === 'PASSED'
? 'bg-yes'
: statusMap?.[item?.status] === 'REJECTED'
? 'bg-no'
: 'bg-info'
"
></div>
<div class="text-xs">
{{ statusMap?.[item?.status] || item?.status }}
</div>
</div>
<div
class="truncate col-span-2 md:col-span-1 text-xs text-gray-500 dark:text-gray-400 text-right md:flex md:justify-start"
>
{{ format.toDay(item.voting_end_time, 'from') }}
</div>
</div>
</td>
<div class="col-span-5 md:pr-10 text-main dark:text-white truncate"> <td>
{{ item?.content?.title }} <div>
</div> <button class="btn btn-xs btn-primary rounded-sm">Vote</button>
</div>
</td>
</tr>
</tbody>
</table>
<div class="col-span-3 mb-3 truncate"> <div class="lg:hidden">
<div <div
class="bg-[#f6f2ff] text-[#9c6cff] dark:bg-gray-600 dark:text-gray-300 inline-block rounded-full px-2 py-[1px] text-xs" v-for="(item, index) in proposals?.proposals"
:key="index"
class="px-4 py-4"
>
<div
class="text-main text-base mb-1 flex justify-between hover:text-indigo-400"
>
<RouterLink
:to="`/${chain.chainName}/gov/${item?.proposal_id}`"
class="flex-1 w-0 truncate mr-4"
>{{ item?.content?.title }}</RouterLink
> >
{{ showType(item.content['@type']) }} <label
for="proposal-detail-modals"
class="text-main text-base hover:text-indigo-400 cursor-pointer"
>
#{{ item?.proposal_id }}</label
>
<input
type="checkbox"
id="proposal-detail-modals"
class="modal-toggle"
/>
<div class="modal modal-bottom sm:modal-middle">
<div class="modal-box">
<h3 class="font-bold text-lg">Description</h3>
<p class="py-4">
<Component
v-if="item.content?.description"
:is="select(item.content?.description, 'horizontal')"
:value="item.content?.description"
></Component>
</p>
<div class="modal-action">
<label
for="proposal-detail-modals"
class="btn btn-sm btn-primary"
>Close</label
>
</div>
</div>
</div> </div>
</div> </div>
<div <div class="grid grid-cols-4 mt-2 mb-2">
class="flex items-center mb-3" <div class="col-span-2">
:class=" <div
statusMap?.[item?.status] === 'PASSED' class="bg-[#f6f2ff] text-[#9c6cff] dark:bg-gray-600 dark:text-gray-300 inline-block rounded-full px-2 py-[1px] text-xs mb-1"
? 'text-yes' >
: statusMap?.[item?.status] === 'REJECTED' {{ showType(item.content['@type']) }}
? 'text-no' </div>
: 'text-info' </div>
"
>
<div <div
class="w-1 h-1 rounded-full mr-2" class="flex items-center"
:class=" :class="
statusMap?.[item?.status] === 'PASSED' statusMap?.[item?.status] === 'PASSED'
? 'bg-yes' ? 'text-yes'
: statusMap?.[item?.status] === 'REJECTED' : statusMap?.[item?.status] === 'REJECTED'
? 'bg-no' ? 'text-no'
: 'bg-info' : 'text-info'
" "
></div> >
<div class="text-xs"> <div
{{ statusMap?.[item?.status] || item?.status }} class="w-1 h-1 rounded-full mr-2"
:class="
statusMap?.[item?.status] === 'PASSED'
? 'bg-yes'
: statusMap?.[item?.status] === 'REJECTED'
? 'bg-no'
: 'bg-info'
"
></div>
<div class="text-xs flex items-center">
{{ statusMap?.[item?.status] || item?.status }}
</div>
</div>
<div
class="truncate text-xs text-gray-500 dark:text-gray-400 flex items-center justify-end"
>
{{ format.toDay(item.voting_end_time, 'from') }}
</div> </div>
</div> </div>
<div <div>
class="truncate mb-3 col-span-2 md:col-span-1 text-xs text-gray-500 dark:text-gray-400 text-right md:flex md:justify-start" <ProposalProcess
> :pool="staking.pool"
{{ format.toDay(item.voting_end_time, 'from') }} :tally="item.final_tally_result"
></ProposalProcess>
</div>
<div class="mt-4">
<button class="btn btn-xs btn-primary rounded-sm px-4">Vote</button>
</div> </div>
</div> </div>
<ProposalProcess </div>
:pool="staking.pool"
:tally="item.final_tally_result"
></ProposalProcess>
</RouterLink>
</div> </div>
</template> </template>

View File

@ -30,46 +30,35 @@ const veto = computed(() =>
</script> </script>
<template> <template>
<div class="grid grid-cols-4 gap-4 mb-3 text-sm"> <div class="progress rounded-[3px] h-6 text-xs flex items-center">
<div class="flex items-center justify-between rounded-sm px-2 relative">
<div
class="bg-yes absolute top-0 bottom-0 left-0 right-0 rounded-sm opacity-20 dark:opacity-40"
></div>
<div>YES</div>
<div class="text-gray-800 dark:text-gray-50">{{ yes }}</div>
</div>
<div class="flex items-center justify-between rounded-sm px-2 relative">
<div
class="bg-no absolute top-0 bottom-0 left-0 right-0 rounded-sm opacity-20 dark:opacity-40"
></div>
<div>NO</div>
<div class="text-gray-800 dark:text-gray-50">{{ no }}</div>
</div>
<div class="flex items-center justify-between rounded-sm px-2 relative">
<div
class="bg-warning absolute top-0 bottom-0 left-0 right-0 rounded-sm opacity-20 dark:opacity-50"
></div>
<div>No With Veto</div>
<div class="text-gray-800 dark:text-gray-50">{{ veto }}</div>
</div>
<div class="flex items-center justify-between rounded-sm px-2 relative">
<div
class="bg-gray-500 absolute top-0 bottom-0 left-0 right-0 rounded-sm opacity-20 dark:opacity-40"
></div>
<div>Abstain</div>
<div class="text-gray-800 dark:text-gray-50">{{ abstain }}</div>
</div>
</div>
<div class="progress rounded-full h-1 text-xs flex items-center">
<div class="h-1 bg-yes" :style="`width: ${yes}`"></div>
<div class="h-1 bg-no" :style="`width: ${no}`"></div>
<div <div
class="h-1" class="h-6 bg-yes flex items-center pl-2 text-white overflow-hidden"
:style="`width: ${veto}; background-color: #B71C1C;`" :style="`width: ${yes}`"
></div> :title="yes"
<div class="h-1 bg-secondary" :style="`width: ${abstain}`"></div> >
{{ yes }}
</div>
<div
class="h-6 bg-no flex items-center text-white overflow-hidden"
:style="`width: ${no}`"
:title="no"
>
{{ no }}
</div>
<div
class="h-6 bg-[#B71C1C] flex items-center text-white overflow-hidden"
:style="`width: ${veto};`"
:title="veto"
>
{{ veto }}
</div>
<div
class="h-6 bg-secondary flex items-center text-white overflow-hidden"
:style="`width: ${abstain}`"
:title="abstain"
>
{{ abstain }}
</div>
</div> </div>
</template> </template>
<style scoped> <style scoped>

View File

@ -1,31 +0,0 @@
<script setup lang="ts">
import { useBlockchain } from '@/stores/useBlockchain';
import { Icon } from '@iconify/vue';
import { computed } from '@vue/reactivity';
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
const chain = useBlockchain();
const route = useRoute();
const i18n = useI18n();
/// To display human readable module name, we have to set the prefix("module.") + route name to the key in i18n.
/// such as `module.chain` = 'Dashboard'
const moduleName = computed(() =>
i18n.t(`module.${route.name?.toString() || ''}`)
);
const items = computed(() => [
{ title: String(chain.name).toUpperCase(), href: `/${chain.name}` },
moduleName.value,
]);
</script>
<template>
<div class="d-flex flex-rows align-center">
<span class="text-h5 mr-3">{{ moduleName }}</span>
<Icon icon="mdi-dots-vertical" />
<VBreadcrumbs :items="items">
<template v-slot:divider>
<Icon icon="mdi-chevron-right" />
</template>
</VBreadcrumbs>
</div>
</template>

View File

@ -110,6 +110,7 @@ const changeOpen = (index: Number) => {
$route.path === el?.to?.path && item?.title !== 'Favorite', $route.path === el?.to?.path && item?.title !== 'Favorite',
}" }"
> >
<Icon icon="mdi:chevron-right" class="mr-2 ml-3"/>
<img <img
v-if="el?.icon?.image" v-if="el?.icon?.image"
:src="el?.icon?.image" :src="el?.icon?.image"

View File

@ -1,10 +1,36 @@
<script setup lang="ts"> <script setup lang="ts">
import { useWalletStore } from '@/stores'; import { useWalletStore } from '@/stores';
import { ref, computed } from 'vue';
const walletStore = useWalletStore(); const walletStore = useWalletStore();
walletStore.$subscribe((m, s) => { walletStore.$subscribe((m, s) => {
console.log(m, s); console.log(m, s);
}); });
let showCopyToast = ref(0);
async function copyAdress(address: string) {
try {
await navigator.clipboard.writeText(address);
showCopyToast.value = 1;
setTimeout(() => {
showCopyToast.value = 0;
}, 1000);
} catch (err) {
showCopyToast.value = 2;
setTimeout(() => {
showCopyToast.value = 0;
}, 1000);
}
}
const tipMsg = computed(() => {
return showCopyToast.value === 2
? { class: 'error', msg: 'Copy Error!' }
: { class: 'success', msg: 'Copy Success!' };
});
const addressChange = computed(() => {
return walletStore?.currentAddress || walletStore?.walletIsConnected
? true
: false;
});
</script> </script>
<template> <template>
@ -12,7 +38,9 @@ walletStore.$subscribe((m, s) => {
v-show="walletStore.currentAddress" v-show="walletStore.currentAddress"
class="dropdown dropdown-hover dropdown-end" class="dropdown dropdown-hover dropdown-end"
> >
<label tabindex="0" class="btn btn-sm m-1 lowercase">{{ walletStore.shortAddress }}</label> <label tabindex="0" class="btn btn-sm m-1 lowercase">{{
walletStore.shortAddress
}}</label>
<div <div
tabindex="0" tabindex="0"
class="dropdown-content menu shadow p-2 bg-base-100 rounded w-64 overflow-auto" class="dropdown-content menu shadow p-2 bg-base-100 rounded w-64 overflow-auto"
@ -24,9 +52,22 @@ walletStore.$subscribe((m, s) => {
<a <a
class="block py-2 px-2 hover:bg-gray-100 dark:hover:bg-[#353f5a] rounded cursor-pointer" class="block py-2 px-2 hover:bg-gray-100 dark:hover:bg-[#353f5a] rounded cursor-pointer"
style="overflow-wrap: anywhere" style="overflow-wrap: anywhere"
@click="copyAdress(walletStore.currentAddress)"
> >
{{ walletStore.currentAddress }} {{ walletStore.currentAddress }}
</a> </a>
<div class="divider mt-1 mb-1"></div>
<RouterLink
class="block py-2 px-2 hover:bg-gray-100 dark:hover:bg-[#353f5a] rounded cursor-pointer"
to="/wallet/accounts"
>Accounts</RouterLink
>
<RouterLink
class="block py-2 px-2 hover:bg-gray-100 dark:hover:bg-[#353f5a] rounded cursor-pointer"
to="/wallet/portfolio"
>Portfolio</RouterLink
>
<div class="divider mt-1 mb-1"></div>
<a <a
class="block py-2 px-2 hover:bg-gray-100 dark:hover:bg-[#353f5a] rounded cursor-pointer" class="block py-2 px-2 hover:bg-gray-100 dark:hover:bg-[#353f5a] rounded cursor-pointer"
@click="walletStore.disconnect()" @click="walletStore.disconnect()"
@ -34,6 +75,20 @@ walletStore.$subscribe((m, s) => {
> >
</div> </div>
</div> </div>
<div class="toast" v-show="showCopyToast === 1">
<div class="alert alert-success">
<div class="text-sm">
<span>{{ tipMsg.msg }}</span>
</div>
</div>
</div>
<div class="toast" v-show="showCopyToast === 2">
<div class="alert alert-error">
<div class="text-sm">
<span>{{ tipMsg.msg }}</span>
</div>
</div>
</div>
</div> </div>
<label <label
v-if="!walletStore?.currentAddress" v-if="!walletStore?.currentAddress"

View File

@ -1,3 +1,11 @@
<script setup lang="ts">
import { useWalletStore } from '@/stores';
const walletStore = useWalletStore();
function walletStateChange(res:any){
console.log(res.detail?.value, 8888888)
walletStore.setConnectedWallet(res.detail?.value)
}
</script>
<template> <template>
<footer class="footer items-center p-4 text-sm mb-4"> <footer class="footer items-center p-4 text-sm mb-4">
<div class="items-center grid-flow-col"> <div class="items-center grid-flow-col">
@ -32,7 +40,7 @@
</div> </div>
</footer> </footer>
<div class="footer-modal"> <div class="footer-modal">
<ping-connect-wallet :chain-id="'juno-1'" :hd-path="`m/44'/118/0'/0/0`" /> <ping-connect-wallet :chain-id="'juno-1'" :hd-path="`m/44'/118/0'/0/0`" @change="walletStateChange"/>
</div> </div>
</template> </template>

View File

@ -3,6 +3,7 @@ import { useBaseStore, useBlockchain } from '@/stores';
import type { Connection, ClientState, Channel } from '@/types'; import type { Connection, ClientState, Channel } from '@/types';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { ref } from 'vue'; import { ref } from 'vue';
import { Icon } from '@iconify/vue';
const props = defineProps(['chain', 'connection_id']); const props = defineProps(['chain', 'connection_id']);
const chainStore = useBlockchain(); const chainStore = useBlockchain();
@ -43,60 +44,92 @@ function color(v: string) {
<div> <div>
<div class="px-4 pt-3 pb-4 bg-base-100 rounded mb-4 shadow py-24 sm:py-32"> <div class="px-4 pt-3 pb-4 bg-base-100 rounded mb-4 shadow py-24 sm:py-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8"> <div class="mx-auto max-w-7xl px-6 lg:px-8">
<dl <dl class="grid grid-cols-1 gap-x-8 text-center lg:grid-cols-3">
class="grid grid-cols-1 gap-x-8 gap-y-16 text-center lg:grid-cols-3" <div class="mx-auto flex items-center">
> <div>
<div class="mx-auto flex max-w-xs flex-col gap-y-4"> <div
<dt class="text-base leading-7 text-gray-600"> class="order-first text-3xl font-semibold tracking-tight text-main mb-1"
{{ conn.client_id }} {{ props.connection_id }} >
</dt> {{ baseStore.latest?.block?.header?.chain_id }}
<dd </div>
class="order-first text-3xl font-semibold tracking-tight text-gray-900 sm:text-5xl" <div class="text-sm text-gray-500 dark:text-gray-400">
> {{ conn.client_id }} {{ props.connection_id }}
{{ baseStore.latest?.block?.header?.chain_id }} </div>
</dd> </div>
</div> </div>
<div class="mx-auto flex max-w-xs flex-col gap-y-4"> <div class="mx-auto flex items-center">
<dt class="text-base leading-7 text-gray-600">{{ conn.state }}</dt> <div>
<dd <Icon icon="mdi:arrow-left-right" class="text-4xl mx-auto" />
class="order-first text-3xl font-semibold tracking-tight text-gray-900 sm:text-5xl" <div
> class="bg-success w-24 h-1 rounded-sm mt-1 mb-3 opacity-60"
&lt;&gt;<VProgressLinear class="w-100" color="success" /> ></div>
</dd> <div class="text-sm text-gray-500 dark:text-gray-400">
{{ conn.state }}
</div>
</div>
</div> </div>
<div class="mx-auto flex max-w-xs flex-col gap-y-4"> <div class="mx-auto">
<dt class="text-base leading-7 text-gray-600"> <div
{{ conn.counterparty?.connection_id }} {{ clientState.client_id }} class="order-first text-3xl font-semibold tracking-tight text-main mb-2"
</dt>
<dd
class="order-first text-3xl font-semibold tracking-tight text-gray-900 sm:text-5xl"
> >
{{ clientState.client_state?.chain_id }} {{ clientState.client_state?.chain_id }}
</dd> </div>
<div class="text-sm text-gray-500 dark:text-gray-400">
{{ conn.counterparty?.connection_id }} {{ clientState.client_id }}
</div>
</div> </div>
</dl> </dl>
</div> </div>
</div> </div>
<div class="bg-base-100 px-4 pt-3 pb-4 rounded mb-4 shadow"> <div class="bg-base-100 px-4 pt-3 pb-4 rounded mb-4 shadow">
<h2 class="card-title">IBC Client State</h2> <h2 class="card-title mb-4">IBC Client State</h2>
<div class="text-sm"> <div class="overflow-x-auto">
<br />update after expiry: <table class="table text-sm w-full">
{{ clientState.client_state?.allow_update_after_expiry }} <tbody>
<br />allow_update_after_misbehaviour: <tr>
{{ clientState.client_state?.allow_update_after_misbehaviour }} <td class="w-52">update after expiry:</td>
<br />trust_level: <td>{{ clientState.client_state?.allow_update_after_expiry }}</td>
{{ clientState.client_state?.trust_level?.numerator }}/{{ </tr>
clientState.client_state?.trust_level?.denominator <tr>
}} <td class="w-52">allow_update_after_misbehaviour:</td>
<br />trusting_period: {{ clientState.client_state?.trusting_period }} <td>{{ clientState.client_state?.allow_update_after_misbehaviour }}</td>
<br />unbonding_period: </tr>
{{ clientState.client_state?.unbonding_period }} <br />frozen_height: <tr>
{{ clientState.client_state?.frozen_height }} <br />latest_height: <td class="w-52">trust_level:</td>
{{ clientState.client_state?.latest_height }} <br />type: <td> {{ clientState.client_state?.trust_level?.numerator }}/{{
{{ clientState.client_state?.['@type'] }} <br />upgrade_path: clientState.client_state?.trust_level?.denominator}}</td>
{{ clientState.client_state?.upgrade_path }} <br /> </tr>
{{ clientState.client_state?.max_clock_drift }} <tr>
<td class="w-52">trusting_period:</td>
<td>{{ clientState.client_state?.trusting_period }}</td>
</tr>
<tr>
<td class="w-52">unbonding_period:</td>
<td> {{ clientState.client_state?.unbonding_period }}</td>
</tr>
<tr>
<td class="w-52">frozen_height:</td>
<td>{{ clientState.client_state?.frozen_height }} </td>
</tr>
<tr>
<td class="w-52">latest_height:</td>
<td>{{ clientState.client_state?.latest_height }}</td>
</tr>
<tr>
<td class="w-52">type:</td>
<td>{{ clientState.client_state?.['@type'] }}</td>
</tr>
<tr>
<td class="w-52">upgrade_path:</td>
<td>{{ clientState.client_state?.upgrade_path }} </td>
</tr>
<tr>
<td class="w-52">max_clock_drift:</td>
<td>{{ clientState.client_state?.max_clock_drift }} </td>
</tr>
</tbody>
</table>
</div> </div>
</div> </div>
@ -106,7 +139,7 @@ function color(v: string) {
<table class="table w-full mt-4"> <table class="table w-full mt-4">
<thead> <thead>
<tr> <tr>
<th style="position: relative; z-index: 2;">Channel Id</th> <th style="position: relative; z-index: 2">Channel Id</th>
<th>Port Id</th> <th>Port Id</th>
<th>Counterparty</th> <th>Counterparty</th>
<th>Hops</th> <th>Hops</th>

View File

@ -25,31 +25,31 @@ function color(v: string) {
<div class="bg-base-100 px-4 pt-3 pb-4 rounded shadow"> <div class="bg-base-100 px-4 pt-3 pb-4 rounded shadow">
<h2 class="card-title">IBC Connections</h2> <h2 class="card-title">IBC Connections</h2>
<div class="overflow-x-auto mt-4"> <div class="overflow-x-auto mt-4">
<table class="table w-full"> <table class="table w-full table-zebra">
<thead> <thead>
<tr> <tr>
<th style="position: relative; z-index: 2;">Connection Id</th> <th class="py-3">Connection Id</th>
<th>Connection</th> <th class="py-3">Connection</th>
<th>Delay Period</th> <th class="py-3">Delay Period</th>
<th>State</th> <th class="py-3">State</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="v in list"> <tr v-for="(v, index) in list" :key="index">
<td> <td class="py-2">
<RouterLink :to="`/${chain}/ibc/${v.id}`">{{ <RouterLink :to="`/${chain}/ibc/${v.id}`" class="text-primary">
v.id {{ v.id }}
}}</RouterLink> </RouterLink>
</td> </td>
<td> <td class="py-2">
{{ v.client_id }} {{ v.id }} <br /> {{ v.client_id }} {{ v.id }} <br />
{{ v.counterparty.client_id }} {{ v.counterparty.client_id }}
{{ v.counterparty.connection_id }} {{ v.counterparty.connection_id }}
</td> </td>
<td>{{ v.delay_period }}</td> <td class="py-2">{{ v.delay_period }}</td>
<td> <td class="py-2">
<div <div
class="text-xs truncate relative py-2 px-4 rounded-full w-fit" class="text-xs truncate relative py-1 px-3 rounded-full w-fit"
:class="`text-${color(v.state)}`" :class="`text-${color(v.state)}`"
> >
<span <span

View File

@ -8,6 +8,7 @@ import {
useFormatter, useFormatter,
useTxDialog, useTxDialog,
useWalletStore, useWalletStore,
useStakingStore,
} from '@/stores'; } from '@/stores';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { useIndexModule } from './indexStore'; import { useIndexModule } from './indexStore';
@ -21,6 +22,7 @@ const store = useIndexModule();
const walletStore = useWalletStore(); const walletStore = useWalletStore();
const format = useFormatter(); const format = useFormatter();
const dialog = useTxDialog(); const dialog = useTxDialog();
const stakingStore = useStakingStore();
const coinInfo = computed(() => { const coinInfo = computed(() => {
return store.coinInfo; return store.coinInfo;
@ -230,7 +232,7 @@ const color = computed(() => {
</div> </div>
<div class="bg-base-100 rounded mt-4 shadow"> <div class="bg-base-100 rounded mt-4 shadow">
<div class="px-4 pt-4 pb-2 text-lg font-semibold text-secondary"> <div class="px-4 pt-4 pb-2 text-lg font-semibold text-main">
Active Proposals Active Proposals
</div> </div>
<div class="px-4 pb-4"> <div class="px-4 pb-4">
@ -242,7 +244,7 @@ const color = computed(() => {
</div> </div>
<div class="bg-base-100 rounded mt-4 shadow"> <div class="bg-base-100 rounded mt-4 shadow">
<div class="px-4 pt-4 pb-2 text-lg font-semibold text-secondary"> <div class="px-4 pt-4 pb-2 text-lg font-semibold text-main">
{{ walletStore.currentAddress || 'Not Connected' }} {{ walletStore.currentAddress || 'Not Connected' }}
<span <span
v-if="walletStore.currentAddress" v-if="walletStore.currentAddress"
@ -293,13 +295,60 @@ const color = computed(() => {
</div> </div>
</div> </div>
<div> <div class="px-4 pb-4">
<div v-for="v in walletStore.delegations"> <table class="table table-compact w-full table-zebra">
{{ v }} <thead>
</div> <tr>
<th>Validator</th>
<th>Delegations</th>
<th>Rewards</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in walletStore.delegations" :key="index">
<td>
{{
format.validatorFromBech32(
item?.delegation?.validator_address
)
}}
</td>
<td>{{ format.formatToken(item?.balance) }}</td>
<td>
{{
format.formatToken({
denom: item?.balance?.denom,
amount: item?.delegation?.shares,
})
}}
</td>
<td>
<div>
<button
class="btn btn-xs btn-primary btn-ghost text-primary rounded-sm mr-2"
>
Delegate
</button>
<button
class="btn btn-xs btn-primary btn-ghost text-primary rounded-sm"
>
Withdraw Rewards
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div> </div>
<div></div> <div class="grid grid-cols-3 gap-4 px-4 pb-6 mt-4">
<button class="btn btn-success text-white">Send</button>
<RouterLink to="/wallet/receive" class="btn btn-info text-white"
>Receive</RouterLink
>
<button class="btn btn-primary text-white">Convert</button>
</div>
</div> </div>
</div> </div>
</template> </template>

View File

@ -73,11 +73,11 @@ onMounted(() => {
<br /><br /> <br /><br />
<VTextarea auto-grow :model-value="state"></VTextarea> <VTextarea auto-grow :model-value="state"></VTextarea>
<br /> <br />
3. Start the daemon: <code>{{ appName }} start</code> 3. Start the daemon: <code class="bg-base-200 text-gray-600 px-2 py-px mx-1 rounded shadow">{{ appName }} start</code>
<br /> <br />
If you are resetting node, run If you are resetting node, run
<code>{{ appName }} unsafe-reset-all</code> or <code class="bg-base-200 text-gray-600 px-2 py-px mx-1 rounded shadow">{{ appName }} unsafe-reset-all</code> or
<code>{{ appName }} tendermint unsafe-reset-all --home ~/.HOME</code> <code class="bg-base-200 text-gray-600 px-2 py-px mx-1 rounded shadow">{{ appName }} tendermint unsafe-reset-all --home ~/.HOME</code>
before you start the daemon. before you start the daemon.
</div> </div>
</div> </div>

View File

@ -0,0 +1,22 @@
<script setup lang="ts">
import { useWalletStore } from '@/stores';
import { useQRCode } from '@vueuse/integrations/useQRCode';
const walletStore = useWalletStore();
const qrcode = useQRCode(walletStore.currentAddress);
</script>
<template>
<div class="bg-base-100 p-4 rounded text-center">
<div class="text-xl font-semibold text-center">Pay Me</div>
<div v-if="walletStore.currentAddress" class="flex items-center justify-center mt-8 mb-4">
<img :src="qrcode" alt="QR Code" class="rounded-sm overflow-hidden" />
</div>
<div class="text-main">
{{ walletStore.currentAddress }}
</div>
<div class="mt-4 mb-4">
<button class="btn btn-success text-white px-10">Go To Pay</button>
</div>
</div>
</template>

View File

@ -6,6 +6,7 @@ import type {
Coin, Coin,
UnbondingResponses, UnbondingResponses,
DelegatorRewards, DelegatorRewards,
WalletConnected,
} from '@/types'; } from '@/types';
import { useStakingStore } from './useStakingStore'; import { useStakingStore } from './useStakingStore';
@ -16,6 +17,7 @@ export const useWalletStore = defineStore('walletStore', {
delegations: [] as Delegation[], delegations: [] as Delegation[],
unbonding: [] as UnbondingResponses[], unbonding: [] as UnbondingResponses[],
rewards: {} as DelegatorRewards, rewards: {} as DelegatorRewards,
walletIsConnected: {} as WalletConnected | null
}; };
}, },
getters: { getters: {
@ -25,9 +27,11 @@ 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
const connected = JSON.parse(localStorage.getItem(key) || '{}'); if (!this.walletIsConnected?.cosmosAddress){
return connected; connected = JSON.parse(localStorage.getItem(key) || '{}');
}
return connected
}, },
balanceOfStakingToken(): Coin { balanceOfStakingToken(): Coin {
const stakingStore = useStakingStore(); const stakingStore = useStakingStore();
@ -80,6 +84,7 @@ export const useWalletStore = defineStore('walletStore', {
} }
}, },
actions: { actions: {
async loadMyAsset() { async loadMyAsset() {
if (!this.currentAddress) return; if (!this.currentAddress) return;
this.blockchain.rpc.getBankBalances(this.currentAddress).then((x) => { this.blockchain.rpc.getBankBalances(this.currentAddress).then((x) => {
@ -115,9 +120,18 @@ export const useWalletStore = defineStore('walletStore', {
disconnect() { disconnect() {
const chainStore = useBlockchain(); const chainStore = useBlockchain();
const key = chainStore.defaultHDPath; const key = chainStore.defaultHDPath;
console.log(key, 'key')
console.log(localStorage.getItem(key))
localStorage.removeItem(key); localStorage.removeItem(key);
this.walletIsConnected = null
this.$reset() this.$reset()
},
setConnectedWallet(value: any) {
const chainStore = useBlockchain();
const key = chainStore.defaultHDPath;
this.walletIsConnected = value || {}
// JSON.parse(localStorage.getItem(key) || '{}');
return this.walletIsConnected
} }
}, },
}); });

View File

@ -1,22 +1,28 @@
import type { Coin, PaginatedResponse } from "./common" import type { Coin, PaginatedResponse } from './common';
export interface DistributionParams { export interface DistributionParams {
params: { params: {
"community_tax": string, community_tax: string;
"base_proposer_reward": string, base_proposer_reward: string;
"bonus_proposer_reward": string, bonus_proposer_reward: string;
"withdraw_addr_enabled": boolean withdraw_addr_enabled: boolean;
} };
} }
export interface DelegatorRewards { export interface DelegatorRewards {
rewards: { rewards: {
validator_address: string, validator_address: string;
reward: Coin[], reward: Coin[];
}[], }[];
total: Coin[], total: Coin[];
} }
export interface PaginatedSlashes extends PaginatedResponse { export interface PaginatedSlashes extends PaginatedResponse {
slashes: any[] slashes: any[];
} }
export interface WalletConnected {
wallet: string;
cosmosAddress: string;
hdPath: string;
}

146
yarn.lock
View File

@ -2701,6 +2701,11 @@
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"
integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
"@types/web-bluetooth@^0.0.17":
version "0.0.17"
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz#5c9f3c617f64a9735d7b72a7cc671e166d900c40"
integrity sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==
"@types/yargs-parser@*": "@types/yargs-parser@*":
version "21.0.0" version "21.0.0"
resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz"
@ -3038,6 +3043,16 @@
find-cache-dir "^3.3.2" find-cache-dir "^3.3.2"
upath "^2.0.1" upath "^2.0.1"
"@vueuse/core@10.1.2":
version "10.1.2"
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.1.2.tgz#2499eadec36c5d7109338e3a2b73725040ae8011"
integrity sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==
dependencies:
"@types/web-bluetooth" "^0.0.17"
"@vueuse/metadata" "10.1.2"
"@vueuse/shared" "10.1.2"
vue-demi ">=0.14.0"
"@vueuse/core@^9.12.0": "@vueuse/core@^9.12.0":
version "9.12.0" version "9.12.0"
resolved "https://registry.npmjs.org/@vueuse/core/-/core-9.12.0.tgz" resolved "https://registry.npmjs.org/@vueuse/core/-/core-9.12.0.tgz"
@ -3048,6 +3063,15 @@
"@vueuse/shared" "9.12.0" "@vueuse/shared" "9.12.0"
vue-demi "*" vue-demi "*"
"@vueuse/integrations@^10.1.2":
version "10.1.2"
resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.1.2.tgz#e318ed2cec87711b2a110dceca2150d7fe1452d0"
integrity sha512-wUpG3Wv6LiWerOwCzOAM0iGhNQ4vfFUTkhj/xQy7TLXduh2M3D8N08aS0KqlxsejY6R8NLxydDIM+68QfHZZ8Q==
dependencies:
"@vueuse/core" "10.1.2"
"@vueuse/shared" "10.1.2"
vue-demi ">=0.14.0"
"@vueuse/math@^9.12.0": "@vueuse/math@^9.12.0":
version "9.12.0" version "9.12.0"
resolved "https://registry.npmjs.org/@vueuse/math/-/math-9.12.0.tgz" resolved "https://registry.npmjs.org/@vueuse/math/-/math-9.12.0.tgz"
@ -3056,11 +3080,23 @@
"@vueuse/shared" "9.12.0" "@vueuse/shared" "9.12.0"
vue-demi "*" vue-demi "*"
"@vueuse/metadata@10.1.2":
version "10.1.2"
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.1.2.tgz#d8ffe557b1042efd03a0aa88540a00c25d193ee3"
integrity sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==
"@vueuse/metadata@9.12.0": "@vueuse/metadata@9.12.0":
version "9.12.0" version "9.12.0"
resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.12.0.tgz" resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.12.0.tgz"
integrity sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ== integrity sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==
"@vueuse/shared@10.1.2":
version "10.1.2"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.1.2.tgz#31d8733a217a6396eb67706319133bf62cdd8baa"
integrity sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==
dependencies:
vue-demi ">=0.14.0"
"@vueuse/shared@9.12.0": "@vueuse/shared@9.12.0":
version "9.12.0" version "9.12.0"
resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-9.12.0.tgz" resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-9.12.0.tgz"
@ -3519,7 +3555,7 @@ camelcase-css@^2.0.1:
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
camelcase@^5.3.1: camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1" version "5.3.1"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
@ -3650,6 +3686,15 @@ cli-width@^2.0.0:
resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz"
integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
cliui@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.0"
wrap-ansi "^6.2.0"
cliui@^8.0.1: cliui@^8.0.1:
version "8.0.1" version "8.0.1"
resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
@ -3982,6 +4027,11 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, d
dependencies: dependencies:
ms "2.1.2" ms "2.1.2"
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
dedent@^0.7.0: dedent@^0.7.0:
version "0.7.0" version "0.7.0"
resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz"
@ -4058,6 +4108,11 @@ diff-sequences@^29.4.3:
resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz"
integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==
dijkstrajs@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23"
integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==
dir-glob@^3.0.1: dir-glob@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
@ -4145,6 +4200,11 @@ emoji-regex@^8.0.0:
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
encode-utf8@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
enhanced-resolve@^4.1.1: enhanced-resolve@^4.1.1:
version "4.5.0" version "4.5.0"
resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz"
@ -4789,7 +4849,7 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-caller-file@^2.0.5: get-caller-file@^2.0.1, get-caller-file@^2.0.5:
version "2.0.5" version "2.0.5"
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@ -6736,10 +6796,10 @@ pify@^3.0.0:
resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"
integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
ping-widget@^0.0.7: ping-widget@^0.0.9:
version "0.0.7" version "0.0.9"
resolved "https://registry.yarnpkg.com/ping-widget/-/ping-widget-0.0.7.tgz#441fdc03d1447a24bffb8233a2f55e734948820b" resolved "https://registry.yarnpkg.com/ping-widget/-/ping-widget-0.0.9.tgz#56de5ee68320a37aadda614008d8c42c4cac39a0"
integrity sha512-LbMBnXZUxh0goJXSyGHkM1kzdShmlHq5836QNGbIZFS6oSoCbKyYtbhVhR0l7BuqHpiYYpXbnUM+SN60yqOHVQ== integrity sha512-HXfH58FBCbuDMD56X1Wsxi4jKRWxWK7TsKYfGcDJPGOFQOreT2WDc6wEZr1pfG5Mjr4SOVJz84xR4S5SptXJqA==
dependencies: dependencies:
"@cosmjs/amino" "^0.30.1" "@cosmjs/amino" "^0.30.1"
"@cosmjs/ledger-amino" "^0.30.1" "@cosmjs/ledger-amino" "^0.30.1"
@ -6787,6 +6847,11 @@ pkg-types@^1.0.1:
mlly "^1.0.0" mlly "^1.0.0"
pathe "^1.0.0" pathe "^1.0.0"
pngjs@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
postcss-calc@^8.2.3: postcss-calc@^8.2.3:
version "8.2.4" version "8.2.4"
resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz"
@ -7183,6 +7248,16 @@ pure-rand@^6.0.0:
resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz" resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz"
integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==
qrcode@^1.5.3:
version "1.5.3"
resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170"
integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==
dependencies:
dijkstrajs "^1.0.1"
encode-utf8 "^1.0.3"
pngjs "^5.0.0"
yargs "^15.3.1"
queue-microtask@^1.2.2: queue-microtask@^1.2.2:
version "1.2.3" version "1.2.3"
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
@ -7326,6 +7401,11 @@ require-directory@^2.1.1:
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
resolve-cwd@^3.0.0: resolve-cwd@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz"
@ -7499,6 +7579,11 @@ semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
sha3@^2.1.1, sha3@^2.1.4: sha3@^2.1.1, sha3@^2.1.4:
version "2.1.4" version "2.1.4"
resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f"
@ -8353,6 +8438,11 @@ vue-demi@*:
resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz" resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz"
integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A== integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==
vue-demi@>=0.14.0:
version "0.14.1"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.1.tgz#1ed9af03a27642762bfed83d8750805302d0398d"
integrity sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ==
vue-eslint-parser@^9.0.0, vue-eslint-parser@^9.0.1: vue-eslint-parser@^9.0.0, vue-eslint-parser@^9.0.1:
version "9.1.0" version "9.1.0"
resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz" resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz"
@ -8526,6 +8616,11 @@ which-collection@^1.0.1:
is-weakmap "^2.0.1" is-weakmap "^2.0.1"
is-weakset "^2.0.1" is-weakset "^2.0.1"
which-module@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
which-typed-array@^1.1.9: which-typed-array@^1.1.9:
version "1.1.9" version "1.1.9"
resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz"
@ -8557,6 +8652,15 @@ word-wrap@^1.2.3:
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0: wrap-ansi@^7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
@ -8597,6 +8701,11 @@ xstream@^11.14.0:
globalthis "^1.0.1" globalthis "^1.0.1"
symbol-observable "^2.0.3" symbol-observable "^2.0.3"
y18n@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
y18n@^5.0.5: y18n@^5.0.5:
version "5.0.8" version "5.0.8"
resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
@ -8636,11 +8745,36 @@ yaml@^2.1.3:
resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz"
integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==
yargs-parser@^18.1.2:
version "18.1.3"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^21.1.1: yargs-parser@^21.1.1:
version "21.1.1" version "21.1.1"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@^15.3.1:
version "15.4.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
dependencies:
cliui "^6.0.0"
decamelize "^1.2.0"
find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^4.2.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^18.1.2"
yargs@^17.3.1: yargs@^17.3.1:
version "17.7.1" version "17.7.1"
resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz"