135 lines
4.0 KiB
TypeScript
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'})
|
|
}
|
|
},
|
|
}); |