cosmos-explorer/src/stores/useWalletStore.ts
2023-06-09 12:01:51 +08:00

135 lines
4.0 KiB
TypeScript

import { defineStore } from 'pinia';
import { useBlockchain } from './useBlockchain';
import { fromBech32, toBech32 } from '@cosmjs/encoding';
import type {
Delegation,
Coin,
UnbondingResponses,
DelegatorRewards,
WalletConnected,
} from '@/types';
import { useStakingStore } from './useStakingStore';
import router from '@/router'
export const useWalletStore = defineStore('walletStore', {
state: () => {
return {
balances: [] as Coin[],
delegations: [] as Delegation[],
unbonding: [] as UnbondingResponses[],
rewards: {total: [], rewards: []} as DelegatorRewards,
wallet: {} as WalletConnected
};
},
getters: {
blockchain() {
return useBlockchain();
},
connectedWallet() {
// @ts-ignore
if(this.wallet.cosmosAddress) return this.wallet
const chainStore = useBlockchain();
const key = chainStore.defaultHDPath;
const connected = JSON.parse(localStorage.getItem(key) || '{}');
return connected
},
balanceOfStakingToken(): Coin {
const stakingStore = useStakingStore();
return (
this.balances.find(
(x) => x.denom === stakingStore.params.bond_denom
) || { amount: '0', denom: stakingStore.params.bond_denom }
);
},
stakingAmount() {
const stakingStore = useStakingStore();
let amt = 0;
let denom = stakingStore.params.bond_denom;
this.delegations.forEach((i) => {
amt += Number(i.balance.amount);
denom = i.balance.denom;
});
return { amount: String(amt), denom };
},
rewardAmount() {
const stakingStore = useStakingStore();
// @ts-ignore
const reward = this.rewards.total?.find(
(x: Coin) => x.denom === stakingStore.params.bond_denom
);
return reward || { amount: '0', denom: stakingStore.params.bond_denom };
},
unbondingAmount() {
let amt = 0;
this.unbonding.forEach((i) => {
i.entries.forEach((e) => {
amt += Number(e.balance);
});
});
const stakingStore = useStakingStore();
return { amount: String(amt), denom: stakingStore.params.bond_denom };
},
currentAddress() {
if (!this.connectedWallet?.cosmosAddress) return '';
const { prefix, data } = fromBech32(this.connectedWallet.cosmosAddress);
const chainStore = useBlockchain();
return toBech32(chainStore.current?.bech32Prefix || prefix, data);
},
shortAddress() {
const address: string = this.currentAddress
if(address.length > 4) {
return `${address.substring(address.length -4)}`
}
return ""
}
},
actions: {
async loadMyAsset() {
if (!this.currentAddress) return;
this.blockchain.rpc.getBankBalances(this.currentAddress).then((x) => {
this.balances = x.balances;
});
this.blockchain.rpc
.getStakingDelegations(this.currentAddress)
.then((x) => {
this.delegations = x.delegation_responses;
});
this.blockchain.rpc
.getStakingDelegatorUnbonding(this.currentAddress)
.then((x) => {
this.unbonding = x.unbonding_responses;
});
this.blockchain.rpc
.getDistributionDelegatorRewards(this.currentAddress)
.then((x) => {
this.rewards = x;
});
},
myBalance() {
return this.blockchain.rpc.getBankBalances(this.currentAddress);
},
myDelegations() {
return this.blockchain.rpc.getStakingDelegations(this.currentAddress);
},
myUnbonding() {
return this.blockchain.rpc.getStakingDelegatorUnbonding(
this.currentAddress
);
},
disconnect() {
const chainStore = useBlockchain();
const key = chainStore.defaultHDPath;
localStorage.removeItem(key);
this.$reset()
},
setConnectedWallet(value: WalletConnected) {
if(value) this.wallet = value
},
suggestChain() {
// const router = useRouter()
router.push({path: '/wallet/keplr'})
}
},
});